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?

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

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

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    

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"}
}

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


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/


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>

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 .


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.


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 .


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


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 .


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

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"
}


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
)

0

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


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}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.