Determinare la versione di PowerShell installata


2632

Come posso determinare quale versione di PowerShell è installata su un computer e in effetti se è installata?

Risposte:


3585

Utilizzare $PSVersionTable.PSVersionper determinare la versione del motore. Se la variabile non esiste, si può presumere che il motore sia la versione 1.0.

Si noti che $Host.Versione (Get-Host).Versionnon sono attendibili - riflettono la versione del paese ospitante, non il motore. PowerGUI, PowerShellPLUS, ecc. Sono tutte applicazioni di hosting e imposteranno la versione dell'host in modo che rifletta la versione del loro prodotto, che è del tutto corretta, ma non quello che stai cercando.

PS C:\> $PSVersionTable.PSVersion

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

2
@DanielCassidy - con due anni di ritardo alla festa, ma "alcune funzionalità sono inspiegabilmente non disponibili" potrebbe essere causato solo dall'installazione del framework .Net 3.5 Compact anziché dell'intera cosa.
Dave Neeley,

83
$PSVersionTableè più affidabile e restituisce $ PSVersion. Puoi anche usare $PSVersionTable.PSVersion. Anche se sei connesso in remoto alla macchina che esegue una versione diversa ( invoke-command -computername myRemotePC -Credential foo {$host}), sembra che $hostmostrerà solo la versione più bassa concordata per la serializzazione. Mentre $PSVersionTablemostrerà la versione vera. Spero che possa aiutare qualcuno ..
corvo vulcaniano

16
Sembra $ host.Version non è una buona scelta ... Se si è remoti su un computer che esegue PowerShell 3, si ritorna 1.0, poiché RemotingHost sembra essere v1. L'uso di $ PSVersionTable restituisce correttamente 3.
Danny Tuppeny,

25
@Starfish Il comando mostrato avvia Powershell usando il Prompt dei comandi. Il comando non darebbe semplicemente l'errore "PowerShell non trovato" se non fosse installato?
jpmc26,

9
Così stanco di tornare qui per questo che ho appena corso notepad $profilee scaricato function psver { $PSVersionTable; $PSVersionTable.PSVersion }. Una ricarica con . $profilee posso solo digitare in psverqualsiasi momento per ottenere le informazioni dettagliate sulla versione e altri dettagli.
ADTC

434

Vorrei utilizzare Get-Host o $ PSVersionTable . Come sottolinea Andy Schneider, $PSVersionTablenon funziona nella versione 1; è stato introdotto nella versione 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

5
grazie! NB: Sul mio XP in cui ho eseguito l'aggiornamento manuale da v1 Powershell, i percorsi effettivi di cartelle e registro (fuorvianti ?!) fanno riferimento a v1 NON v2. Questo è come altri specificano qui, ma era il motivo per cui ero così preoccupato se lo avessi installato. Il mio percorso è; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0
AnneTheAgile

4
Se $ psversiontable non esiste, è del tutto sicuro supporre di essere su v1.0 - e hey presto, anche questo risponde alla tua domanda. $host.versionnon è affidabile - ad esempio in powergui, restituisce la versione host di powergui che non è la stessa della versione del motore PowerShell (che è ciò che si desidera.)
x0n

10
La risposta accettata indica "... $ Host.Version e (Get-Host) .Version non sono affidabili: riflettono solo la versione dell'host, non il motore" .
Peter Mortensen,

100

Potete guardare il costruito nel variabile $psversiontable. Se non esiste, hai V1. Se esiste, ti darà tutte le informazioni di cui hai bisogno.

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    

97

Per determinare se PowerShell è installato, è possibile controllare l'esistenza del registro

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

e

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

e, se esiste, se il valore è 1 (per installazione), come dettagliato nel post del blog Verifica se PowerShell è installato e versione .

Per determinare la versione di PowerShell installata, è possibile controllare le chiavi del registro

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

e

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

Per determinare la versione di PowerShell installata da uno script .ps1, è possibile utilizzare il seguente one-liner, come dettagliato su PowerShell.com in cui sono in esecuzione la versione di PowerShell .

$isV2 = test-path variable:\psversiontable

Lo stesso sito offre anche una funzione per restituire la versione:

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

4
Utile perché su un server Windows 2003 non sono riuscito a trovare la voce del menu di avvio per PowerShell (era lì ma non ovvio), ma la chiave di registro ha risposto alla mia domanda.
Sviluppatore olistico,

7
Per PowerScript 3.0 sembra esserci una nuova voce, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (oltre a HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 ). La posizione corretta in questo caso per ottenere la versione sembra essere HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (il valore di esempio è "3.0").
Peter Mortensen,

