Determinar la versión de PowerShell instalada

¿Cómo puedo determinar qué versión de PowerShell está instalada en una computadora y, de hecho, si está instalada?

preguntado el 01 de diciembre de 09 a las 08:12

20 Respuestas

Utiliza la $PSVersionTable.PSVersion para determinar la versión del motor. Si la variable no existe, es seguro asumir que el motor es la versión 1.0.

Tenga en cuenta que $Host.Version y (Get-Host).Version no son fiables: reflejan solo la versión del host, no el motor. PowerGUI, PowerShellPLUS, etc.son todas aplicaciones de hospedaje, y establecerán la versión del host para reflejar la versión de su producto, lo cual es completamente correcto, pero no lo que está buscando.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1

Respondido el 02 de enero de 20 a las 07:01

@DanielCassidy: dos años tarde en la fiesta, pero "algunas funciones inexplicablemente no están disponibles" podría deberse a que solo se instaló el marco .Net 3.5 Compact en lugar de todo. - david neeley

$PSVersionTable es más confiable y devuelve $ PSVersion. También puedes usar $PSVersionTable.PSVersion. Incluso si está conectado de forma remota a la máquina que ejecuta una versión diferente (invoke-command -computername myRemotePC -Credential foo {$host}), parece que $host solo mostrará la versión más baja que acordaron para serializar. Tiempo $PSVersionTable mostrará la versión verdadera. Espero que ayude a alguien .. - cuervo vulcano

Parece que $ host.Version no es una buena opción ... Si te conectas a una máquina que ejecuta PowerShell 3, obtienes la versión 1.0, ya que RemotingHost parece ser v1. El uso correcto de $ PSVersionTable devuelve 3. - danny tuppeny

@Starfish El comando que se muestra inicia Powershell usando el símbolo del sistema. ¿No se produciría un error en el comando con "powershell not found" si no está instalado? - jpmc26

Tan cansado de volver aquí por esto que simplemente corrí notepad $profile y arrojado function psver { $PSVersionTable; $PSVersionTable.PSVersion } en eso. Una recarga con . $profile y puedo escribir psver en cualquier momento para obtener información detallada sobre la versión y otros detalles. - ADTC

Yo usaría cualquiera de los dos Obtener host or $ PSVersionTable. Como señala Andy Schneider, $PSVersionTable no funciona en la versión 1; fue introducido en la versión 2.

get-host

Name             : ConsoleHost
Version          : 2.0
InstanceId       : d730016e-2875-4b57-9cd6-d32c8b71e18a
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-GB
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

$PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.4200
BuildVersion                   6.0.6002.18111
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

Respondido el 02 de junio de 18 a las 19:06

¡gracias! NB: En mi XP donde actualicé manualmente desde v1 Powershell, la carpeta real y las rutas de registro (¿engañosamente?) Hacen referencia a v1 NO a v2. Esto es como lo especifican otros aquí, pero era la razón por la que estaba tan preocupado si lo había instalado. Mi camino es; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0 - annetheagile

Si $ psversiontable no existe, es completamente seguro asumir que estás en la v1.0, y listo, eso también responde a tu pregunta. $host.version no es confiable; por ejemplo, en powergui, devuelve la versión del host powergui que no es la misma que la versión del motor powershell (que es lo que se desea). XxNUMXn

La respuesta aceptada dice "... $ Host.Version y (Get-Host) .Version no son confiables; solo reflejan la versión del host, no el motor". - Pedro Mortensen

Puedes mirar la variable incorporada, $psversiontable. Si no existe, tiene V1. Si existe, le dará toda la información que necesita.

1 >  $psversiontable

Name                           Value                                           
----                           -----                                           
CLRVersion                     2.0.50727.4927                                  
BuildVersion                   6.1.7600.16385                                  
PSVersion                      2.0                                             
WSManStackVersion              2.0                                             
PSCompatibleVersions           {1.0, 2.0}                                      
SerializationVersion           1.1.0.1                                         
PSRemotingProtocolVersion      2.1    

