Pytanie Określ zainstalowaną wersję PowerShell


Jak mogę ustalić, która wersja PowerShell jest zainstalowana na komputerze i czy w ogóle jest zainstalowana?


2085
2017-12-01 11:30


pochodzenie


Przestępca, któremu należy zadać to pytanie. Firma Microsoft powinna zapewnić spójny sposób znajdowania najnowszej wersji dla wszystkich zainstalowanych programów. - user1040323
Ten spójny sposób byłby menedżerem pakietów, czymś, co lubię za każdym razem, gdy korzystam z Linuksa. - aaaaaa


Odpowiedzi:


Posługiwać się $PSVersionTable.PSVersion określić wersję silnika. Jeśli zmienna nie istnieje, można założyć, że silnik jest wersją 1.0.

Zauważ, że $Host.Version i (Get-Host).Version nie są wiarygodni - odzwierciedlają tylko wersja hosta, a nie silnik. PowerGUI, PowerShellPLUS itd. To wszystkie aplikacje hostingowe, i oni ustawią wersję hosta, aby odzwierciedlić ich produkt wersja - która jest całkowicie poprawna, ale nie jest tym, czego szukasz.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1

2802
2018-01-19 11:06



Hmm ... zdrap ostatniego komentarza. Wygląda na to, że PS2 jest zainstalowany, ale niektóre funkcje są niedostępne i z jakiegoś powodu katalog instalacyjny ma nazwę "1.0". Dzięki Microsoft. - Daniel Cassidy
$PSVersionTable jest bardziej niezawodny i zwraca $ PSVersion. Możesz także użyć $PSVersionTable.PSVersion. Nawet jeśli jesteś podłączony zdalnie do urządzenia działającego w innej wersji (invoke-command -computername myRemotePC -Credential foo {$host}), to wygląda jak $host pokaże najniższą wersję, na jaką zgodzili się na serializację. Podczas $PSVersionTable wyświetli prawdziwą wersję. Mam nadzieję, że to pomogłoby komuś ... - vulcan raven
Wygląda na to, że $ host.Version nie jest dobrym wyborem ... Jeśli zdalnie uruchomisz maszynę z PowerShell 3, otrzymasz 1,0, ponieważ RemotingHost wydaje się być v1. Używanie $ PSVersionTable poprawnie zwraca 3. - Danny Tuppeny
-1 ponieważ to nie odpowiada, w jaki sposób ustalić, czy PowerShell jest zainstalowany w ogóle, o co pytano w pierwotnym pytaniu. Microsoft zaleca sprawdzenie rejestru aby sprawdzić, która wersja (jeśli jest zainstalowana) jest zainstalowana. Jak podano na stronie z linkami, ta metoda jest jedyną gwarantowaną, że działa długo. - Starfish
@Starfish Wyświetlone polecenie uruchamia Powershell przy użyciu wiersza polecenia. Czy polecenie nie byłoby po prostu błędne, gdyby nie znaleziono "powershell", jeśli nie jest zainstalowane? - jpmc26


Ja też 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

371
2017-12-01 11:34



Dziękuję Ci! Uwaga: W moim XP, w którym ręcznie zaktualizowałem z wersji 1 Powershell, rzeczywiste ścieżki folderów i rejestru (wprowadzające w błąd ?!) odnoszą się do v1 NOT v2. Jest tak, jak określają to tutaj inni, ale właśnie dlatego tak się martwiłem, czy go zainstalowałem. Moja ścieżka jest; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0 - AnneTheAgile
Jeśli tabela $ psversiontable nie istnieje, to całkowicie bezpiecznie założyć, że jesteś na v1.0 - i hej presto, która również odpowiada na twoje pytanie. $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). - x0n
Miły. Nawet uzyskanie głównej wersji jest więcej niż wystarczające przez większość czasu poprzez cmdlet get-host. - RBT
Przyjęta odpowiedź stwierdza "... $ Host.Version i (Get-Host) .Version nie są niezawodne - odzwierciedlają tylko wersję hosta, a nie silnik". - Peter Mortensen


Aby ustalić, czy PowerShell jest zainstalowany, możesz sprawdzić rejestr istnienia

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

i

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

oraz, jeśli istnieje, czy wartość wynosi 1 (dla zainstalowanego), zgodnie z opisem w poście na blogu Sprawdź, czy PowerShell jest zainstalowany i czy nie.

Aby określić wersję zainstalowanego programu PowerShell, można sprawdzić klucze rejestru

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

