Determinar la versión instalada de PowerShell

2633

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

MagicAndi
fuente

Respuestas:

3586

Use $PSVersionTable.PSVersionpara 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.Versiony (Get-Host).Versionno son confiables: reflejan solo la versión del host, no el motor. PowerGUI, PowerShellPLUS, etc. son aplicaciones de alojamiento y configurarán la versión del host para que refleje 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
usuario156862
fuente
2
@DanielCassidy: dos años de retraso en la fiesta, pero "algunas funciones no están disponibles de manera inexplicable" podría deberse a que solo tiene instalado el .Net 3.5 Compact Framework en lugar de todo.
Dave Neeley
83
$PSVersionTablees 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 $hostque solo mostrará la versión más baja que acordaron para la serialización. Mientras $PSVersionTablemostrará la versión verdadera. Espero que ayude a alguien ...
vulcan raven
16
Parece $ host.Version no es una buena opción ... Si te remotas a una máquina que ejecuta PowerShell 3, obtienes 1.0, ya que RemotingHost parece ser v1. El uso de $ PSVersionTable devuelve correctamente 3.
Danny Tuppeny
25
@Starfish El comando que se muestra inicia Powershell mediante el símbolo del sistema. ¿El comando simplemente no generará un error con "powershell no encontrado" si no está instalado?
jpmc26 12/12/2013
99
Tan cansado de volver aquí por esto que simplemente corrí notepad $profiley me tiré function psver { $PSVersionTable; $PSVersionTable.PSVersion }. Una recarga . $profiley puedo escribir en psvercualquier momento para obtener la información detallada de la versión y otros detalles.
ADTC
434

Me gustaría utilizar ya sea Get-Host o $ PSVersionTable . Como señala Andy Schneider, $PSVersionTableno funciona en la versión 1; Se introdujo 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
Thomas Bratt
fuente
55
¡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 v2. Esto es como otros especifican aquí, pero fue la razón por la que estaba tan preocupado de haberlo instalado. Mi camino es; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile
44
Si $ psversiontable no existe, es completamente seguro asumir que estás en v1.0, y bueno, eso también responde a tu pregunta. $host.versionno es confiable - por ejemplo en PowerGUI, devuelve la versión anfitrión PowerGUI que no es el mismo que la versión del motor powershell (que es lo que se desea.)
x0n
10
La respuesta aceptada dice "... $ Host.Version y (Get-Host) .Version no son confiables: reflejan solo la versión del host, no el motor" .
Peter Mortensen
100

Usted puede mirar en el incorporado en la variable, $psversiontable. Si no existe, tienes 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    
Andy Schneider
fuente
97

Para determinar si PowerShell está instalado, puede verificar 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 la siguiente línea, como se detalla en PowerShell.com en la versión de PowerShell que 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"}
}
MagicAndi
fuente
44
Útil porque en un servidor Windows 2003 no pude encontrar la entrada del menú de inicio de PowerShell (estaba allí pero no era obvio), pero la clave del registro respondió mi pregunta.
Desarrollador holístico el
77
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 ). El lugar adecuado en este caso para obtener la versión parece ser HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (el valor de la muestra es "3.0").
Peter Mortensen
49

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 , en realidad puede tener un comando que sea independiente de su origen (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

Patrick Bard
fuente
Recibo este horrible error 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. Compruebe el deletreando el nombre, o si se incluyó una ruta, verifique que la ruta sea correcta e intente nuevamente ". 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 Bard
@Gonmator uno pensaría que PowerShell se comportaría de la misma manera con este comando, pero desafortunadamente no lo hace. Intenté arreglar la sintaxis para que funcione agnósticamente entre cmdy powershellen vano. Hubiera esperado el mismo comportamiento también. :)
tresf
3
@tresf (y @Gonmator) PUEDES ejecutar esto agnósticamente desde CMD, PowerShell o incluso Pwsh (PS 6.0) pero necesitas usar este formulario: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (eso lo hará trabajo en todos los casos)
PSaul
Probado en mac también. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" Funciona genial.
tresf
38

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

  1. Haga clic en Inicio, haga clic en Todos los programas, haga clic en Accesorios, haga clic en Windows PowerShell y luego haga clic 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 similar a esta:

Version
-------
3.0

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

