Jedną z istotniejszych rzeczy, na które warto zwrócić uwagę pracując z PowerShellem (szczególnie na początku swojej przygody) jest jego wersja. Informacja ta jest szczególnie istotna jeżeli planujesz wykonywać skrypty zdalnie na różnych maszynach. Jak zatem poprawnie wykonać to zadanie?
$PSVersionTable
Najszybszą, a zarazem najbardziej prawidłową metodą jest uruchomienie konsoli PowerShell i wpisanie $PSVersionTable. Jest to specjalna, automatyczna zmienna, pod którą kryje się seria atrybutów. W przypadku identyfikacji wersji interesuje nas tylko wartość PSVersion, która wskazuje na aktualną wersję PowerShella.
Get-Host to nie $PSVersionTable
Do niedawna uważałem, że wersję PowerShella można sprawdzić również za pomocą cmdletu Get-Host. Jak wielkie było moje zdziwienie, gdy pewnego dnia chciałem sprawdzić pewną rzecz w Visual Studio Code i wpisałem właśnie Get-Host. W wyniku uzyskałem zupełnie coś innego.
Po zagłębieniu się w temat zrozumiałem, że program powershell.exe jak i powershell_ise.exe to tylko host (gospodarz) dla docelowej instancji PowerShella. I właśnie wersję tego hosta uzyskasz cmdletem Get-Host. Co ciekawe w przypadku konsoli Windows PowerShell jak i PowerShell ISE zarówno host jak i sam PowerShell występuje w identycznej wersji, co może być trochę mylące. Dodatkowo cmdlet ten nie działa zdalnie.
Zmienna $Host
Zmienna $Host jest kolejną zmienną automatyczną, która zawiera obiekt, identyczny jak ten zwracany przez Get-Host. Ponieważ obie te metody są wymienne, nie zwracają prawidłowej wersji silnika PowerShell i nie działają zdalnie. Dlatego raczej nie zaleca się ich stosowania.
Rejestr Windows
Konsola PowerShell posiada również swoje wpisy w rejestrze sytemu. Jeden z nich a konkretnie \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine i klucz PowerShellVersion odpowiedzialny jest właśnie za wersję. Jeżeli natomiast zamiast PowerShell rozwiniesz PowerShellCore, a następnie InstalledVersions, odnajdziesz info o wersji.
Możesz również skorzystać z polecenia:
Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
(Get-ChildItem -Path HKLM:\SOFTWARE\Microsoft\PowerShellCore\InstalledVersions -ErrorAction stop | Get-ItemProperty -Name SemanticVersion ).SemanticVersion
Zdalne maszyny
W przypadku zdalnych hostów wszystkie poprzednie metody (za wyjątkiem Get-Host i $Host) zadziałają z tym, że należy dodać Invoke-Command.
Zauważ, że wykonałem polecenie w konsoli PowerShell 7, ale w odpowiedzi otrzymałem wersję 5.1, czyli wersję dla Windows PowerShell. Dzieje się tak, ponieważ domyślnie Invoke-Command zawsze łączy się ze zdalnym punktem końcowym Windows PowerShell, chyba że określi się inaczej. Wtedy do polecenia należy dodać parametr -ConfigurationName.
Źródła:
https://4sysops.com/wiki/how-to-check-the-powershell-version/
Pingback: Instalacja PowerShell 7.x - ITPhilosophy