Compartir a través de


Diferencias de PowerShell en plataformas diferentes de Windows

PowerShell se esfuerza por proporcionar paridad de características en todas las plataformas compatibles. Sin embargo, algunas características se comportan de forma diferente o no están disponibles debido a las diferencias en .NET Core y a diferencias específicas de plataformas. Se realizaron otros cambios para mejorar la interoperabilidad de PowerShell en plataformas que no son de Windows.

.NET Framework frente a .NET Core

PowerShell en Linux y macOS usa .NET Core, un subconjunto de la instancia completa de .NET Framework en Microsoft Windows. Como resultado, los scripts que se ejecutan en Windows pueden no ejecutarse en plataformas que no son de Windows por las diferencias en los marcos.

Para obtener más información sobre los cambios en .NET Core, vea Cambios importantes para la migración desde .NET Framework a .NET Core.

Cambios generales de interoperabilidad de Unix

  • Se ha agregado compatibilidad con el uso global de comandos nativos en plataformas Unix. Esto significa que puede usar caracteres comodín con comandos nativos como ls *.txt.
  • La funcionalidad more respeta el valor $PAGER de Linux y tiene como valor predeterminado less.
  • Se agrega automáticamente un carácter de escape a la barra diagonal inversa final cuando se trabaja con argumentos de comandos nativos.
  • Se ha corregido ConsoleHost para usar NoEcho en plataformas Unix.
  • No agregue la variable de entorno PATHEXT en Unix.
  • Se incluye una página man powershell en el paquete.

Directiva de ejecución

PowerShell omite las directivas de ejecución al ejecutarse en plataformas que no son de Windows. Get-ExecutionPolicy devuelve Unrestricted en Linux y macOS. Set-ExecutionPolicy no hace nada en Linux y macOS.

Distinción de mayúsculas y minúsculas en PowerShell

Históricamente, PowerShell ha distinguido entre mayúsculas y minúsculas de manera uniforme, con algunas excepciones. En los sistemas operativos similares a UNIX, el sistema de archivos mayormente distingue mayúsculas de minúsculas y PowerShell se ajusta al estándar del sistema de archivos.

  • Debe usar las mayúsculas y minúsculas correctas cuando se especifica un nombre de archivo en PowerShell.
  • Si un script intenta cargar un módulo y el nombre del módulo no utiliza las mayúsculas y minúsculas correctamente, no se cargará el módulo. Este comportamiento puede provocar un problema con los scripts existentes si el nombre al que hace referencia el módulo no coincide con las mayúsculas y minúsculas correctas del nombre de archivo real.
  • Aunque los nombres del sistema de archivos distinguen mayúsculas de minúsculas, la finalización con tabulación de los nombres de archivo no distingue mayúsculas de minúsculas. La finalización con tabulación pasa por la lista de nombres mediante coincidencia que no tiene en cuenta las mayúsculas y minúsculas.
  • Get-Help admite la coincidencia de patrones que no distingue mayúsculas de minúsculas en plataformas Unix.
  • Import-Module no distingue mayúsculas de minúsculas cuando se usa con un nombre de archivo para determinar el nombre del módulo.

Compatibilidad del sistema de archivos con Linux y macOS

  • Las rutas de acceso que se asignan a los cmdlets ahora son independientes de la barra diagonal (tanto / como \ funcionan como separadores de directorio)
  • Ahora se respeta la especificación de directorio base de XDG y se usa de forma predeterminada:
    • La ruta de acceso al perfil de Linux/macOS se encuentra en ~/.config/powershell/profile.ps1.
    • La ruta de acceso de almacenamiento del historial se encuentra en ~/.local/share/powershell/PSReadline/ConsoleHost_history.txt.
    • La ruta de acceso del módulo de usuario se encuentra en ~/.local/share/powershell/Modules.
  • Compatibilidad con nombres de archivo y carpeta que contienen el carácter de dos puntos en Unix.
  • Compatibilidad con nombres de script o rutas de acceso completas que tienen comas.
  • Se detecta cuándo se usa el parámetro LiteralPath para suprimir la expansión de caracteres comodín para los cmdlets de navegación.
  • Se ha actualizado Get-ChildItem para que su funcionamiento se parezca más a ls -R de *nix y los comandos nativos DIR /S de Windows. Get-ChildItem ahora devuelve los vínculos simbólicos que se encuentran durante una búsqueda recurrente y no busca en los directorios que esos vínculos tienen como destino.

