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.