PowerShell y la gestión de versiones

Introducción

La llegada de Satya Nadella como CEO de Microsoft Corporation en 2014 cambió la filosofía general de la empresa. Como resultado, el mundo libre, que incluye a Linux, es visto ahora como un aliado.

Como resultado, Microsoft ha creado una serie de proyectos de código abierto, pero también ha participado en proyectos ya existentes. Entre ellos figuran una versión multiplataforma del framework .NET, SQL Server para Linux, un intérprete de comandos Bash para Windows, Visual Studio multiplataforma y, sobre todo, PowerShell multiplataforma.

También se han firmado asociaciones con empresas que trabajan en proyectos que giran en torno al mundo libre. La razón principal es sencilla: Azure. En efecto, Microsoft tiene todo el interés en integrar y ofrecer el mayor número posible de tecnologías en su plataforma en la nube.

Más tarde (junio de 2018), para mostrar su cada vez mayor implicación en el mundo del código abierto, Microsoft compró la plataforma GitHub.

Las fuentes de PowerShell, por su parte, pasaron a ser de código abierto y multiplataforma en 2016. En aquel momento, esta versión de PowerShell se llamaba PowerShell Core, numerada 6.0, basada en la multiplataforma .NET Core mencionada anteriormente.

1. Las versiones en detalle

En el momento de escribir estas líneas, nos encontramos en la versión 7.2 de PowerShell Core. Pero...

Instalación de PowerShell Core

Sabemos que los entornos Windows tienen su versión de Windows PowerShell por defecto (1.0-5.1). ¿Qué ocurre cuando deseamos instalar PowerShell Core en nuestro sistema?

El procedimiento varía en función del sistema de destino.

Aquí cubriremos una instalación en Windows 10 y Debian 11.

1. Descarga del código fuente de GitHub

Como ya se ha mencionado, el código fuente de PowerShell Core está disponible en GitHub. Una sección también le indica cómo recuperar los paquetes de instalación de PowerShell Core: https://github.com/PowerShell/PowerShell#get-powershell

Para Windows, puede descargar el paquete MSI. Para Linux, puede descargar el paquete correspondiente al sistema que esté utilizando: Ubuntu, Debian (.deb), Red Hat o CentOS (.rpm).

 En la página web que aparece en el enlace anterior, haga clic en la versión que necesite:

Images/01EI01.png

La columna Downloads (stable) se refiere a la versión actual de PowerShell Core.

2. Instalación en Windows

 Una vez descargado el paquete MSI, inicie la instalación haciendo doble clic en él.

La instalación puede personalizarse de varias maneras. Está, por supuesto, la carpeta de instalación, que por defecto es Program Files. Pero también hay otras opciones más interesantes:

Images/01EI02.png
  • Add PowerShell to Path Environment Variable: la carpeta de instalación de PowerShell...

Gestión de actualizaciones

Cuando hay una nueva versión de PowerShell Core disponible, aparece un mensaje al iniciar la consola:

Images/01EI06.png

Ejemplo aquí con la versión 7.2.1 para una actualización a 7.2.3

El procedimiento varía en función del sistema.

1. En Windows

Para Windows, puede descargar la nueva versión directamente desde GitHub y, a continuación, ejecutar el archivo MSI (el mismo proceso que en la fase de instalación).

Alternativamente, si marcó las opciones Enable updating PowerSHell through Microsoft Update or WSUS y Use Microsoft Update when I check for updates durante la instalación anterior, PowerShell se actualizará como el resto de actualizaciones de Windows, a través del cliente Windows Update.

2. En Linux

Para Linux, si se ha instalado como se ha descrito anteriormente, utilizando el repositorio de Microsoft y la utilidad apt, se puede actualizar como para cualquier paquete:

sudo apt update && sudo apt upgrade 

Novedades, depreciaciones y limitaciones de PowerShell 7

PowerShell Core, como cualquier actualización de una versión de software, viene con su parte de nuevas características y depreciaciones. A continuación, se ofrece una lista no exhaustiva de los cambios introducidos por esta versión de PowerShell. Esto permitirá una adaptación inicial del código de Windows PowerShell a PowerShell Core.

Cada capítulo destacará los casos en los que la funcionalidad depende de una versión específica de PowerShell.

1. Novedades

PowerShell Core aporta una serie de nuevas e interesantes funciones que le harán más productivo en su uso cotidiano de PowerShell.

SSH

Desde PowerShell Core 6.x, se ha integrado el protocolo SSH para facilitar la comunicación entre sistemas Unix y Windows. Ahora es posible utilizar el parámetro -SSHTransport en los comandos Enter-PSSession, New-PSSession e Invoke-Command.

Este punto se trata con más detalle en el capítulo Gestión remota avanzada.

Operador ternario

El operador ternario se ha implementado en PowerShell 7.0. Se basa en la sintaxis del operador ternario de C#: <condición>? <ejecutar si es verdadero> : <ejecutar si es falso>.

