Prácticas recomendadas multiplataforma de PowerShell 7

Contenidos

Logotipo de Powershell

Cuando se lanzó PowerShell por primera vez, el objetivo era llevar potentes herramientas de scripting a Windows, que por lo general tenía una administración basada en GUI en ese momento. Desde entonces, PowerShell ha crecido hasta convertirse en uno de los lenguajes de scripting más populares.

Uno de los mayores contribuyentes a este aumento de popularidad es que el equipo de PowerShell de Microsoft lo logró de código abierto en 2016, presentando PowerShell Core para PowerShell versión 6. A pesar de esto, eso causó algunos problemas inesperados, como tener que admitir la compatibilidad entre la versión 5.1 (Windows PowerShell) y la versión 6.2 (PowerShell Core), o tener los mismos cmdlets haciendo cosas ligeramente diferentes en diferentes versiones de .NETO.

Para solucionar eso, el equipo de PowerShell anunció que retiraban PowerShell 5.1 y que la próxima versión después de 6.2 sería PowerShell 7, que tendría como objetivo reemplazar Windows PowerShell en los sistemas operativos Windows sin sacrificar ninguna compatibilidad cuando se ejecuta en Mac o Linux.

PowerShell 7 fue GA en marzo del año pasado, y aún cuando los propios cmdlets se ejecutan en cualquier sistema operativo, aún hay algunas prácticas recomendadas a seguir para asegurarse de que sus scripts de PowerShell se ejecuten sin problemas sin importar dónde se estén ejecutando.

Utilizar nombres de directorio en minúsculas

En el sistema operativo Windows, el o el carácter de barra invertida se utiliza para anotar directorios anidados en un sistema de archivos, mientras que en Linux y macOS, el / o el carácter de barra inclinada hacia adelante lo hace en su lugar y la barra invertida se utiliza como carácter de escape. (Si en algún momento tiene problemas para mantener estos dos rectos, imagínese que se vuelca. La barra invertida cae hacia atrás, la barra inclinada hacia adelante cae hacia adelante)

Esto puede suponer algunos desafíos al realizar secuencias de comandos en la mayoría de los demás lenguajes, pero PowerShell 7 se traducirá en un objeto de directorio y verdaderamente no se preocupan por los caracteres utilizados para dividir la ruta. A pesar de esto, un área en la que puede meterse en problemas es que los sistemas de archivos de Linux y macOS se preocupan por las mayúsculas y tratarán los nombres de directorio en diferentes casos como directorios diferentes.

La mejor práctica aquí es mantener los nombres de los directorios en minúsculas, sin importar la ruta que use. Si es necesario, puede pasar la ruta como una cadena y llamar al ToLower() en él en su código, pero esto solo funcionará si el nombre del directorio ya está en minúsculas.

  kMantenga los nombres de los directorios en minúsculas, independientemente de la ruta que utilice.

No utilice alias

La creación de alias puede ser una magnífica manera de acortar la cantidad de escritura que debe hacer cuando ejecuta PowerShell desde una consola. Es mucho más fácil de escribir ls o cgi que Get-ChildItem inclusive con la finalización de la pestaña. Una vez dicho esto, rara vez es una buena idea utilizar alias en los scripts debido a que hace que el script dependa de tener ese alias configurado donde sea que se ejecute.

Eso es especialmente cierto para los sistemas Linux y macOS. En esas plataformas, en lugar de utilizar un alias para ejecutar otro comando de PowerShell, ejecuta el comando nativo, lo que significa que el objeto de retorno será muy distinto y eso eliminará el resto del script.

ls y Get-ChildItem ejecutándose en Windows 10 frente a Ubuntu Linux

ls y Get-ChildItem ejecutándose en Windows 10 vs Ubuntu Linux.

Algunos comandos como ls Puede que no cambie demasiado, pero con otros como el date comando, PowerShell devuelve un objeto totalmente distinto del comando nativo de Linux, que eliminará cualquier cosa que dependa de la salida más adelante en el código. Inclusive si solo necesita el valor de la cadena en un script de PowerShell, use PowerShell para obtenerlo.

date devuelve un objeto DateTime en Windows y un objeto String en Linux.

date devuelve un objeto DateTime en Windows y un objeto String en Linux.

Utilice una declaración de cambio para establecer el sistema operativo

A veces, dispone de una dependencia sobre la que no puede escribir un script, sin importar qué tipo de trucos use. En esos casos, PowerShell 7 tiene algunas marcas reservadas que regresarán true o false dependiendo del sistema operativo desde el que se esté ejecutando. A modo de ejemplo, $IsMacOS volverá True en macOS y False en cualquier otro sistema operativo, y $IsLinux volverá True no importa en qué distribución de Linux se encuentre.

Además hay un $IsWindows bandera, pero con una gran advertencia: solo devuelve True al ejecutar PowerShell Core o PowerShell 7 en Windows. Nunca se transfirió de nuevo a Windows PowerShell, por lo que solo arrojará un error cuando se ejecute allí.

Tyler Leonhardt, del equipo de PowerShell de Microsoft, ideó una magnífica solución para establecer en qué sistema operativo se encuentra cuando se ejecuta multiplataforma, que es la declaración de cambio que describe aquí.

Excelente solución para determinar en qué sistema operativo se encuentra cuando se ejecuta multiplataforma.

Ahora debería tener una idea de algunas alternativas para escribir sus scripts y módulos de PowerShell 7 para que puedan ejecutarse de manera un poco más fluida entre plataformas. ¡Pruébelos en sus scripts hoy!

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.