Comprobar las versiones de PowerShell: Mejores prácticas

En PowerShell, hay mil formas de hacer lo mismo (o algo similar). En esta publicación de blog, aprenderás todas las formas de verificar la versión de PowerShell que tienes en equipos locales y remotos. Cubriremos las formas incorrectas y la forma que recomiendo.

Existen sitios web que muestran varias formas de verificar tu versión de PowerShell. Pero ninguno ha compilado una lista completa de todas ellas. Decidí cambiar eso.

Todas estas formas deberían funcionar tanto en Windows PowerShell como en PowerShell Core. Estos métodos también deberían funcionar en las versiones de Windows PowerShell desde la 1.0 hasta PowerShell 7.

Las formas en las que puedes averiguar la versión de PowerShell que estás utilizando son:

  1. La propiedad (Get-Host).Version
  2. La propiedad $host.Version
  3. El registro (solo en Windows PowerShell)
  4. La propiedad $PSVersionTable.PSVersion

Desglosemos todas las formas de encontrar la versión de PowerShell, desde la menos recomendada hasta la más recomendada.

Get-Host

PowerShell tiene un concepto conocido como hosts. Un host es un programa que está hospedando el motor de PowerShell. No es el propio motor de PowerShell. La consola de PowerShell o un editor de código con una terminal integrada son hosts de PowerShell.

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

Si ejecutas (Get-Host).Version, verás que devuelve un número de versión que parece ser la versión del motor de PowerShell. Las apariencias pueden ser engañosas.

A continuación, he ejecutado Get-Host en Windows PowerShell 5.1 y puedes ver que devuelve 5.1.17134.858. Esto parece ser una versión legítima.

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

Sin embargo, a veces cuando ejecutas Get-Host en un terminal integrado, la versión no es la misma. Aunque normalmente, el host representará la misma versión del motor, no necesariamente siempre lo hace.

Verificar la versión de PowerShell a través de Get-Host en computadoras remotas

A pesar de que Get-Host parece devolver la misma versión al ejecutarse en una computadora local, nunca lo hará en computadoras remotas.

Por ejemplo, ejecutemos Get-Host en un servidor remoto de Windows Server 2016 a través de Invoke-Command y veamos qué sucede.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

La última vez que verifiqué, no es posible ejecutar PowerShell v1 en Windows Server 2016.

Confiar en Get-Host es simplemente una mala idea en general.

Verificar la versión de PowerShell con el comando $host.Version

Hacer referencia a $host.Version es otra forma de verificar la versión de PowerShell. La variable $host es una variable automática que devuelve el mismo resultado que Get-Host.

Referencing $host.Version

No hay nada especial acerca de este método. Es simplemente lo mismo que ejecutar Get-Host.

$host.Version en Computadoras Remotas

Verás el mismo comportamiento a través de PowerShell Remoting con $host.Version como si estuvieras ejecutando Get-Host.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

¡Peligro, Will Robinson!

Registro

Si no deseas abrir PowerShell en sí mismo, también puedes verificar el registro. La versión de PowerShell está ubicada bajo un valor en la clave del registro HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine. Esta clave de registro tiene un valor llamado PowerShellVersion al que puedes hacer referencia usando Get-ItemProperty.

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

Puedes ver que esta versión es similar pero no incluye la revisión como lo hacen las otras opciones.

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

Uso de Otras Herramientas

Usar el registro también significa que no necesitas usar PowerShell en absoluto para encontrar la versión. Puedes ejecutar comandos desde el símbolo del sistema o otra herramienta que pueda leer el registro.

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
    PowerShellVersion    REG_SZ    5.1.17134.1

Registro en Computadoras Remotas

El registro es estático y los valores no cambiarán local ni remotamente. Puedes estar seguro de que lo que ves localmente será lo mismo que ves remotamente.

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

Mostrar la misma versión local y remotamente es bueno. Pero tengo una mejor manera de mostrarte usando la variable automática $PSVersionTable.

Verificar la versión de PowerShell mediante el comando $PSVersionTable.PSVersion

El último y método final es referenciar la propiedad PSVersion en la variable automática $PSVersionTable. Este método siempre representará el motor de PowerShell.

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

La variable automática $PSVersionTable es una tabla hash de solo lectura que devuelve información específicamente sobre la versión del motor de PowerShell. Esta variable automática no solo devuelve la versión, sino también PSEdition. Esta propiedad puede ser Core o Escritorio para proporcionar más información sobre la edición de PowerShell que se está ejecutando.

$PSVersionTable output

$PSVersionTable en equipos remotos

Usar la variable automática $PSVersionTable es preciso tanto localmente como de forma remota. Puedes ver a continuación que al envolver $PSVersionTable.PSVersion en un scriptblock y ejecutar ese código en un equipo remoto, devolverá la misma versión.

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

Resumen

En esta publicación de blog, has aprendido todas las formas de verificar la versión de PowerShell tanto local como remotamente. ¡Espero que los primeros métodos te hayan dado una idea de qué formas no utilizar para verificar la versión!

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

Si me he perdido alguna forma, por favor avísame en los comentarios. Estaré encantado de actualizar la publicación y darte crédito.

Source:
https://adamtheautomator.com/powershell-version/