Wie kann ich feststellen, welche Version von PowerShell auf einem Computer installiert ist und ob sie überhaupt installiert ist?
Verwenden Sie $PSVersionTable.PSVersion
, um die Engine-Version zu ermitteln. Wenn die Variable nicht vorhanden ist, kann davon ausgegangen werden, dass die Engine die Version 1.0
ist.
Beachten Sie, dass $Host.Version
und (Get-Host).Version
nicht zuverlässig sind. Sie geben nur die Version des Hosts und nicht die Engine wieder. PowerGUI, PowerShellPLUS usw. sind alle Hosting-Anwendungen, und Sie setzen die Version des Hosts entsprechend ihrer Produktversion . Dies ist völlig korrekt, aber nicht das, wonach Sie suchen.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
Ich würde entweder Get-Host oder $ PSVersionTable verwenden. Andy Schneider weist darauf hin, dass $PSVersionTable
in Version 1 nicht funktioniert. es wurde in Version 2 eingeführt.
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
Um festzustellen, ob PowerShell installiert ist, können Sie die Registrierung auf Vorhandensein von überprüfen
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install
und
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3
und, falls vorhanden, ob der Wert 1 ist (für installiert), wie im Blogbeitrag ÜBERPRÜFEN, OB POWERSHELL UND VERSION INSTALLIERT SIND.
Um die installierte Version von PowerShell zu ermitteln, können Sie die Registrierungsschlüssel überprüfen
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
und
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion
Zum Ermitteln der von einem .ps1-Skript installierten Version von PowerShell können Sie den folgenden Einzeiler verwenden, der auf PowerShell.com unter WELCHE POWERSHELL-VERSION IST AKTIV beschrieben wird.
$isV2 = test-path variable:\psversiontable
Dieselbe Site bietet auch eine Funktion zur Rückgabe der Version:
function Get-PSVersion {
if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
Sie können sich die eingebaute Variable $psversiontable
ansehen. Wenn es nicht existiert, haben Sie V1. Wenn es existiert, erhalten Sie alle Informationen, die Sie benötigen.
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
Ich möchte nur meine 2 Cent hier hinzufügen.
Sie können die Version nur mit einer Zeile direkt überprüfen, indem Sie die Powershell extern aufrufen, z. B. über die Eingabeaufforderung
powershell -Command "$PSVersionTable.PSVersion"
EDIT:
Laut @psaul you kann tatsächlich ein Kommando haben, das agnostisch ist (CMD, Powershell oder Pwsh).
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
Ich habe getestet und es funktionierte einwandfrei auf CMD und Powershell
Sie können die installierte Windows PowerShell-Version überprüfen, indem Sie die folgende Prüfung durchführen:
Geben Sie in der Windows PowerShell-Konsole den folgenden Befehl an der Eingabeaufforderung ein, und drücken Sie die EINGABETASTE:
Get-Host | Select-Object-Version
Sie sehen eine Ausgabe, die folgendermaßen aussieht:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/wie-zu-verifizieren-die-windows-powershell-version-installed/
Von Microsoft empfohlene vorwärtskompatible Methode, um zu überprüfen, ob PowerShell installiert ist und die installierte Version bestimmt. Es werden zwei bestimmte Registrierungsschlüssel betrachtet. Ich habe die Details hier wiedergegeben, falls der Link bricht.
Entsprechend der verlinkten Seite:
Abhängig von anderen Registrierungsschlüsseln, der Version von PowerShell.exe oder dem Speicherort von PowerShell.exe ist die langfristige Funktionsfähigkeit nicht garantiert.
Um zu prüfen, ob any Version von PowerShell installiert ist, überprüfen Sie den folgenden Wert in der Registrierung:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Um zu prüfen, ob Version 1.0 oder 2.0 von PowerShell installiert ist, überprüfen Sie den folgenden Wert in der Registrierung:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Ich fand es am einfachsten zu überprüfen, ob installiert wurde:
cmd
, dann OK)powershell
ein und drücken Sie die Eingabetaste. Sie sollten dann die PowerShell PS
-Eingabeaufforderung erhalten:C:\Users\MyUser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\MyUser>
Sie können die Version anschließend in der PowerShell-Eingabeaufforderung prüfen, indem Sie $PSVersionTable.PSVersion
eingeben:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
Geben Sie exit
ein, wenn Sie zum Befehl Prompt zurückkehren möchten (exit
, wenn Sie auch den Befehl Prompt schließen möchten).
Informationen zum Ausführen von Skripts finden Sie unter http://ss64.com/ps/syntax-run.html .
$Host.version
ist einfach falsch/unzuverlässig. Dies gibt Ihnen die Version der ausführbaren Host-Datei (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe usw.) und nicht die Version der Engine selbst.
Die Engine-Version ist in $psversiontable.psversion
enthalten. Für PowerShell 1.0 ist diese Variable nicht vorhanden. Wenn diese Variable nicht verfügbar ist, kann man natürlich davon ausgehen, dass die Engine 1.0 ist.
Benutzen:
$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'}
}
Sie können das ausführliche Skript von ERMITTELN DER INSTALLIERTEN POWERSHELL-VERSION herunterladen.
Um zu prüfen, ob PowerShell installiert ist, verwenden Sie Folgendes:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
Um zu prüfen, ob RC2 oder RTM installiert ist, verwenden Sie:
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM
Quelle: diese Website .
Der einfachste Weg, diese Seite zu vergessen und nie wieder zurückzukehren, ist den Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
Es ist nicht notwendig, sich an jede Variable zu erinnern. Nur Get-Variable
ist genug (und "Version sollte etwas sein").
Da die hilfreichste Antwort nicht den if exists -Anteil ansprach, dachte ich, ich würde es über eine schnelle und schmutzige Lösung annehmen. Es hängt davon ab, dass sich PowerShell in der Pfad Umgebungsvariable befindet, was wahrscheinlich das ist, was Sie wollen. (Hat ein Tipp ganz oben, da ich das nicht wusste.) Fügen Sie diese in eine text -Datei ein und nennen Sie sie einen Namen
Test Powershell Version.cmd
oder ähnliches.
@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
Das folgende Cmdlet gibt die PowerShell-Version zurück.
$PSVersionTable.PSVersion.Major
Ich musste die Version von PS überprüfen und dann den entsprechenden Code ausführen. Einige unserer Server laufen v5, andere v4. Dies bedeutet, dass einige Funktionen, wie zum Beispiel komprimieren, möglicherweise nicht verfügbar sind.
Das ist meine Lösung:
if ($PSVersionTable.PSVersion.Major -eq 5) {
#Execute code available in 5, like Compress
Write-Host "You are running version 5"
}
else {
#Use a different process
Write-Host "This is version $PSVersionTable.PSVersion.Major"
}
Sie können den Befehl "Host" auch über die PowerShell-Befehlszeile aufrufen. Es sollte Ihnen den Wert der $Host
-Variablen geben.
Dies ist das Top-Suchergebnis für "Batch-Datei erhält Powershell-Version". Ich möchte daher ein grundlegendes Beispiel für das Ausführen eines bedingten Flusses in einer Batch-Datei in Abhängigkeit von der Powershell-Version geben
allgemeines Beispiel
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.
)
Beispiel aus der Praxis
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
)
Normalerweise erhalten Sie es mit der Major-Nummer, die Sie wie folgt erhalten können:
$PSVersionTable.PSVersion.Major
Die Antwort mit einem ausgewählten Operator erweitern:
Get-Host | select {$_.Version}