Eclipses
fuente
1
Asume que powershell se instaló con las opciones predeterminadas y que los accesos directos no se eliminaron del menú Inicio. Es mejor usar la prueba de registro.
Xalorous
Creo que si necesita usar PowerShell primero intenta ejecutarlo como estándar, debería estar instalado, luego, si no encuentra el icono, intenta buscarlo, entonces tal vez intente ejecutarlo desde el Símbolo del sistema. No creo que comiences desde el registro.
Eclipses
66
La respuesta aceptada dice "... $ Host.Version y (Get-Host) .Version no son confiables: reflejan solo la versión del host, no el motor" .
Peter Mortensen
21

El método compatible con reenvío recomendado de 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 hay instalada alguna versión de PowerShell, 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

Para verificar si la versión 1.0 o 2.0 de PowerShell está instalada, 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>
Estrella de mar
fuente
55
Para PowerShell 3.0, parece que hay uno nuevo, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Peter Mortensen
11

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

  • ejecutar un símbolo del sistema (Inicio, Ejecutar, cmd , luego OK)
  • escriba y powershellluego presione regresar. Entonces debería obtener el PSindicador de PowerShell :

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>

Escriba exitsi desea volver al símbolo del sistema ( exitnuevamente si también desea cerrar el símbolo del sistema).

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

SharpC
fuente
3
Al igual que para la respuesta aceptada, esto no devuelve nada para PowerShell 1.0. El método de registro es más explícito.
Peter Mortensen
44
Si powershell no estaba en la ruta, esta versión dará una falsa impresión de que no está instalado. El método de registro proporciona información completa. Presencia y versión.
Xalorous
9

$host.versiones simplemente incorrecto / poco confiable. Esto le proporciona 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.

x0n
fuente
9

Utilizar:

$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 la secuencia de comandos detallada de Cómo determinar la versión instalada de PowerShell .

Dale Chen
fuente
8

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 hay necesidad de recordar todas las variables. Solo Get-Variablees suficiente (y "Debe haber algo sobre la versión").

Roman Pokrovskij
fuente
8
Que es lo mismo que$PSVersionTable
orad
66
Buscando la versión PS? escriba $ PSVersion [pestaña] [enter]. Hecho. No necesito recordar nada :)
orad
1
esto realmente solo es útil si uno está muy familiarizado con los trucos de tuberías que se utilizan. De ninguna manera un principiante podrá recordar esa sintaxis más fácil que solo recordar $ PSVersionTable
Joseph Gabriel
1
Chicos, Get-Variable funciona bien solo (si es todo lo que necesita para obtener la versión), las tuberías son solo una broma :) Tampoco recuerdo la sintaxis de las tuberías.
Roman Pokrovskij
7

Para verificar si PowerShell está instalado, use:

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

Para verificar si RC2 o RTM está instalado, use:

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 .

Daniel Elliott
fuente
7

Como la respuesta más útil no abordaba la parte de si existe , pensé en darle una opinión a través de una solución rápida y sucia. Se basa en que PowerShell esté en la variable de entorno de ruta , que es probablemente lo que desea. (Sugerencia para la respuesta principal, ya que no lo sabía). Pegue esto en un archivo de texto y asígnele un nombre

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
Pecos Bill
fuente
4

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 o no estar disponibles.

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"
}
Atron Seige
fuente
3

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

$PSVersionTable.PSVersion.Major
Venkatakrishnan
fuente
2
$PSVersionTablees una variable automática; un objeto. No es un cmdlet.
Maximilian Burszley
1

Este es el resultado de búsqueda superior para "Archivo Batch obtener 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 dependiendo de 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
)
Derpy
fuente
0

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

Tylor Durden
fuente
3
Esto es semi-incorrecto. hostresuelve a Get-Host. De todos modos, no es una forma confiable de obtener la versión.
Maximilian Burszley
-1

Extender la respuesta con un operador seleccionado:

Get-Host | select {$_.Version}
HaBo
fuente
77
La respuesta aceptada dice "... $ Host.Version y (Get-Host) .Version no son confiables: reflejan solo la versión del host, no el motor" .
Peter Mortensen
@PeterMortensen parece que mi respuesta fue antes de la respuesta aceptada
HaBo
2
@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
2
@HaBo Su comentario anterior se lee como si estuviera justificando su respuesta por el hecho de que fue publicada antes de la respuesta aceptada, lo cual no es el caso en absoluto. 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 es una extensión de la respuesta aceptada (que ni siquiera se usa Get-Host).
TylerH