Respondido el 02 de junio de 18 a las 19:06

Para determinar si PowerShell está instalado, puede verificar en el registro la existencia de

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

y

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

y, si existe, si el valor es 1 (para instalado), como se detalla en la publicación del blog Compruebe si PowerShell está instalado y la versión.

Para determinar la versión de PowerShell que está instalada, puede verificar las claves de registro

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

y

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

Para determinar la versión de PowerShell que se instala desde un script .ps1, puede usar el siguiente resumen, como se detalla en PowerShell.com en ¿Qué versión de PowerShell estoy ejecutando?.

$isV2 = test-path variable:\psversiontable

El mismo sitio también ofrece una función para devolver la versión:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}

Respondido el 14 de diciembre de 15 a las 00:12

Útil porque en un servidor Windows 2003 no pude encontrar la entrada del menú de inicio para PowerShell (estaba allí, pero no era obvio), pero la clave de registro respondió a mi pregunta. - Desarrollador holístico

Para PowerScript 3.0 parece haber una nueva entrada, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (además de HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1). En este caso, el lugar adecuado para obtener la versión parece ser HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (el valor de muestra es "3.0"). - Pedro Mortensen

Puede verificar directamente la versión con una sola línea invocando PowerShell externamente, como desde el símbolo del sistema

powershell -Command "$PSVersionTable.PSVersion"

Según @psaul puede en realidad, tiene un comando que es independiente de su procedencia (CMD, PowerShell o Pwsh). Gracias por eso.

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"

Lo probé y funcionó perfectamente tanto en CMD como en PowerShell.

Imagen

Respondido 10 Jul 19, 15:07

Recibo este error horrible con ese intento: "System.Collections.Hashtable.PSVersion: El término 'System.Collections.Hashtable.PSVersion' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable. ortografía del nombre, o si se incluyó una ruta, verifique que la ruta sea correcta y vuelva a intentarlo. ". Así que no siempre funciona Gonmator

Me alegra que lo hayas señalado, ya que es bueno conocer los casos de esquina, pero supongo que todavía funciona para la mayoría de las personas. - Patrick bardo

@Gonmator uno pensaría que PowerShell se comportaría de la misma manera con este comando, pero desafortunadamente no es así. Intenté arreglar la sintaxis para que funcionara de forma agnóstica entre cmd y powershell en vano. Yo también habría esperado el mismo comportamiento. :) - tresf

@tresf (y @Gonmator) PUEDE ejecutar esto de forma independiente desde CMD, PowerShell o incluso Pwsh (PS 6.0), pero debe usar este formulario: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (eso trabajar en todos los casos) - Salomón

Probado en mac también. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" Funciona genial. - tresf

Puede verificar que la versión de Windows PowerShell esté instalada completando la siguiente verificación:

  1. Haga clic en Inicio, Todos los programas, Accesorios, Windows PowerShell y luego en Windows PowerShell.
  2. En la consola de Windows PowerShell, escriba el siguiente comando en el símbolo del sistema y luego presione ENTRAR:

    Get-Host | Select-Object Version
    

Verá una salida que se ve así:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/

respondido 05 mar '19, 14:03

Supone que PowerShell se instaló con las opciones predeterminadas y que los accesos directos no se eliminaron del menú Inicio. Es mejor utilizar la prueba de registro. - Xaloroso

Creo que si necesita usar PowerShell primero, intente ejecutarlo como estándar, debería estar instalado, luego, si no encuentra el ícono, intente buscarlo, entonces tal vez intente ejecutarlo desde el Símbolo del sistema. No creo que empieces desde el registro. - eclipses

La respuesta aceptada dice "... $ Host.Version y (Get-Host) .Version no son confiables; solo reflejan la versión del host, no el motor". - Pedro Mortensen