Extensiones de archivo .PS1

Los scripts de PowerShell deben terminar en .ps1 para que el intérprete sepa cómo cargarlos y ejecutarlos en el proceso actual. La ejecución de los scripts en el proceso actual es el comportamiento habitual esperado de PowerShell. Puede agregar el número mágico #! a un script que no tiene una extensión .ps1, pero esto hace que el script se ejecute en una nueva instancia de PowerShell que impedirá el funcionamiento correcto del script al intercambiar objetos. Este puede ser el comportamiento deseable al ejecutar un script de PowerShell desde Bash u otro shell.

Alias de conveniencia quitados

PowerShell proporciona un conjunto de alias en Windows que se asignan a nombres de comandos de Linux para la comodidad del usuario. En Linux y macOS, se quitaron los "alias de conveniencia" de los comandos básicos ls, cp, mv, rm, cat, man, mount y ps para permitir que el ejecutable nativo se ejecute sin especificar una ruta de acceso.

Registro

En macOS, PowerShell usa las API os_log nativas para registrar información en el sistema de registro unificado de Apple. En Linux, PowerShell usa Syslog, una solución de registro ubicua.

Control de trabajo

En PowerShell en Linux o macOS no hay ninguna compatibilidad de control de trabajo de estilo Unix. Los comandos fg y bg no están disponibles. No obstante, puede usar trabajos de PowerShell que funcionan en todas las plataformas.

Cuando se incluye & al final de una canalización, esta se ejecuta como un trabajo de PowerShell. Cuando una canalización se pasa a segundo plano, se devuelve un objeto de trabajo. Una vez que la canalización se ejecuta como un trabajo, se pueden usar todos los cmdlets *-Job para administrar el trabajo. Las variables (se omiten las específicas del proceso) que se usan en la canalización se copian automáticamente en el trabajo para que funcione Copy-Item $foo $bar &. El trabajo se ejecuta en el directorio actual, en lugar del directorio principal del usuario.

Compatibilidad con la comunicación remota

La comunicación remota de PowerShell (PSRP) mediante WinRM en plataformas Unix requiere NTLM/Negotiate o autenticación básica a través de HTTPS. PSRP en macOS solo admite autenticación básica a través de HTTPS. No se admite la autenticación basada en Kerberos.

PowerShell admite la comunicación remota de PowerShell (PSRP) a través de SSH en todas las plataformas (Windows, Linux y macOS). Para obtener más información, vea Comunicación remota de PowerShell a través de SSH.

Compatibilidad con Just Enough Administration (JEA)

PowerShell en sistemas Linux o macOS no permite la capacidad para crear puntos de conexión de comunicación remota de administración restringida (JEA).

sudo, exec y PowerShell

Dado que PowerShell ejecuta la mayoría de los comandos en la memoria (como Python o Ruby), no puede usar sudo directamente con elementos integrados de PowerShell. Puede ejecutar pwsh desde sudo. Si es necesario ejecutar un cmdlet de PowerShell desde dentro de PowerShell con sudo, por ejemplo, sudo Set-Date 8/18/2016, tendría que usar sudo pwsh Set-Date 8/18/2016.

Módulos incluidos en plataformas que no son de Windows

En las plataformas no Windows, PowerShell incluye los siguientes módulos:

  • Microsoft.PowerShell.Archive
  • Microsoft.PowerShell.Core
  • Microsoft.PowerShell.Host
  • Microsoft.PowerShell.Management
  • Microsoft.PowerShell.Security
  • Microsoft.PowerShell.Utility
  • PackageManagement
  • PowerShellGet
  • PSReadLine
  • ThreadJob

Un gran número de los comandos (cmdlets) normalmente disponibles en PowerShell no lo están en sistemas Linux o macOS. A menudo, estos comandos no se aplican a estas plataformas. Por ejemplo, los comandos para características específicas de Windows, como el registro o los servicios, no están disponibles. Otros comandos, como Set-ExecutionPolicy, están presentes, pero no son funcionales.

Para obtener una lista completa de los módulos y cmdlets, y las plataformas que admiten, vea Historial de versiones de módulos y cmdlets.

Módulos que ya no se incluyen en PowerShell

Por distintas razones de compatibilidad, los módulos a continuación ya no se incluyen en PowerShell.

  • ISE
  • Microsoft.PowerShell.LocalAccounts
  • Microsoft.PowerShell.ODataUtils
  • Microsoft.PowerShell.Operation.Validation
  • PSScheduledJob
  • PSWorkflow
  • PSWorkflowUtility

