Risposte:
Utilizzare $PSVersionTable.PSVersion
per 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.Version
e (Get-Host).Version
non 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
$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 $host
mostrerà solo la versione più bassa concordata per la serializzazione. Mentre $PSVersionTable
mostrerà la versione vera. Spero che possa aiutare qualcuno ..
notepad $profile
e scaricato function psver { $PSVersionTable; $PSVersionTable.PSVersion }
. Una ricarica con . $profile
e posso solo digitare in psver
qualsiasi momento per ottenere le informazioni dettagliate sulla versione e altri dettagli.
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
$host.version
non è 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.)
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
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"}
}
È 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.
cmd
e powershell
senza risultati. Mi sarei aspettato lo stesso comportamento. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
funziona alla grande.
È possibile verificare che la versione di Windows PowerShell sia installata completando il seguente controllo:
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/
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:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Per verificare se è installata la versione 1.0 o 2.0 di PowerShell, controllare il seguente valore nel registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Ho trovato il modo più semplice per verificare se installato era:
cmd
, quindi OK)powershell
quindi premere Invio. Dovresti quindi ottenere il PS
prompt 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 exit
se si desidera tornare al prompt dei comandi (di exit
nuovo se si desidera chiudere anche il prompt dei comandi).
Per eseguire gli script, consultare http://ss64.com/ps/syntax-run.html .
$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.
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 .
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-Variable
basta (e "Non ci dovrebbe essere qualcosa in versione").
$PSVersionTable
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 .
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
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"
}
Il cmdlet seguente restituirà la versione di PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
è una variabile automatica; un oggetto. Non è un cmdlet.
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
)
È inoltre possibile chiamare il comando "host" dalla riga di comando di PowerShell. Dovrebbe darti il valore della $host
variabile.
host
si risolve in Get-Host
. Indipendentemente da ciò, non è un modo affidabile per ottenere la versione.
Estensione della risposta con un operatore selezionato:
Get-Host | select {$_.Version}
Get-Host
).