Diferencias de PowerShell en plataformas diferentes de Windows

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

.NET Framework frente a .NET Core

PowerShell en Linux y macOS usa .NET Core, que es 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 agregues la variable de entorno PATHEXT en Unix
  • Se incluye una página man powershell en el paquete

Directiva de ejecución

El parámetro -ExecutionPolicy se omite al ejecutar PowerShell en plataformas no 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.

  • Al especificar un archivo en PowerShell, deben usarse las mayúsculas y minúsculas correctas.
  • 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. Esto puede provocar un problema con los scripts existentes si el nombre por el que se hace referencia al 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 usa 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 separador 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 -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. El número mágico #! se puede agregar 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 correcto funcionamiento 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

En Windows, PowerShell proporciona un conjunto de alias que se asignan a nombres de comandos de Linux para la comodidad del usuario. En Linux y macOS, se han quitado 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. 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 también 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, macOS y Linux). Para obtener más información, vea Comunicación remota de PowerShell a través de SSH.

Compatibilidad con Just Enough Administration (JEA)

La capacidad para crear puntos de conexión de comunicación remota de administración restringida (JEA) no está disponible en PowerShell en sistemas Linux o macOS.

sudo, exec y PowerShell

Dado que PowerShell ejecuta la mayoría de los comandos en la memoria (como Python o Ruby), no puedes usar sudo directamente con elementos integrados de PowerShell. Sí puedes 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ías que sudo pwsh Set-Date 8/18/2016.

Cmdlets que faltan

Un gran número de los comandos (cmdlets) normalmente disponibles en PowerShell no lo están en sistemas Linux o macOS. En muchos casos, estos comandos no tienen sentido en estas plataformas (p. ej., características específicas de Windows como el registro). Otros comandos, como los de control de servicios, sí están presentes, pero no son funcionales. Las versiones futuras pueden corregir estos problemas reparando los cmdlets rotos y agregando nuevos con el tiempo.

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

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
  • PSDesiredStateConfiguration
  • PSReadLine
  • ThreadJob

Sin embargo, algunos cmdlets se han eliminado de PowerShell, y otros no están disponibles o funcionan de forma diferente en sistemas diferentes a Windows. Para obtener una lista completa de los cmdlets quitados de PowerShell, vea Cmdlets quitados de PowerShell.

Microsoft.PowerShell.Core

El parámetro ShowWindow de Get-Help no está disponible en sistemas diferentes a 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:

  • Clear-RecycleBin
  • Get-HotFix

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
  • 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 cmdlet de destino no está disponible o el alias entra en conflicto con un comando nativo en esas plataformas.

Alias Cmdlet
ac Add-Content
cat Get-Content
clear Clear-Host
cnsn Connect-PSSession
compare Compare-Object
cp Copy-Item
cpp Copy-ItemProperty
diff Compare-Object
dnsn Disconnect-PSSession
gsv Get-Service
kill Stop-Process
ls Get-ChildItem
man help
mount New-PSDrive
mv Move-Item
ogv Out-GridView
ps Get-Process
rm Remove-Item
rmdir Remove-Item
sasv Start-Service
shcm Show-Command
sleep Start-Sleep
sort Sort-Object
spsv Stop-Service
start Start-Process
tee Tee-Object
write Write-Output

Desired State Configuration (DSC) de PowerShell

Muchos cmdlets se han quitado del módulo PSDesiredStateConfiguration a partir de PowerShell 6.0. La compatibilidad con DSC en plataformas no Windows es limitada y principalmente experimental. El cmdlet Invoke-DscResource se restauró como característica experimental en PowerShell 7.0.

DSC no se admite en macOS.

Para obtener más información sobre el uso de DSC en Linux, vea Introducción a DSC para Linux.

A partir de PowerShell 7.2, el módulo PSDesiredStateConfiguration se ha eliminado 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.