Determina la versione di PowerShell installata

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

Utilizzare $PSVersionTable.PSVersion per determinare la versione del motore. Se la variabile non esiste, è sicuro assumere che il motore sia la versione 1.0 .

Tieni presente che $Host.Version e (Get-Host).Version non sono affidabili: riflettono solo la versione dell’host, non il motore. PowerGUI, PowerShellPLUS, ecc. Sono tutte applicazioni di hosting e imposteranno la versione dell’host in modo che rifletta la versione del prodotto, che è completamente corretta, ma non quella che stai cercando.

 PS C:\> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 4 0 -1 -1 

Vorrei utilizzare Get-Host o $ PSVersionTable . Come sottolinea Andy Schneider, $PSVersionTable non 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 

Per determinare se PowerShell è installato, è ansible controllare il registro per l’esistenza di

 HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install 

e

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3 

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

Per determinare la versione di PowerShell installata, è ansible controllare le chiavi di 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, è ansible utilizzare il seguente one-liner, come descritto in dettaglio su PowerShell.com in Quale versione di PowerShell sono in esecuzione .

 $isV2 = test-path variable:\psversiontable 

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

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

Puoi guardare la variabile integrata, $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 

Voglio solo aggiungere i miei 2 centesimi qui.

È ansible controllare direttamente la versione con una sola riga invocando PowerShell esternamente , ad esempio da Prompt dei comandi

 powershell -Command "$PSVersionTable.PSVersion" 

MODIFICARE:

Secondo @psaul puoi effettivamente avere un comando che è agnostico da dove proviene (CMD, Powershell o Pwsh), grazie per quello.

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

Ho provato e ha funzionato perfettamente sia su CMD che su PowerShell

Immagine

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

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

    Get-Host | Select-Object Version

Vedrai un output che assomiglia a questo:

 Version ------- 3.0 

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

Il metodo Microsoft compatibile con le versioni precedenti consigliato per verificare se PowerShell è installato e determinare la versione installata consiste nell’esaminare due chiavi del Registro di sistema specifiche. Ho riprodotto i dettagli qui nel caso in cui il link si interrompe.

Secondo la pagina collegata:

A seconda delle altre chiavi del Registro di sistema o della versione di PowerShell.exe o del percorso di PowerShell.exe non è garantito il funzionamento a lungo termine.

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

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

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

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

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

  • eseguire un prompt dei comandi (Start, Esegui, cmd , quindi OK)
  • digitare powershell quindi powershell . Dovresti quindi ottenere il prompt PS PowerShell:
 C:\Users\MyUser>powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. All rights reserved. PS C:\Users\MyUser> 

È quindi ansible 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 exit se si desidera tornare al prompt dei comandi ( exit nuovo se si desidera chiudere anche il prompt dei comandi).

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

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

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

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

$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 assumere che il motore sia 1.0, ovviamente.

Il modo più semplice per dimenticare questa pagina e non tornare mai indietro è imparare la Get-Variable :

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

Non è necessario ricordare ogni variabile. Basta Get-Variable (e “Ci dovrebbe essere qualcosa sulla versione”).

Dal momento che la risposta più utile non ha affrontato la parte di if exist , ho pensato di dargli una presa su di essa attraverso una soluzione rapida e sporca. Si basa su PowerShell che si trova nella variabile di ambiente path che è probabilmente ciò che si desidera. (Punta la punta della risposta in alto perché non lo sapevo.) Incolla questo 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 

È inoltre ansible chiamare il comando “host” dalla riga di comando di PowerShell. Dovrebbe darti il ​​valore della variabile $host .

Il cmdlet seguente restituirà la versione di PowerShell.

 $PSVersionTable.PSVersion.Major 

Provalo con il seguente comando:

 Get-Host 

Visto qui

Estendere la risposta con un operatore selezionato:

 Get-Host | select {$_.Version} 

Utilizzare il comando Get-Host . La seconda riga del risultato è la versione.

Di solito lo ottieni usando il numero Major che puoi ottenere in questo modo:

 $PSVersionTable.PSVersion.Major 

Prova;) ((Get-Host).Version).Major

 # Get PowerShell Version function Global:version { $PSVersionTable.PSVersion } 

Utilizzare Get-Host per ottenere i dettagli per la versione di PowerShell:

 PS C:\Users\ashash001c> Get-Host Name : ConsoleHost Version : 2.0 InstanceId : ################################## UI : System.Management.Automation.Internal.Host.InternalHostUserI nterface CurrentCulture : en-US CurrentUICulture : en-US PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy IsRunspacePushed : False Runspace : System.Management.Automation.Runspaces.LocalRunspace