i

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion

Aby określić wersję programu PowerShell zainstalowaną ze skryptu .ps1, można użyć poniższej jedno-liniowej, jak to opisano na stronie PowerShell.com w Którą wersję PowerShell używam?.

$isV2 = test-path variable:\psversiontable

Ta sama strona daje także funkcję zwracania wersji:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}

87
2017-12-01 14:37



Przydatne, ponieważ na serwerze Windows 2003 nie mogłem znaleźć wpisu menu Start dla PowerShell (było tam, ale nie było oczywiste), ale klucz rejestru odpowiedział na moje pytanie. - Holistic Developer
+1. To także jest metoda zalecana przez Microsoftdo wykrywania. - Starfish
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


Możesz spojrzeć na wbudowaną zmienną, $psversiontable. Jeśli nie istnieje, masz V1. Jeśli istnieje, dostarczy Ci wszystkich potrzebnych informacji.

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    

77
2018-04-25 13:47





Chcę tylko dodać moje 2 centy tutaj.

Możesz bezpośrednio sprawdzić wersję z jedną linią tylko poprzez wywołanie powershell zewnętrznie, na przykład z wiersza polecenia

powershell -Command "$PSVersionTable.PSVersion"

EDYTOWAĆ:

Według @psaul ty mogą faktycznie mają jedno polecenie, które jest agnostyczne od tego, skąd się wzięło (CMD, Powershell lub Pwsh), dziękuję za to.

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" 

Testowałem i działało bezbłędnie na CMD i Powershell

image


23
2018-03-10 11:32



Z tą próbą dostaję ten okropny błąd: "System.Collections.Hashtable.PSVersion: Termin" System.Collections.Hashtable.PSVersion "nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcji, pliku skryptu lub programu operacyjnego. pisownia nazwy lub jeśli ścieżka została uwzględniona, sprawdź, czy ścieżka jest poprawna i spróbuj ponownie. ". Więc nie zawsze działa - Gonmator
Cieszę się, że to wskazałeś, ponieważ dobrze jest znać przypadki narożne, ale myślę, że nadal działa dla większości ludzi. - Patrick Bard
@tresf pozwala mi używać słów w mojej odpowiedzi, aby zapobiec dalszym nieporozumieniom. - Patrick Bard
@PatrickBard, proszę. - tresf
@tresf (i @Gonmator) MOŻESZ uruchomić to agnostycznie z CMD, PowerShell, a nawet Pwsh (PS 6.0), ale musisz użyć tej formy: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (to będzie działa we wszystkich przypadkach) - PSaul


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

  1. Kliknij przycisk Start, kliknij polecenie Wszystkie programy, kliknij akcesoria, kliknij polecenie Windows PowerShell, a następnie kliknij polecenie Windows PowerShell.
  2. W konsoli Windows PowerShell wpisz następujące polecenie w wierszu polecenia, a następnie naciśnij klawisz ENTER:

    Get-Host | Wersja Select-Object

Zobaczysz dane wyjściowe, które wyglądają tak:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/


19
2018-06-17 07:59



Zakładasz, że 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ć PowerShell, spróbuj uruchomić go w standardzie, a następnie, jeśli nie znajdziesz ikony, której szukasz, możesz spróbować uruchomić ją z poziomu wiersza poleceń. Nie sądzę, żebyś zaczął od rejestru. - Eclipses
Przyjęta odpowiedź stwierdza "... $ Host.Version i (Get-Host) .Version nie są niezawodne - odzwierciedlają tylko wersję hosta, a nie silnik". - Peter Mortensen


Zalecana przez Microsoft metoda zgodna z metodą forward do sprawdzania, czy PowerShell jest zainstalowany i określenie zainstalowanej wersji jest spojrzenie na dwa konkretne klucze 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 można zagwarantować długotrwałego działania.

Aby sprawdzić, czy dowolna wersja PowerShell jest zainstalowany, sprawdź, czy w rejestrze nie ma następującej wartości:

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

Sprawdzić czy wersja 1.0 lub 2.0 PowerShell jest zainstalowany, sprawdź, czy w rejestrze nie ma następującej wartości:

  • 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>

18
2017-11-04 10:24



W przypadku PowerShell 3.0 wydaje się, że jest nowy, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3. - Peter Mortensen
To nie działa na win7. Wierzę, że klucze rejestru Powershell są teraz usuwane. - N-ate