Określ zainstalowaną wersję programu PowerShell

2631

Jak mogę ustalić, która wersja PowerShell jest zainstalowana na komputerze, a nawet jeśli w ogóle jest zainstalowana?

MagicAndi
źródło

Odpowiedzi:

3583

Służy $PSVersionTable.PSVersiondo określania wersji silnika. Jeśli zmienna nie istnieje, można bezpiecznie założyć, że silnik jest wersją 1.0.

Zauważ, że $Host.Versioni (Get-Host).Versionnie 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
156862
źródło
2
@DanielCassidy - dwa lata spóźnienie na imprezę, ale „niektóre funkcje są niedostępne” może być spowodowane jedynie zainstalowaniem frameworka .Net 3.5 Compact zamiast pełnej wersji.
Dave Neeley,
83
$PSVersionTablejest 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 $hostpokaże tylko najniższą wersję, którą uzgodnili do serializacji. Chociaż $PSVersionTablepokaże prawdziwą wersję. Mam nadzieję, że to pomoże komuś ..
vulcan raven
16
Wydaje się, że $ host. Wersja nie jest dobrym wyborem ... Jeśli zdalnie uruchomisz komputer z programem PowerShell 3, otrzymasz 1.0, ponieważ RemotingHost wydaje się być v1. Prawidłowe użycie $ PSVersionTable zwraca wartość 3.
Danny Tuppeny
25
@Starfish Pokazane polecenie uruchamia PowerShell za pomocą wiersza polecenia. Czy to polecenie nie popełniłoby błędu przy „nie znaleziono PowerShell”, jeśli nie zostało zainstalowane?
jpmc26,
9
Tak zmęczony wracaniem tutaj po to, że po prostu pobiegłem notepad $profilei wrzuciłem function psver { $PSVersionTable; $PSVersionTable.PSVersion }to. Załaduj ponownie . $profilei mogę po prostu wpisać w psverdowolnym momencie, aby uzyskać szczegółowe informacje o wersji i inne szczegóły.
ADTC
432

Chciałbym użyć Get-Host lub $ PSVersionTable . Jak zauważa Andy Schneider, $PSVersionTablenie 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
Thomas Bratt
źródło
5
Dziękuję Ci! Uwaga: na moim XP, gdzie ręcznie uaktualniłem z Powershell v1, rzeczywiste ścieżki folderów i rejestru (wprowadzające w błąd ?!) odnoszą się do wersji v1 NOT v2. Jest tak, jak podają tu inni, ale dlatego martwiłem się, czy go zainstalowałem. Moja ścieżka jest; C: \ WINDOWS \ system32 \ Windowspowershell \ v1.0
AnneTheAgile
4
Jeśli $ psversiontable nie istnieje, można całkowicie założyć, że korzystasz z wersji 1.0 - i hej presto, to również odpowiada na twoje pytanie. $host.versionnie 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.)
x0n 17.04.13
10
Przyjęta odpowiedź brzmi „... $ Host.Version i (Get-Host). Wersja nie jest niezawodna - odzwierciedlają tylko wersję hosta, a nie silnika” .
Peter Mortensen
99

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    
Andy Schneider
źródło
96

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"}
}
MagicAndi
źródło
4
Przydatne, ponieważ na serwerze z systemem Windows 2003 nie mogłem znaleźć pozycji menu Start dla programu PowerShell (było, ale nie było to oczywiste), ale klucz rejestru odpowiedział na moje pytanie.
Holistic Developer
7
W przypadku PowerScript 3.0 wydaje się, że jest nowy wpis, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (oprócz HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 ). Właściwym miejscem w tym przypadku do uzyskania wersji wydaje się być HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (przykładowa wartość to „3.0”).
Peter Mortensen
47

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.

Wizerunek

Patrick Bard
źródło
Przy tej próbie pojawia się ten okropny błąd: „System.Collections.Hashtable.PSVersion: Termin„ System.Collections.Hashtable.PSVersion ”nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcji, pliku skryptowego lub programu operacyjnego. Sprawdź pisownię nazwy lub jeśli ścieżka została dołączona, sprawdź, czy ścieżka jest poprawna i spróbuj ponownie. ". Więc nie zawsze działa
Gonmator
Cieszę się, że zwróciłeś na to uwagę, ponieważ dobrze jest znać przypadki narożne, ale myślę, że nadal działa dla większości ludzi.
Patrick Bard,
@Gonmator można by pomyśleć, że PowerShell zachowałby się tak samo z tym poleceniem, ale niestety tak nie jest. Podjąłem próbę poprawienia składni, aby działała agnostycznie pomiędzy cmdi powershellbezskutecznie. Oczekiwałbym również tego samego zachowania. :)
tresf
3
@tresf (i @Gonmator) MOŻESZ uruchomić to agnostycznie z CMD, PowerShell, a nawet Pwsh (PS 6.0), ale musisz użyć tego formularza: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (to będzie praca we wszystkich przypadkach)
PSaul
Testowane również na komputerze Mac. pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" działa świetnie.
tresf
37

Możesz sprawdzić, czy wersja programu Windows PowerShell została zainstalowana, wykonując następujące sprawdzenie:

  1. Kliknij przycisk Start, kliknij Wszystkie programy, kliknij Akcesoria, kliknij Windows PowerShell, a następnie kliknij Windows PowerShell.
  2. 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/