49

È possibile controllare direttamente la versione con una riga solo invocando PowerShell esternamente , ad esempio dal prompt dei comandi

powershell -Command "$PSVersionTable.PSVersion"

Secondo @psaul si può effettivamente avere un comando che è agnostico da dove è venuto (CMD, PowerShell o Pwsh). Grazie per questo.

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

Ho testato e ha funzionato perfettamente su CMD e PowerShell.

Immagine


Ottengo questo errore orribile con questo tentativo: "System.Collections.Hashtable.PSVersion: il termine 'System.Collections.Hashtable.PSVersion' non è riconosciuto come il nome di un cmdlet, una funzione, un file di script o un programma eseguibile. Controlla il ortografia del nome o se è stato incluso un percorso, verificare che il percorso sia corretto e riprovare. ". Quindi non sempre funziona
Gonmator il

Sono contento che tu l'abbia sottolineato poiché è bene conoscere i casi d'angolo, ma immagino che funzioni ancora per la maggior parte delle persone.
Patrick Bard,

@Gonmator si potrebbe pensare che PowerShell si comporterebbe allo stesso modo con questo comando, ma sfortunatamente no. Ho tentato di correggere la sintassi affinché funzionasse agnosticamente tra cmde powershellsenza risultati. Mi sarei aspettato lo stesso comportamento. :)
tresf

3
@tresf (e @Gonmator) PUOI eseguire questo agnosticamente da CMD, PowerShell o persino Pwsh (PS 6.0) ma devi usare questo modulo: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (che lavorare in tutti i casi)
PSaul

Testato anche su Mac. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" funziona alla grande.
tresf

38

È possibile verificare che la versione di Windows PowerShell sia installata completando il seguente controllo:

  1. Fare clic sul pulsante Start, scegliere Tutti i programmi, Accessori, Windows PowerShell, quindi Windows PowerShell.
  2. Nella console di Windows PowerShell, digitare il comando seguente al prompt dei comandi, quindi premere INVIO:

    Get-Host | Select-Object Version

Vedrai un output simile al seguente:

Version
-------
3.0

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


1
Si presuppone che PowerShell sia stato installato con opzioni predefinite e che i collegamenti non siano stati rimossi dal menu Start. Meglio usare il test del registro.
Xalorous,

Penso che se è necessario utilizzare prima PowerShell si provi a eseguirlo come standard, è necessario installarlo, quindi se non si trova l'icona si tenta di cercarla, quindi forse si tenta di eseguirla dal prompt dei comandi. Non penso che inizi dal registro.
Eclissi

6
La risposta accettata indica "... $ Host.Version e (Get-Host) .Version non sono affidabili: riflettono solo la versione dell'host, non il motore" .
Peter Mortensen,

21

Il metodo compatibile con le versioni avanzate di Microsoft per verificare se PowerShell è installato e determinare la versione installata è esaminare due chiavi di registro specifiche. Ho riprodotto i dettagli qui in caso di interruzione del collegamento.

Secondo la pagina collegata:

A seconda di qualsiasi altra chiave di registro, della versione di PowerShell.exe o della posizione di PowerShell.exe non è garantito che funzioni a lungo termine.

Per verificare se è installata una versione di PowerShell, controllare il seguente valore nel registro:

  • Posizione chiave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Nome valore: Installa
  • Tipo valore: REG_DWORD
  • Dati valore: 0x00000001 (1

Per verificare se è installata la versione 1.0 o 2.0 di PowerShell, controllare il seguente valore nel registro:

  • Posizione chiave: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nome valore: PowerShellVersion
  • Tipo valore: REG_SZ
  • Dati valore: <1.0 | 2.0>

5
Per PowerShell 3.0, sembra essercene uno nuovo, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Peter Mortensen,

11

Ho trovato il modo più semplice per verificare se installato era:

  • eseguire un prompt dei comandi (Start, Esegui cmd, quindi OK)
  • digitare powershellquindi premere Invio. Dovresti quindi ottenere il PSprompt di PowerShell :

C:\Users\MyUser>powershell

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

PS C:\Users\MyUser>

È quindi possibile controllare la versione dal prompt di PowerShell digitando $PSVersionTable.PSVersion:

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

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

PS C:\Users\MyUser>

Digitare exitse si desidera tornare al prompt dei comandi (di exitnuovo se si desidera chiudere anche il prompt dei comandi).

Per eseguire gli script, consultare http://ss64.com/ps/syntax-run.html .


3
Come per la risposta accettata, questo non restituisce nulla per PowerShell 1.0. Il metodo di registro è più esplicito.
Peter Mortensen,

4
Se powershell non si trovava nel percorso, questa versione darà una falsa impressione che non sia installata. Il metodo Registry fornisce informazioni complete. Presenza e versione.
Xalorous,

9

$host.versionè semplicemente sbagliato / inaffidabile. Questo ti dà la versione dell'eseguibile di hosting (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe ecc.) E non la versione del motore stesso.

La versione del motore è contenuta in $psversiontable.psversion. Per PowerShell 1.0, questa variabile non esiste, quindi ovviamente se questa variabile non è disponibile è del tutto sicuro supporre che il motore sia 1.0, ovviamente.


9

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'}
}

