Jak sprawdzić, z której wersji PowerShell korzystam?

Jak sprawdzić, z której wersji PowerShell korzystam?

Autor: Krzysztof Kapustka

Opublikowano: 6/11/2015, 12:00 AM

Liczba odsłon: 9151

Od wydania 2.0 powłoki Windows PowerShell najwłaściwszą metodą sprawdzenia wykorzystywanej przez nas wersji tego interpretera jest skorzystanie ze zmiennej $PSVersionTable, która stanowi tabelaryczny wykaz wersji poszczególnych komponentów silnika PowerShell. Jak widać na poniższym wyjściu, tabela ta zawiera także listę kompatybilnych z bieżącym silnikiem starszych wersji powłoki (patrz wartość PSCompatibleVersions).

PS C:\Users\Krzysztof> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.34014
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

Jeśli chcemy, korzystając z poniższej składni możemy skupić się wyłącznie na jednej z powyższych wartości:

PS C:\Users\Krzysztof> $PSVersionTable.PSVersion

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

Nie jest to co prawda jedyny sposób sprawdzenia numeru wersji powłoki PowerShell, ale jest to metoda najbardziej właściwa. Co ważne, zmienna $PSVersionTable wprowadzona została dopiero w drugim wydaniu tego narzędzia, a co za tym idzie nie jest dostępna w wersji 1.0 interpretera PowerShell. Z tego względu starsi użytkownicy, którzy swoją przygodę z powłoką PowerShell rozpoczęli już od jej pierwszych dni, przyzwyczaili się zapewne do kilku alternatywnych metod pozyskiwania wersji silnika - polecenia cmdlet Get-Host i wartości zmiennej $Host.Version. Te wydają się co prawda zwracać wyniki zgodne z wartością PSVersion zmiennej $PSVersionTable, jednak nie powinniśmy na nich do końca polegać. Dlaczego?

PS C:\Users\Krzysztof> $Host.Version

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1
PS C:\Users\Krzysztof> Get-Host


Name             : ConsoleHost
Version          : 4.0
InstanceId       : 445b1f0d-9674-4f30-8389-9f4d898e6115
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : pl-PL
CurrentUICulture : pl-PL
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Get-Host oraz $Host.Version, jak sama nazwa wskazuje, odnoszą się do hosta interpretera PowerShell, którym nie musi być tylko i wyłącznie natywny interfejs konsoli firmy Microsoft. Hostem powłoki mogą być też środowiska graficzne firm trzecich, takie jak na przykład PowerGUI. W takim przypadku oba te polecenia zamiast zwrócić nam wersję silnika powłoki PowerShell, podadzą nam wersję produktu danej firmy. Podobnie rzecz ma się w przypadku uruchamiania powłoki w ramach sesji zdalnej PSRemoting, gdzie polecenia te zwrócą nam wersję silnika PowerShell na serwerze zdalnym, a nie tego, na którym aktualnie pracujemy.

No dobrze, wersję PowerShell sprawdzamy więc zmienną $PSVersionTable. A co jeśli taka zmienna nie istnieje? Oznacza to, że mamy do czynienia z wersją 1.0 tego interpretera.