Odpowiedzi:
Służy $PSVersionTable.PSVersion
do określania wersji silnika. Jeśli zmienna nie istnieje, można bezpiecznie założyć, że silnik jest wersją 1.0
.
Zauważ, że $Host.Version
i (Get-Host).Version
nie są niezawodne - odzwierciedlają tylko wersję hosta, a nie silnika. PowerGUI, PowerShellPLUS itp. Są aplikacjami hostingowymi i ustawią wersję hosta tak, aby odzwierciedlała wersję produktu - co jest całkowicie poprawne, ale nie to, czego szukasz.
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
$PSVersionTable
jest bardziej niezawodny i zwraca $ PSVersion. Możesz także użyć $PSVersionTable.PSVersion
. Nawet jeśli jesteś podłączony zdalnie do komputera z inną wersją ( invoke-command -computername myRemotePC -Credential foo {$host}
), wygląda na to, że $host
pokaże tylko najniższą wersję, którą uzgodnili do serializacji. Chociaż $PSVersionTable
pokaże prawdziwą wersję. Mam nadzieję, że to pomoże komuś ..
notepad $profile
i wrzuciłem function psver { $PSVersionTable; $PSVersionTable.PSVersion }
to. Załaduj ponownie . $profile
i mogę po prostu wpisać w psver
dowolnym momencie, aby uzyskać szczegółowe informacje o wersji i inne szczegóły.
Chciałbym użyć Get-Host lub $ PSVersionTable . Jak zauważa Andy Schneider, $PSVersionTable
nie działa w wersji 1; został wprowadzony w wersji 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
nie jest niezawodny - na przykład w powergui zwraca wersję hosta powergui, która nie jest taka sama jak wersja silnika PowerShell (co jest pożądane.)
Możesz zajrzeć na wbudowanej zmiennej $psversiontable
. Jeśli nie istnieje, masz V1. Jeśli tak, to zapewni ci wszystkie potrzebne informacje.
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
Aby ustalić, czy PowerShell jest zainstalowany, możesz sprawdzić rejestr pod kątem istnienia
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install
i
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3
i jeśli istnieje, czy wartość wynosi 1 (dla zainstalowanego), jak wyszczególniono w poście na blogu Sprawdź, czy PowerShell jest zainstalowany i wersji .
Aby ustalić wersję zainstalowanego programu PowerShell, możesz sprawdzić klucze rejestru
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
i
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion
Aby ustalić wersję programu PowerShell, która jest instalowana ze skryptu .ps1, możesz użyć następującego jednowierszowego programu, jak opisano szczegółowo na stronie PowerShell.com, w której wersji programu PowerShell działam .
$isV2 = test-path variable:\psversiontable
Ta sama witryna udostępnia również funkcję zwracania wersji:
function Get-PSVersion {
if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
Możesz bezpośrednio sprawdzić wersję za pomocą tylko jednego wiersza, wywołując PowerShell zewnętrznie , na przykład z wiersza polecenia
powershell -Command "$PSVersionTable.PSVersion"
Według @psaul ty może faktycznie mieć jedno polecenie, które jest agnostykiem skąd przyszedł (CMD, PowerShell lub Pwsh). Dziękuję za to.
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
Testowałem i działał bezbłędnie zarówno na CMD, jak i PowerShell.
cmd
i powershell
bezskutecznie. Oczekiwałbym również tego samego zachowania. :)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
działa świetnie.
Możesz sprawdzić, czy wersja programu Windows PowerShell została zainstalowana, wykonując następujące sprawdzenie:
W konsoli Windows PowerShell wpisz następujące polecenie w wierszu polecenia, a następnie naciśnij klawisz ENTER:
Get-Host | Select-Object Version
Zobaczysz wynik, który wygląda następująco:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/
Zalecaną przez Microsoft kompatybilną metodą przesyłania dalej metodą sprawdzania, czy PowerShell jest zainstalowany i określania zainstalowanej wersji, jest sprawdzenie dwóch określonych kluczy rejestru. Powtórzyłem tutaj szczegóły na wypadek, gdyby link się zepsuł.
Według połączonej strony:
W zależności od innych kluczy rejestru lub wersji programu PowerShell.exe lub lokalizacji programu PowerShell.exe nie gwarantuje się, że będzie działać w długim okresie.
Aby sprawdzić, czy jest zainstalowana dowolna wersja programu PowerShell, sprawdź w rejestrze następującą wartość:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
Aby sprawdzić, czy zainstalowana jest wersja 1.0 lub 2.0 programu PowerShell, sprawdź w rejestrze następującą wartość:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
Znalazłem najprostszy sposób, aby sprawdzić, czy zainstalowano:
cmd
, a następnie OK)powershell
a następnie naciśnij klawisz Return. Powinieneś otrzymać PS
monit PowerShell :C:\Users\MyUser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\MyUser>
Następnie możesz sprawdzić wersję z wiersza polecenia programu PowerShell, wpisując $PSVersionTable.PSVersion
:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
Wpisz, exit
jeśli chcesz wrócić do wiersza polecenia ( exit
ponownie, jeśli chcesz również zamknąć wiersz polecenia).
Aby uruchomić skrypty, zobacz http://ss64.com/ps/syntax-run.html .
$host.version
jest po prostu źle / niewiarygodne. Daje to wersję pliku wykonywalnego hosta (powershell.exe, powergui.exe, powershell_ise.exe, powershellplus.exe itp.), A nie wersję samego silnika.
Wersja silnika jest zawarta w $psversiontable.psversion
. W przypadku PowerShell 1.0 ta zmienna nie istnieje, więc oczywiście jeśli ta zmienna nie jest dostępna, można całkowicie założyć, że silnik to 1.0, oczywiście.
Posługiwać się:
$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'}
}
Możesz pobrać szczegółowy skrypt z Jak ustalić zainstalowaną wersję PowerShell .
Najłatwiejszym sposobem, aby zapomnieć o tej stronie i nigdy do niej nie wrócić, jest nauczenie się Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
Nie ma potrzeby zapamiętywania każdej zmiennej. Wystarczy tylko Get-Variable
(i „W wersji powinno być coś”).
$PSVersionTable
Aby sprawdzić, czy PowerShell jest zainstalowany, użyj:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
Aby sprawdzić, czy zainstalowano RC2 lub RTM, użyj:
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM
Źródło: ta strona internetowa .
Ponieważ najbardziej pomocna odpowiedź nie dotyczyła części „ jeśli istnieje” , pomyślałem, że dam jej jedno szybkie i brudne rozwiązanie. Polega na tym, że PowerShell znajduje się w zmiennej środowiskowej ścieżki, co prawdopodobnie jest tym, czego chcesz. (Porada na najwyższą odpowiedź, ponieważ tego nie wiedziałem.) Wklej to do pliku tekstowego i nazwij go
Przetestuj PowerShell Version.cmd
lub podobne.
@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
Musiałem sprawdzić wersję programu PowerShell, a następnie uruchomić odpowiedni kod. Niektóre z naszych serwerów działają w wersji 5, a inne w wersji 4. Oznacza to, że niektóre funkcje, takie jak kompresja, mogą być niedostępne.
To jest moje rozwiązanie:
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"
}
Poniższe polecenie cmdlet zwróci wersję programu PowerShell.
$PSVersionTable.PSVersion.Major
$PSVersionTable
jest zmienną automatyczną; obiekt. To nie jest polecenie cmdlet.
To jest najlepszy wynik wyszukiwania dla „Plik wsadowy pobierz wersję PowerShell”, dlatego chciałbym podać podstawowy przykład wykonywania warunkowego przepływu w pliku wsadowym w zależności od wersji PowerShell
Ogólny przykład
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.
)
Przykład z prawdziwego świata
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
)
Możesz także wywołać polecenie „host” z wiersza polecenia programu PowerShell. Powinno to dać ci wartość $host
zmiennej.
host
rozwiązuje do Get-Host
. Niezależnie od tego nie jest to niezawodny sposób na uzyskanie wersji.
Rozszerzanie odpowiedzi za pomocą operatora select:
Get-Host | select {$_.Version}
Get-Host
).