El método compatible con versiones posteriores recomendado por Microsoft para verificar si PowerShell está instalado y determinar la versión instalada es mirar dos claves de registro específicas. He reproducido los detalles aquí en caso de que se rompa el enlace.

Según la página vinculada:

Dependiendo de cualquier otra clave de registro, o versión de PowerShell.exe o la ubicación de PowerShell.exe, no se garantiza que funcione a largo plazo.

Para verificar si cualquier versión de PowerShell está instalado, verifique el siguiente valor en el registro:

  • Ubicación clave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Nombre del valor: Instalar
  • Tipo de valor: REG_DWORD
  • Datos del valor: 0x00000001 (1

Verificar ya sea la versión 1.0 o 2.0 de PowerShell está instalado, verifique el siguiente valor en el registro:

  • Ubicación clave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nombre de valor: PowerShellVersion
  • Tipo de valor: REG_SZ
  • Datos del valor: <1.0 | 2.0>

Respondido el 17 de junio de 13 a las 08:06

Para PowerShell 3.0, parece haber uno nuevo, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3. - Pedro Mortensen

Encontré la forma más fácil de verificar si estaba instalado:

  • ejecutar un símbolo del sistema (Inicio, Ejecutar, cmd, entonces OK)
  • tipo powershell luego presione regresar. A continuación, debería obtener el PowerShell PS rápido:

C:\Users\MyUser>powershell

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\MyUser>

Luego puede verificar la versión desde el indicador de PowerShell escribiendo $PSVersionTable.PSVersion:

PS C:\Users\MyUser> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

PS C:\Users\MyUser>

Tipo exit si desea volver al símbolo del sistema (exit nuevamente si también desea cerrar el símbolo del sistema).

Para ejecutar scripts, consulte http://ss64.com/ps/syntax-run.html.

respondido 04 nov., 14:10

Como por la respuesta aceptada esto no devuelve nada para PowerShell 1.0. El método de registro es más explícito. - Pedro Mortensen

Si powershell no estaba en la ruta, esta versión dará una falsa impresión de que no está instalada. El método de registro proporciona información completa. Presencia y versión. - Xaloroso

$host.version es simplemente incorrecto / poco confiable. Esto le da la versión del ejecutable de alojamiento (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe, etc.) y no la versión del motor en sí.

La versión del motor está contenida en $psversiontable.psversion. Para PowerShell 1.0, esta variable no existe, por lo que, obviamente, si esta variable no está disponible, es completamente seguro asumir que el motor es 1.0, obviamente.

Respondido 26 ago 13, 15:08

Uso:

$psVersion = $PSVersionTable.PSVersion
If ($psVersion)
{
    #PowerShell Version Mapping
    $psVersionMappings = @()
    $psVersionMappings += New-Object PSObject -Property @{Name='5.1.14393.0';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows 10 Anniversary Update'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.1.14300.1000';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows Server 2016 Technical Preview 5'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.494';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3172985 1607'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.122';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3140743 1603'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.117';FriendlyName='Windows PowerShell 5 RTM 1602';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.63';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3135173 1602'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.51';FriendlyName='Windows PowerShell 5 RTM 1512';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10514.6';FriendlyName='Windows PowerShell 5 Production Preview 1508';ApplicableOS='Windows Server 2012 R2'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.10018.0';FriendlyName='Windows PowerShell 5 Preview 1502';ApplicableOS='Windows Server 2012 R2'}
    $psVersionMappings += New-Object PSObject -Property @{Name='5.0.9883.0';FriendlyName='Windows PowerShell 5 Preview November 2014';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows 8.1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='4.0';FriendlyName='Windows PowerShell 4 RTM';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='3.0';FriendlyName='Windows PowerShell 3 RTM';ApplicableOS='Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8, and Windows 7 SP1'}
    $psVersionMappings += New-Object PSObject -Property @{Name='2.0';FriendlyName='Windows PowerShell 2 RTM';ApplicableOS='Windows Server 2008 R2 SP1 and Windows 7'}
    foreach ($psVersionMapping in $psVersionMappings)
    {
        If ($psVersion -ge $psVersionMapping.Name) {
            @{CurrentVersion=$psVersion;FriendlyName=$psVersionMapping.FriendlyName;ApplicableOS=$psVersionMapping.ApplicableOS}
            Break
        }
    }
}
Else{
    @{CurrentVersion='1.0';FriendlyName='Windows PowerShell 1 RTM';ApplicableOS='Windows Server 2008, Windows Server 2003, Windows Vista, Windows XP'}
}

Puede descargar el script detallado desde Cómo determinar la versión instalada de PowerShell.

respondido 04 mar '17, 09:03

La forma más fácil de olvidar esta página y nunca volver a ella es aprender Get-Variable:

Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}

No es necesario recordar todas las variables. Sólo Get-Variable es suficiente (y "Debería haber algo sobre la versión").

Respondido el 03 de enero de 17 a las 09:01

Que es lo mismo que $PSVersionTable - orad

¿Busca la versión PS? escriba $ PSVersion [tab] [enter]. Hecho. No necesito recordar nada :) - orad

