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 predeterminadoless
. - 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
.
- La ruta de acceso al perfil de Linux/macOS se encuentra en
- 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 als -R
de *nix y los comandos nativosDIR /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.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de