È possibile scaricare lo script dettagliato da Come determinare la versione di PowerShell installata .


8

Il modo più semplice per dimenticare questa pagina e non tornare più è quello di imparare Get-Variable:

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

Non è necessario ricordare ogni variabile. Basta Get-Variablebasta (e "Non ci dovrebbe essere qualcosa in versione").


8
Che è uguale a$PSVersionTable
orad

6
Cerchi la versione PS? digitare $ PSVersion [tab] [invio]. Fatto. Non c'è bisogno di ricordare nulla :)
Orad

1
questo è davvero utile solo se si ha molta familiarità con i trucchi delle tubazioni che vengono utilizzati. In nessun modo un principiante sarà in grado di ricordare che tutta quella sintassi è più semplice del ricordare $ PSVersionTable
Joseph Gabriel,

1
Ragazzi, Get-Variable funziona bene da solo (se tutto ciò che serve solo per ottenere la versione), il piping è solo uno scherzo :) Non ricordo neanche la sintassi del piping.
Roman Pokrovskij

7

Per verificare se PowerShell è installato utilizzare:

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

Per verificare se RC2 o RTM è installato, utilizzare:

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

Fonte: questo sito Web .


7

Dal momento che la risposta più utile non ha affrontato il se esiste , ho pensato di dare una soluzione tramite una soluzione rapida e sporca. Si basa sul fatto che PowerShell si trova nella variabile di ambiente del percorso , che è probabilmente ciò che si desidera. (Punta il cappello alla risposta principale perché non lo sapevo.) Incollalo in un file di testo e chiamalo

Prova Powershell Version.cmd

o simili.

@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

4

Avevo bisogno di controllare la versione di PowerShell e quindi eseguire il codice appropriato. Alcuni dei nostri server eseguono v5 e altri v4. Ciò significa che alcune funzioni, come la compressione, potrebbero essere disponibili o meno.

Questa è la mia soluzione:

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"
}

3

Il cmdlet seguente restituirà la versione di PowerShell.

$PSVersionTable.PSVersion.Major

2
$PSVersionTableè una variabile automatica; un oggetto. Non è un cmdlet.
Maximilian Burszley,

1

Questo è il risultato di ricerca principale per "File batch ottieni versione PowerShell", quindi vorrei fornire un esempio di base su come eseguire il flusso condizionale in un file batch a seconda della versione PowerShell

Esempio generico

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.
)

Esempio del mondo reale

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
)

0

È inoltre possibile chiamare il comando "host" dalla riga di comando di PowerShell. Dovrebbe darti il ​​valore della $hostvariabile.


3
Questo è semi-sbagliato. hostsi risolve in Get-Host. Indipendentemente da ciò, non è un modo affidabile per ottenere la versione.
Maximilian Burszley,

-1

Estensione della risposta con un operatore selezionato:

Get-Host | select {$_.Version}

7
La risposta accettata indica "... $ Host.Version e (Get-Host) .Version non sono affidabili: riflettono solo la versione dell'host, non il motore" .
Peter Mortensen,

@PeterMortensen sembra che la mia risposta fosse prima della risposta accettata
HaBo,

2
@HaBo Cosa stai guardando? La risposta accettata è del 2009.
TylerH,

@TylerH e allora? Non sto seguendo la tua domanda. la mia risposta dice chiaramente che è un'estensione della risposta accettata. è una versione semplificata.
HaBo

2
@HaBo Il tuo commento precedente dice che stai giustificando la tua risposta dal fatto che è stata pubblicata prima della risposta accettata, il che non è affatto il caso. La tua risposta è stata pubblicata 7 anni dopo la risposta accettata e 6 anni dopo che la tua risposta si è "estesa"; a proposito di ciò, la tua risposta non dice chiaramente che è un'estensione della risposta accettata (che nemmeno usa Get-Host).
TylerH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.