esto realmente solo es útil si uno está muy familiarizado con los trucos de tubería que se utilizan. De ninguna manera un principiante podrá recordar que toda esa sintaxis es más fácil que simplemente recordar $ PSVersionTable - José Gabriel

Chicos, Get-Variable funciona bien solo (si todo lo que necesitan es solo para obtener la versión), canalizar allí es solo una broma :) Tampoco recuerdo la sintaxis de canalizar. - Pokrovskij romano

Para comprobar si PowerShell está instalado, utilice:

HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )

Para comprobar si RC2 o RTM está instalado, utilice:

HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM

Fuente: este sitio web.

respondido 19 mar '13, 14:03

Dado que la respuesta más útil no abordó el si existe porción, pensé en darle una versión a través de una solución rápida y sucia. Se basa en que PowerShell esté en el camino Variable ambiental que es probablemente lo que quieres. (La punta del sombrero a la respuesta superior, ya que no sabía eso). Pegue esto en un texto archivar y nombrarlo

Prueba Powershell Version.cmd

o similar.

@echo off
echo Checking powershell version...
del "%temp%\PSVers.txt" 2>nul
powershell -command "[string]$PSVersionTable.PSVersion.Major +'.'+ [string]$PSVersionTable.PSVersion.Minor | Out-File ([string](cat env:\temp) + '\PSVers.txt')" 2>nul
if errorlevel 1 (
 echo Powershell is not installed. Please install it from download.Microsoft.com; thanks.
) else (
 echo You have installed Powershell version:
 type "%temp%\PSVers.txt"
 del "%temp%\PSVers.txt" 2>nul
)
timeout 15

Respondido el 30 de junio de 14 a las 13:06

El siguiente cmdlet devolverá la versión de PowerShell.

$PSVersionTable.PSVersion.Major

respondido 04 mar '17, 09:03

$PSVersionTable es una variable automática; un objeto. No es un cmdlet. - Maximiliano Burszley

Necesitaba verificar la versión de PowerShell y luego ejecutar el código apropiado. Algunos de nuestros servidores ejecutan v5 y otros v4. Esto significa que algunas funciones, como comprimir, pueden estar disponibles o no.

Esta es mi solución:

if ($PSVersionTable.PSVersion.Major -eq 5) {
    #Execute code available in PowerShell 5, like Compress
    Write-Host "You are running PowerShell version 5"
}
else {
    #Use a different process
    Write-Host "This is version $PSVersionTable.PSVersion.Major"
}

Respondido 10 Jul 19, 15:07

Este es el resultado de búsqueda superior para "El archivo por lotes obtiene la versión de powershell", por lo que me gustaría proporcionar un ejemplo básico de cómo hacer un flujo condicional en un archivo por lotes según la versión de PowerShell