Los siguientes módulos específicos de Windows no se incluyen en PowerShell para sistemas Linux o macOS.

  • CimCmdlets
  • Microsoft.PowerShell.Diagnostics
  • Microsoft.WSMan.Management
  • PSDiagnostics

Cmdlets no disponibles en plataformas no Windows

Algunos cmdlet se han quitado de PowerShell. Otros no están disponibles o pueden funcionar de forma diferente en plataformas que no son de Windows. Para obtener una lista completa de los cmdlets quitados de PowerShell, vea Cmdlets quitados de PowerShell.

Microsoft.PowerShell.Core

Los cmdlets siguientes no están disponibles en sistemas Linux o macOS:

  • Disable-PSRemoting
  • Enable-PSRemoting
  • Connect-PSSession
  • Disconnect-PSSession
  • Receive-PSSession
  • Get-PSSessionCapability
  • Disable-PSSessionConfiguration
  • Enable-PSSessionConfiguration
  • Get-PSSessionConfiguration
  • Register-PSSessionConfiguration
  • Set-PSSessionConfiguration
  • Unregister-PSSessionConfiguration
  • Test-PSSessionConfigurationFile

El parámetro ShowWindow de Get-Help no está disponible en sistemas diferentes a Windows. PowerShell 7.3 agregó el cmdlet Switch-Process y la función exec para Linux y macOS. Estos comandos no están disponibles en Windows.

Cmdlets de Microsoft.PowerShell.Security

Los cmdlets siguientes no están disponibles en sistemas Linux o macOS:

  • Get-Acl
  • Set-Acl
  • Get-AuthenticodeSignature
  • Set-AuthenticodeSignature
  • New-FileCatalog
  • Test-FileCatalog

Estos cmdlets solo están disponibles a partir de PowerShell 7.1.

  • Get-CmsMessage
  • Protect-CmsMessage
  • Unprotect-CmsMessage

Cmdlets de Microsoft.PowerShell.Management

Los cmdlets siguientes no están disponibles en sistemas Linux y macOS:

  • Rename-Computer
  • Get-ComputerInfo
  • Get-HotFix
  • Clear-RecycleBin
  • Get-Service
  • New-Service
  • Remove-Service
  • Restart-Service
  • Resume-Service
  • Set-Service
  • Start-Service
  • Stop-Service
  • Suspend-Service
  • Set-TimeZone

Los cmdlets siguientes están disponibles con limitaciones:

Get-Clipboard: disponible en Linux pero no admitido en macOS, Set-Clipboard: disponible en PowerShell 7.0+, Restart-Computer: disponible para Linux y macOS en PowerShell 7.1+, Stop-Computer: disponible para Linux y macOS en PowerShell 7.1+

Cmdlets de Microsoft.PowerShell.Utility

Los cmdlets siguientes no están disponibles en sistemas Linux y macOS:

  • Convert-String
  • ConvertFrom-String
  • ConvertFrom-SddlString
  • Out-GridView
  • Out-Printer
  • Show-Command

Alias no disponibles en Linux o macOS

En la tabla siguiente se enumeran los alias disponibles para Windows que no están disponibles en sistemas diferentes de Windows. Estos alias no están disponibles porque el alias entra en conflicto con un comando nativo en esas plataformas.

Alias Cmdlet
ac Add-Content
cat Get-Content
clear Clear-Host
compare Compare-Object
cp Copy-Item
cpp Copy-ItemProperty
diff Compare-Object
kill Stop-Process
ls Get-ChildItem
man help
mount New-PSDrive
mv Move-Item
ps Get-Process
rm Remove-Item
rmdir Remove-Item
sleep Start-Sleep
sort Sort-Object
start Start-Process
tee Tee-Object
write Write-Output

La tabla no incluye alias no disponibles para cmdlets que no existen en plataformas que no son de Windows.

Desired State Configuration (DSC) de PowerShell

A partir de PowerShell 7.2, el módulo PSDesiredStateConfiguration se ha quitado de PowerShell y se ha publicado en la Galería de PowerShell. Para obtener más información, vea el anuncio en el blog del equipo de PowerShell. Para obtener más información sobre el uso de DSC en Linux, vea Introducción a DSC para Linux. DSC v1.1 y v2.x no se admiten en macOS. DSC v3 es compatible con Windows, Linux y macOS, pero todavía está en fase de desarrollo inicial.