PowerShell-Versionen überprüfen: Best Practices

Im PowerShell gibt es unzählige Möglichkeiten, dasselbe zu tun (oder etwas Ähnliches). In diesem Blogbeitrag erfahren Sie jede Methode, um Ihre PowerShell-Version auf lokalen und entfernten Computern zu überprüfen. Wir werden sowohl die schlechten Methoden als auch meine empfohlene Methode abdecken.

Es gibt Websites, die verschiedene Möglichkeiten anzeigen, Ihre Powershell-Version zu überprüfen. Aber keine hat eine umfassende Liste aller Methoden zusammengestellt. Das habe ich beschlossen zu ändern.

All diese Methoden sollten sowohl in Windows PowerShell als auch in PowerShell Core funktionieren. Diese Methoden sollten auch in Windows PowerShell Version 1.0 bis hin zu PowerShell 7 funktionieren.

Die Methoden, um die Version von PowerShell herauszufinden, sind folgende:

  1. Die Eigenschaft (Get-Host).Version
  2. Die Eigenschaft $host.Version
  3. Die Registry (nur Windows PowerShell)
  4. Die Eigenschaft $PSVersionTable.PSVersion

Lassen Sie uns alle Methoden zur Ermittlung der PowerShell-Version von der weniger empfohlenen bis zur empfohlensten Methode durchgehen.

Get-Host

PowerShell hat ein Konzept namens Hosts. Ein Host ist ein Programm, das die PowerShell-Engine hostet. Es ist nicht die PowerShell-Engine selbst. Die PowerShell-Konsole oder ein Code-Editor mit integriertem Terminal sind PowerShell Hosts.

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

Wenn Sie (Get-Host).Version ausführen, sehen Sie, dass es eine Versionsnummer zurückgibt, die wie die Versionsnummer des PowerShell-Engines aussehen könnte. Schein kann trügen.

Hier habe ich Get-Host unter Windows PowerShell 5.1 ausgeführt und Sie können sehen, dass es mit 5.1.17134.858 zurückkommt. Dies sieht nach einer legitimen Version aus.

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

Manchmal ist jedoch, wenn Sie Get-Host in einem integrierten Terminal ausführen, die Version nicht dieselbe. Obwohl normalerweise das Host dieselbe Version des Engines repräsentiert, muss es das nicht zwangsläufig immer tun.

Überprüfen Sie die Powershell-Version über Get-Host auf Remote-Computern

Auch wenn Get-Host scheint, die gleiche Version zurückzugeben, wenn es auf einem lokalen Computer ausgeführt wird, tut es dies auf Remote-Computern niemals.

Zum Beispiel, lassen Sie uns Get-Host auf einem entfernten Windows Server 2016-Server über Invoke-Command ausführen und sehen, was passiert.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

Das letzte Mal, als ich nachsah, war es nicht möglich, PowerShell v1 auf Windows Server 2016 auszuführen.

Sich auf Get-Host zu verlassen, ist rundum eine schlechte Idee.

Überprüfen Sie die Powershell-Version über den Befehl $host.Version

Das Referenzieren von $host.Version ist ein weiterer Weg, um die Powershell-Version zu überprüfen. Die Variable $host ist eine automatische Variable, die die gleiche Ausgabe wie Get-Host zurückgibt.

Referencing $host.Version

Es ist nichts Besonderes an dieser Methode. Es ist einfach dasselbe wie das Ausführen von Get-Host.

$host.Version auf Remote-Computern

Sie werden dasselbe Verhalten über PowerShell Remoting mit $host.Version sehen wie beim Ausführen von Get-Host.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

Achtung, Will Robinson!

Registrierung

Wenn Sie PowerShell selbst nicht öffnen möchten, können Sie auch die Registrierung überprüfen. Die Version von PowerShell ist unter einem Wert im Registrierungsschlüsselpfad HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine versteckt. Dieser Registrierungsschlüssel hat einen Wert namens PowerShellVersion, auf den Sie mit Get-ItemProperty verweisen können.

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

Sie können sehen, dass diese Version ähnlich ist, aber die Überarbeitung nicht wie die anderen Optionen enthält.

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

Verwendung anderer Werkzeuge

Die Verwendung der Registrierung bedeutet auch, dass Sie PowerShell überhaupt nicht verwenden müssen, um die Version zu finden. Sie können Befehle von der Eingabeaufforderung oder einem anderen Tool ausführen, das die Registrierung lesen kann.

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

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

Registrierung auf Remote-Computern

Die Registrierung ist statisch und die Werte ändern sich weder lokal noch remote. Sie können sicher sein, dass das, was Sie lokal sehen, dasselbe ist wie das, was Sie remote sehen.

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

Die gleiche Version lokal und remote anzuzeigen, ist gut. Aber ich habe eine bessere Möglichkeit, es Ihnen mit der automatischen Variable $PSVersionTable zu zeigen.

Überprüfen Sie die Powershell-Version mit dem Befehl $PSVersionTable.PSVersion

Die letzte und endgültige Methode besteht darin, auf die Eigenschaft PSVersion der automatischen Variablen $PSVersionTable zu verweisen. Diese Methode stellt immer den PowerShell-Engine dar.

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

Die automatische Variable $PSVersionTable ist eine schreibgeschützte Hashtabelle, die speziell Informationen zur Version der PowerShell-Engine zurückgibt. Diese automatische Variable gibt nicht nur die Version zurück, sondern auch die PSEdition. Diese Eigenschaft kann entweder Core oder Desktop sein, um weitere Informationen zur Ausgabe von PowerShell bereitzustellen.

$PSVersionTable output

$PSVersionTable auf Remote-Computern

Die Verwendung der automatischen Variablen $PSVersionTable ist sowohl lokal als auch remote genau. Sie können unten sehen, dass durch das Einbetten von $PSVersionTable.PSVersion in einem Skriptblock und das Ausführen dieses Codes auf einem Remote-Computer dieselbe Version zurückgegeben wird.

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

Zusammenfassung

In diesem Blogbeitrag haben Sie alle Möglichkeiten gelernt, die Version von PowerShell sowohl lokal als auch remote zu überprüfen. Ich hoffe, die ersten Methoden haben Ihnen eine Vorstellung davon gegeben, welche Möglichkeiten es nicht gibt, die Version zu überprüfen!

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

Wenn ich eine Methode verpasst habe, lassen Sie es mich bitte in den Kommentaren wissen. Ich werde den Beitrag gerne aktualisieren und Ihnen Anerkennung geben.

Source:
https://adamtheautomator.com/powershell-version/