Ejemplo

PS > $PSVersionTable.PSversion.Major -gt '7' ? PS7' : 'PS5  
PS7 

Para más información sobre el operador ternario, consulte la sección de ayuda about_If.

Operadores de condición nula

Existen cuatro operadores de condición nula: ? ??=, ?. y ?[] que realizarán diferentes acciones dependiendo de si lo que está a su izquierda tiene o no un valor nulo:

  • ??: este operador devuelve lo que hay a la derecha si el valor de la izquierda es cero.

Ejemplo

PS > $null ?? 100  
100  
PS >...

Desarrollo en PowerShell con Visual Studio Code

En Windows, Windows PowerShell ISE le permite diseñar scripts PowerShell. Tiene un valor incalculable, especialmente con sus snippets y otros add-ons como ISESteroids. Sin embargo, se basa en una interfaz gráfica WPF, y .NET Core no admite interfaces WPF en Linux. Entonces, ¿cómo aprovechar una interfaz tan práctica como PowerShell ISE para desarrollar scripts en este OS? Afortunadamente, un año antes de que se anunciara PowerShell Core, el equipo de Visual Studio lanzó una nueva interfaz de desarrollo de código abierto: Visual Studio Code (VSCode).

Además de ser ligero y fluido, es multiplataforma, por lo que puede instalarse en Windows, Linux y macOS. Otra característica de Visual Studio Code es su modularidad. Al igual que ISE, puede ampliarse para interpretar nuevos lenguajes o extender su funcionalidad. Así que, en lugar de empezar de nuevo con un nuevo IDE, el equipo de PowerShell optó por invertir en la creación de una extensión de PowerShell en VSCode.

1. Instalación de Visual Studio Code

Visual Studio Code se instala de forma diferente en los distintos sistemas operativos. 

 Para descargar la versión correcta, vaya a https://code.visualstudio.com/Downloady haga su elección.

Images/01EI19.png

Página de descarga de Visual Studio Code

Para facilitar que VSCode reconozca el entorno PowerShell Core, asumimos que PowerShell Core ya está instalado en los distintos entornos.

2. La interfaz de Visual Studio Code

VSCode ha sido diseñado para integrar de forma nativa la gestión de repositorios Git, independientemente del proveedor (GitHub, GitLab, etc.). El único requisito es que instale el cliente Git en su estación de trabajo. Este paso no se cubre aquí, pero si busca más información sobre el tema, puede ir a esta dirección: https://git-scm.com/downloads

A la izquierda de la interfaz VSCode, en una cinta vertical, hay cinco herramientas disponibles. De arriba a abajo, son:

  • un explorador de carpetas. Muestra todo el árbol de carpetas y archivos del espacio de trabajo;

  • una potente herramienta de búsqueda. Busca en todos los archivos del espacio de trabajo;

  • una interfaz de gestión Git (que requiere la instalación del cliente Git);

  • un depurador;

  • un gestor de extensiones.

Hay un sexto elemento, en forma de rueda...

Scripts en función del entorno

Dado que los scripts están pensados para ser utilizados en diferentes plataformas, es lógico preguntarse cómo se sabe en qué sistema se está. Para ello, PowerShell Core tiene variables automáticas: $IsLinux, $IsWindows, $IsMacOs.

Ejemplo de uso en Windows

PS C:\Program Files\PowerShell\7> $IsLinux   
False   
PS C:\Program Files\PowerShell\7> $IsWindows   
True   
PS C:\Program Files\PowerShell\7> $IsMacOS   
False 

Ejemplo de uso en Linux

PS /root> $IsLinux   
True   
PS /root> $IsWindows   
False   
PS /root> $IsMacOS   
False 

Entonces es posible escribir una función de este tipo

function Get-OSInfo {   
       if($IsLinux){   
                uname -a   
        }elseif($IsWindows){   
                Get-CimInstance -ClassName Cim_OperatingSystem   
        }   
} 

Resultado en Windows

PS C:\Program Files\PowerShell\7> Get-OSInfo   ...

Funciones experimentales

Las funciones experimentales, como su nombre indica, son funciones que aún se están diseñando. Sin embargo, su desarrollo permite probarlas sin necesidad de utilizar una versión previewde PowerShell Core. Las funciones experimentales no se incluyen en Windows PowerShell.

Por supuesto, se recomienda encarecidamente evitar su uso en un entorno de producción. Estas características pueden conducir a BreakingChanges. Estos cambiarán radicalmente el comportamiento de PowerShell y por lo tanto interrumpirán las secuencias de comandos que ya tiene en su lugar.

Para obtener una lista de las funciones experimentales disponibles, utilice el comando Get-ExperimentalFeature:

PS > Get-ExperimentalFeature  
  
Name                           Enabled Source   Description  
----                           ------- ------   -----------  
PSAnsiRenderingFileInfo          False PSEngine Enable coloring ...  
PSCommandNotFoundSuggestion      False PSEngine Recommend poten ...  ...