Puede que PowerShell 7.1 no parezca que tiene grandes cambios a primera vista, pero hay muchas más cosas en marcha de lo que uno puede esperar. También hay una serie de funciones y herramientas muy útiles que pueden mejorar sus secuencias de comandos y ayudarlo a desarrollar secuencias de comandos aún mejores. PowerShell 7.1 se lanzó el 11/11/2020 y muchos miembros de la comunidad de TI lo están adoptando rápidamente. Este artículo incluye una serie de mejoras y mejoras, pero de ninguna manera es una colección completa de todas las mejoras.
Cambios arquitectónicos
La mayor mejora es la de PowerShell 7.1 que se basa en .NET 5. Esta es una versión importante que continúa el viaje de unificación en el que ha estado .NET con .NET y .NET Core tradicionales. Con .NET 5 se realizan los primeros pasos hacia un núcleo unificado. PowerShell 7.1 aprovecha las numerosas mejoras de rendimiento y de lenguaje.
Módulos principales actualizados y mejoras de carga
PowerShell 7.1 incluye varias actualizaciones del módulo principal. En particular, PSReadLine 2.1.0 ahora incluye IntelliSense predictivo, que es un motor de predicción de sintaxis similar a una concha de pescado. Además, ha habido muchas correcciones en el modo vi y la capacidad adicional de configurar el MaximumHistoryCount
desde un perfil de usuario.
Mejorar WinCompat
carga del módulo, los módulos de PowerShell 7 ahora se tratan con una prioridad más alta. Esto evita la sobrescritura inadvertida de los módulos principales cuando se utiliza el WinCompat
mode para permitir que los módulos no nativos de PowerShell 7 funcionen dentro de la versión actualizada de PowerShell.
Nuevas características del motor
Por supuesto, hay varias funciones básicas nuevas que son útiles. Los tres principales son:
PSNullConditionalOperators
PSUnixStat
- Soporte TLS 1.3
Los operadores condicionales nulos se introdujeron en PowerShell 7, pero como una característica experimental. Esta característica ahora se ha generalizado y se incluye de forma predeterminada en PowerShell 7.1. Hay dos nuevos operadores que están ??
y ??=
.
# This typically replaces an if null statement and will run the output if the value is null.
$Object ?? '$object contains a $null value'
# When the value of the conditional is null then, assign that object to the value on the right of the conditional.
$Object ??= 'This value is assigned on a $null $object'
A continuación, tenemos el PSUnixStat
opción, este archivo indica que ahora se ha sacado de la versión experimental, pero a veces puede seguir apareciendo como experimental. Esta función solo estará disponible en sistemas Linux. Puede averiguar su estado y activar la función haciendo lo siguiente.
# Make sure this feature is enabled, will need to restart the PowerShell session
Get-ExperimentalFeature -Name 'PSUnixFileStat' | Enable-ExperimentalFeature
Esta característica le dará una nueva UnixMode
propiedad que muestra información de Unix stat
mando. Esto es muy útil para aquellos acostumbrados a trabajar con permisos tradicionales de Linux.
Finalmente, la compatibilidad con TLS 1.3 ahora se incluye en varios cmdlets web, como Invoke-RestMethod
y Invoke-WebRequest
. Para aquellos que quieran utilizar las mejoras de rendimiento y seguridad que se incluyen en esta nueva versión de TLS y puedan interactuar con un punto final capaz de eso, esta será una adición muy útil. Si el sitio admite TLS 1.3, el contenido será devuelto y negociado por la nueva versión del protocolo.
Invoke-RestMethod -Uri '<https://mysite.com>' -SslProtocol Tls13
Mejoras adicionales
Hay un puñado de características y mejoras adicionales que ayudan a mejorar la estructura y las habilidades de su script.
- Dentro del entorno de Windows,
Start-Process
ahora, de forma predeterminada, incluirá todas las variables de entorno de la sesión actual. Solo cuando se usa elUseNewEnvironment
Se creará un entorno con nuevas variables de proceso. - los
ForEach-Object -Parallel
El comando ahora reutilizará los espacios de ejecución. Esto mejorará el uso de la memoria y el rendimiento. Para aquellos preocupados porque no se está logrando el máximo aislamiento del espacio de ejecución, el parámetroUseNewRunspace
ahora se incluye para crear un espacio de ejecución completamente nuevo para cada iteración de la tubería. - los
Get-Random
comando ahora incluye elShuffle
parámetro. Esto llevará una colección canalizadaGet-Random
o víaInputObject
y devolver la misma colección pero barajada en orden. - Agregar el parámetro
AsUTC
alGet-Date
mando. Esto simplifica las utilidades de conversión tradicionales necesarias, como con el[DateTime]
objeto. - Implementar el
Stop-Computer
cmdlet para sistemas Linux y macOS. Esto se basa en el binario/sbin/shutdown
estar disponible. Si el sistema operativo es Linux, el argumento que se pasa esnow
y si el sistema operativo es macOS, el argumento que se pasa es-P now
. - Similar a
Stop-Computer
,Restart-Computer
ahora está implementado para sistemas Linux y macOS. Esto usa el binario/sbin/shutdown
y pasa el argumento de-r now
.
Cambios importantes
Finalmente, hay un puñado de cambios importantes. Hay más en la lista, pero estos dos pueden afectar los scripts más que otros.
- El cambio de nombre de
FromUnixTime
aUnixTimeSeconds
sobre elGet-Date
cmdlet para permitir la entrada de tiempo de Unix puede afectar a los scripts que usan esta función y deberán actualizarse. - No envuelva el resultado de la devolución a
PSObject
al convertir ScriptBlock en tipos delegados. Esta es una situación de caso límite cuando se lanza un bloque de script y desea que el tipo de retorno sea el objeto original y no se transmita a un PSObject.
Conclusión
Puede que PowerShell 7.1 no parezca que ha introducido grandes características nuevas, pero hay muchas mejoras incrementales e importantes mejoras en el motor de backend. El ecosistema y el lenguaje de PowerShell continúan mejorando con cada iteración y se está convirtiendo rápidamente en un lenguaje popular y básico para los administradores de sistemas en todas partes.