Ejemplo genérico

powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
    echo Do some fancy stuff that only powershell v5 or higher supports
) else (
    echo Functionality not support by current powershell version.
)

Ejemplo del mundo real

powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
    rem Unzip archive automatically
    powershell Expand-Archive Compressed.zip
) else (
    rem Make the user unzip, because lazy
    echo Please unzip Compressed.zip prior to continuing...
    pause
)

Respondido 08 ago 19, 21:08

Amo la premisa de esto. Nunca pensé en devolver un valor "sin error" de esta manera como código de salida. Lo único que me preocuparía aquí es qué% errorlevel% podría ser cuando algo inesperado sale mal, como que PowerShell no está en el camino, o $PSVersionTable.PSVersion.Major no se puede resolver (lo que sucedería en PS v1), etc.? - BuvinJ

Sí, buen punto. Esta solución es ciertamente ingenua en ese aspecto. En nuestra organización, estábamos seguros de que solo estaban en juego las versiones 4 y 5. - Derpy

También puede llamar al comando "host" desde la línea de comandos de PowerShell. Debería darte el valor de la $host variable.

Respondido el 30 de junio de 14 a las 10:06

Esto es semi-incorrecto. host resuelve a Get-Host. Independientemente, no es una forma confiable de obtener la versión. - Maximiliano Burszley

He creado un pequeño script por lotes que puede determinar la versión de PowerShell:

@echo off
for /f "tokens=2 delims=:" %%a in ('powershell -Command Get-Host ^| findstr /c:Version') do (echo %%a)

Esto simplemente extrae la versión de PowerShell usando Get-Host y busca la cadena Version

Cuando se encuentra la línea con la versión, utiliza el for comando para extraer la versión. En este caso estamos diciendo que el delimitador son dos puntos y buscamos a continuación los primeros dos puntos, resultando en mi caso 5.1.18362.752.

Respondido el 10 de junio de 20 a las 16:06

Ampliando la respuesta con un operador selecto:

Get-Host | select {$_.Version}

respondido 04 mar '16, 21:03

La respuesta aceptada dice "... $ Host.Version y (Get-Host) .Version no son confiables; solo reflejan la versión del host, no el motor". - Pedro Mortensen

@PeterMortensen parece que mi respuesta fue antes de la respuesta aceptada: HaBo

@HaBo ¿Qué estás mirando? La respuesta aceptada es de 2009. - tylerh

@TylerH ¿y qué? No estoy siguiendo tu pregunta. mi respuesta dice claramente que es una extensión de la respuesta aceptada. es una versión simplificada. - HaBo

@HaBo Su comentario anterior se lee como si estuviera justificando su respuesta por el hecho de que fue publicado antes de la respuesta aceptada, lo cual no es en absoluto el caso. Su respuesta se publicó 7 años después de la respuesta aceptada, y 6 años después de la respuesta, la suya realmente 'se extiende'; hablando de eso, su respuesta no dice claramente que sea una extensión del aceptado respuesta (que ni siquiera usa Get-Host). - tylerh

Probé esto en version 7.1.0 Y funcionó:

$PSVersionTable | Select-Object PSVersion

Salida

PSVersion
---------
7.1.0

No funciona en version 5.1 Sin embargo, mejor opte por esto en las versiones inferiores a 7:

$PSVersionTable.PSVersion

Salida

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      18362  1171

Respondido el 12 de enero de 21 a las 22:01

Esto parece simplemente repetir información ya compartida en múltiples respuestas. Solo agregue nuevas respuestas cuando haya Un nuevo información. - tylerh

@TylerH, ¿te importaría indicarme una respuesta con PowerShell 7? Escaneando, la última respuesta antes de la mía fue en 2016 y la v7.1 es bastante nueva. - daniel dut

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.