Antworten:
Verwenden Sie $PSVersionTable.PSVersion
diese Option , um die Motorversion zu bestimmen. Wenn die Variable nicht vorhanden ist, kann davon ausgegangen werden, dass es sich bei der Engine um eine Version handelt 1.0
.
Beachten Sie dies $Host.Version
und (Get-Host).Version
sind nicht zuverlässig - sie geben nur die Version des Hosts wieder, nicht die Engine. PowerGUI, PowerShellPLUS usw. sind alle Hosting-Anwendungen und stellen die Host-Version so ein, dass sie die Produktversion widerspiegelt - was völlig korrekt ist, aber nicht das, wonach Sie suchen.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
$PSVersionTable
ist zuverlässiger und gibt $ PSVersion zurück. Sie können auch verwenden $PSVersionTable.PSVersion
. Selbst wenn Sie remote mit dem Computer verbunden sind, auf dem eine andere Version ( invoke-command -computername myRemotePC -Credential foo {$host}
) ausgeführt wird, wird anscheinend $host
nur die niedrigste Version angezeigt, die für die Serialisierung vereinbart wurde. While $PSVersionTable
zeigt die wahre Version an. Hoffe, es würde jemandem helfen ..
notepad $profile
gerannt bin und mich hineingeworfen function psver { $PSVersionTable; $PSVersionTable.PSVersion }
habe. Ein Nachladen mit . $profile
und ich kann einfach psver
jederzeit eingeben, um die detaillierten Versionsinformationen und andere Details zu erhalten.
Ich würde entweder Get-Host oder $ PSVersionTable verwenden . Wie Andy Schneider betont, $PSVersionTable
funktioniert in Version 1 nicht; 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
$host.version
ist nicht zuverlässig - zum Beispiel in Powergui gibt es die Powergui-Host-Version zurück, die nicht mit der Powershell-Engine-Version identisch ist (was erwünscht ist)
Sie können sich die eingebaute Variable ansehen $psversiontable
. 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
Um festzustellen, ob PowerShell installiert ist, können Sie die Registrierung auf das 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 Blog-Beitrag beschrieben. Überprüfen Sie, ob PowerShell installiert ist und welche Version .
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
Um die Version von PowerShell zu ermitteln, die über ein .ps1-Skript installiert wird, können Sie den folgenden Einzeiler verwenden, wie auf PowerShell.com beschrieben, in dem PowerShell-Version ausgeführt wird .
$isV2 = test-path variable:\psversiontable
Dieselbe Site bietet auch eine Funktion zum Zurückgeben der Version:
function Get-PSVersion {
if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
Sie können die Version direkt mit nur einer Zeile überprüfen, indem Sie PowerShell extern aufrufen , z. B. über die Eingabeaufforderung
powershell -Command "$PSVersionTable.PSVersion"
Bis nach @psaul Sie können tatsächlich einen Befehl haben , die von Agnostiker ist , woher es kam (CMD, Powershell oder Pwsh). Danke für das.
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
Ich habe getestet und es hat sowohl auf CMD als auch auf PowerShell einwandfrei funktioniert.
cmd
und powershell
ohne Erfolg funktioniert . Ich hätte das gleiche Verhalten auch erwartet. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
funktioniert super.
Sie können überprüfen, ob die Windows PowerShell-Version installiert ist, indem Sie die folgende Prüfung durchführen:
Geben Sie in der Windows PowerShell-Konsole an der Eingabeaufforderung den folgenden Befehl 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/how-to-verify-the-windows-powershell-version-installed/
Die von Microsoft empfohlene vorwärtskompatible Methode zur Überprüfung, ob PowerShell installiert ist, und zur Ermittlung der installierten Version besteht darin, zwei bestimmte Registrierungsschlüssel zu überprüfen . Ich habe die Details hier reproduziert, falls der Link unterbrochen wird.
Laut der verlinkten Seite:
Abhängig von anderen Registrierungsschlüsseln oder Versionen von PowerShell.exe oder dem Speicherort von PowerShell.exe kann nicht garantiert werden, dass dies langfristig funktioniert.
Überprüfen Sie in der Registrierung , ob eine Version von PowerShell installiert ist:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Überprüfen Sie in der Registrierung , ob in Version 1.0 oder 2.0 von PowerShell Folgendes installiert ist:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Ich fand den einfachsten Weg, um zu überprüfen, ob installiert war:
cmd
, dann OK).powershell
dann die Eingabetaste ein. 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 dann an der PowerShell-Eingabeaufforderung überprüfen, indem Sie Folgendes eingeben $PSVersionTable.PSVersion
:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
Geben exit
Sie ein, wenn Sie zur Eingabeaufforderung exit
zurückkehren möchten ( erneut, wenn Sie auch die Eingabeaufforderung schließen möchten).
Informationen zum Ausführen von Skripten 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 Hosting-Datei (Powershell.exe, Powergui.exe, Powershell_ise.exe, Powershellplus.exe usw.) und nicht die Version der Engine selbst.
Die Motorversion ist in enthalten $psversiontable.psversion
. Für PowerShell 1.0 ist diese Variable nicht vorhanden. Wenn diese Variable nicht verfügbar ist, kann davon ausgegangen werden, dass die Engine offensichtlich 1.0 ist.
Verwenden:
$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 detaillierte Skript unter So ermitteln Sie die installierte PowerShell-Version herunterladen .
Der einfachste Weg, diese Seite zu vergessen und nie wieder dorthin zurückzukehren, besteht darin, Folgendes zu lernen Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
Es ist nicht erforderlich, sich jede Variable zu merken. Nur Get-Variable
ist genug (und "Es sollte etwas über die Version sein").
$PSVersionTable
Um zu überprüfen, ob PowerShell installiert ist, verwenden Sie:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
Um zu überprü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 .
Da die hilfreichste Antwort nicht auf den vorhandenen Teil einging, dachte ich, ich würde ihn über eine schnelle und schmutzige Lösung aufgreifen. Es stützt sich auf Powershell auf dem Weg zu sein Umgebungsvariable , die wahrscheinlich ist , was Sie wollen. (Hutspitze zur obersten Antwort, da ich das nicht wusste.) Fügen Sie dies in eine Textdatei ein und benennen Sie es
Testen Sie Powershell Version.cmd
o.ä.
@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
Ich musste die Version von PowerShell überprüfen und dann den entsprechenden Code ausführen. Einige unserer Server führen Version 5 und andere Version 4 aus. Dies bedeutet, dass einige Funktionen, wie z. B. Komprimieren, möglicherweise verfügbar sind oder nicht.
Das ist meine Lösung:
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"
}
Das folgende Cmdlet gibt die PowerShell-Version zurück.
$PSVersionTable.PSVersion.Major
$PSVersionTable
ist eine automatische Variable; ein Objekt. Es ist kein Cmdlet.
Dies ist das Top-Suchergebnis für "Batch-Datei erhält Powershell-Version". Daher möchte ich ein grundlegendes Beispiel dafür geben, wie ein bedingter Fluss in einer Batch-Datei abhängig von der Powershell-Version ausgeführt wird
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 realen Welt
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
)
Sie können den Befehl "host" auch über die PowerShell-Befehlszeile aufrufen. Es sollte Ihnen den Wert der $host
Variablen geben.
host
beschließt zu Get-Host
. Unabhängig davon ist es kein zuverlässiger Weg, um die Version zu erhalten.
Erweitern der Antwort mit einem ausgewählten Operator:
Get-Host | select {$_.Version}
Get-Host
).