Zaćmienia
źródło
1
Zakładasz, że program PowerShell został zainstalowany z domyślnymi opcjami i że skróty nie zostały usunięte z menu Start. Lepiej użyć testu rejestru.
Xalorous
Myślę, że jeśli musisz najpierw użyć programu PowerShell, spróbuj uruchomić go jako standard, powinien on zostać zainstalowany, a następnie, jeśli nie znajdziesz ikony, spróbuj go wyszukać, a może spróbujesz uruchomić go z wiersza polecenia. Nie sądzę, że zaczynasz od rejestru.
Zaćmienia
6
Przyjęta odpowiedź brzmi „... $ Host.Version i (Get-Host). Wersja nie jest niezawodna - odzwierciedlają tylko wersję hosta, a nie silnika” .
Peter Mortensen
21

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ść:

  • Kluczowa lokalizacja: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Nazwa wartości: Zainstaluj
  • Typ wartości: REG_DWORD
  • Dane wartości: 0x00000001 (1

Aby sprawdzić, czy zainstalowana jest wersja 1.0 lub 2.0 programu PowerShell, sprawdź w rejestrze następującą wartość:

  • Kluczowa lokalizacja: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Nazwa wartości: PowerShellVersion
  • Typ wartości: REG_SZ
  • Dane wartości: <1,0 | 2.0>
Rozgwiazda
źródło
5
W przypadku programu PowerShell 3.0 wydaje się, że jest nowy, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 .
Peter Mortensen
11

Znalazłem najprostszy sposób, aby sprawdzić, czy zainstalowano:

  • uruchom wiersz polecenia (Start, Uruchom cmd, a następnie OK)
  • wpisz, powershella następnie naciśnij klawisz Return. Powinieneś otrzymać PSmonit 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, exitjeśli chcesz wrócić do wiersza polecenia ( exitponownie, jeśli chcesz również zamknąć wiersz polecenia).

Aby uruchomić skrypty, zobacz http://ss64.com/ps/syntax-run.html .

SharpC
źródło
3
Podobnie jak w przypadku zaakceptowanej odpowiedzi, to nie zwraca niczego w PowerShell 1.0. Metoda rejestru jest bardziej jednoznaczna.
Peter Mortensen,
4
Jeśli PowerShell nie był na ścieżce, ta wersja daje fałszywe wrażenie, że nie jest zainstalowana. Metoda rejestru zapewnia pełne informacje. Obecność i wersja.
Xalorous
9

$host.versionjest 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.

x0n
źródło
9

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 .

Dale Chen
źródło
8

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ś”).

Roman Pokrovskij
źródło
8
Który jest taki sam jak$PSVersionTable
Orad
6
Szukasz wersji PS? wpisz $ PSVersion [tab] [enter]. Gotowy. Nic nie trzeba pamiętać :)
orad
1
przydaje się to tylko wtedy, gdy ktoś jest zaznajomiony z używanymi sztuczkami do orurowania. W żaden sposób początkujący nie będzie w stanie zapamiętać, że cała ta składnia jest łatwiejsza niż tylko zapamiętanie $ PSVersionTable
Joseph Gabriel
1
Chłopaki, Get-Variable działa dobrze sam (jeśli wszystko, czego potrzeba, aby uzyskać wersję), przesyłanie jest tylko żartem :) Nie pamiętam też składni przesyłania.
Roman Pokrovskij
7

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 .

Daniel Elliott
źródło
7

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
Pecos Bill
źródło
4

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"
}
Atron Seige
źródło
3

Poniższe polecenie cmdlet zwróci wersję programu PowerShell.

$PSVersionTable.PSVersion.Major
Venkatakrishnan
źródło
2
$PSVersionTablejest zmienną automatyczną; obiekt. To nie jest polecenie cmdlet.
Maximilian Burszley,
1

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
)
Derpy
źródło
0

Możesz także wywołać polecenie „host” z wiersza polecenia programu PowerShell. Powinno to dać ci wartość $hostzmiennej.

Tylor Durden
źródło
3
To jest częściowo błędne. hostrozwiązuje do Get-Host. Niezależnie od tego nie jest to niezawodny sposób na uzyskanie wersji.
Maximilian Burszley
-1

Rozszerzanie odpowiedzi za pomocą operatora select:

Get-Host | select {$_.Version}
HaBo
źródło
7
Przyjęta odpowiedź brzmi „... $ Host.Version i (Get-Host). Wersja nie jest niezawodna - odzwierciedlają tylko wersję hosta, a nie silnika” .
Peter Mortensen
@PeterMortensen wygląda na to, że moja odpowiedź była przed zaakceptowaną odpowiedzią
HaBo,
2
@HaBo Na co patrzysz? Przyjęta odpowiedź pochodzi z 2009 r.
TylerH
@TylerH więc co? Nie śledzę twojego pytania. moja odpowiedź wyraźnie mówi, że stanowi rozszerzenie przyjętej odpowiedzi. jest to wersja uproszczona.
HaBo
2
@HaBo Twój poprzedni komentarz brzmi, jakbyś uzasadniał swoją odpowiedź faktem, że została opublikowana przed zaakceptowaną odpowiedzią, co wcale nie jest. Twoja odpowiedź została opublikowana 7 lat po zaakceptowanej odpowiedzi, a 6 lat po jej odpowiedzi „faktycznie się przedłuża”; mówiąc o tym, twoja odpowiedź nie mówi wyraźnie, że jest rozszerzeniem przyjętej odpowiedzi (która nawet nie używa Get-Host).
TylerH