PowerShell-Version prüfen mit #requires und Systemvariablen

    $PSVersionTable gibt Auskunft über die Version von PowerShell.Die letzten Windows-Updates enthielten stets eine neue Version von PowerShell, die den Funktionsumfang der Sprache meist deutlich erweiterte. In gemischten Umgebungen kann man sich daher nicht darauf verlassen, dass alle verwendeten Cmdlets und sonstige sprachliche Mittel auf jedem PC vorhanden sind. Eine Prüfung der Versionsnummer oder der Verfügbarkeit von Befehlen ist hier angeraten.

    Wenn man bereits genau weiß, welche Version von PowerShell für ein bestimmtes Script erforderlich ist, dann kann man mit der Anweisung #requires verlässlich unterbinden, dass es in einer Umgebung abläuft, der die nötigen sprachlichen Voraussetzungen fehlen:

    #requires -version 3.0

    Bindet man diese Anweisung am Anfang eines Scripts ein, dann bricht PowerShell seine Ausführung mit einer entsprechenden Meldung ab, wenn nicht mindestens die Version 3.0 installiert ist.

    Ausführung von Modulen abhängig machen

    Manchmal mag nicht die Version von PowerShell das entscheidende Kriterium sein, um ein Script ausführen zu können, sondern das Vorhandensein eines bestimmten Moduls oder einer bestimmten Version davon. Hier hilft die Anweisung #requires mit dem Parameter -modules, allerdings erst ab PowerShell 3.0:

    #requires -modules Hyper-V

    In diesem Beispiel setzt ein Script das Modul Hyper-V voraus. Ist es nicht geladen, dann holt PowerShell dies automatisch nach, fehlt es auf dem System ganz, dann bricht das Script ab. Benötigt man eine bestimmte Version eines Modules, dann kann man diese in Form einer Hash-Tabelle festlegen:

    #requires -modules @{ModuleName="Hyper-V";ModuleVersion=1.1.0.0}

    Die Anweisung #requires eignet sich übrigens auch, um zu gewährleisten, dass ein Script mit administrativen Rechten ausgeführt wird (-RunAsAdministrator) oder dass ein bestimmtes Snap-in vorhanden ist (-PSSnapin).

    Versionsnummer abfragen

    Bevor man endgültig herausfindet, welche Version von PowerShell ein Script benötigt oder unter welcher ein bestimmtes Modul existiert, wird man es häufig in verschiedenen Umgebungen ausprobieren. Treten Probleme auf, die man in einer älteren Ausführung nicht umgehen kann, dann braucht man deren Systeminformationen, allen voran die Versionsnummer. Diese kann man auf mehreren Wegen ermitteln.

    Der einfachste besteht darin, den Wert der dafür zuständigen Systemvariablen $PSVersiontable abzufragen. Sie enthält eine Eigenschaft namens PSVersion, die detaillierte Informationen ausgibt:

    $PSVersionTable.PSVersion

    Möchte man herausfinden, ob erforderliche Module auf bestimmten Windows-PCs vorhanden sind, dann kann man das mit Hilfe von Get-Module erfahren:

    Get-Module Hyper-V

    Dieser Aufruf gibt zudem die Versionsnummer des Moduls aus. Zu beachten ist hier jedoch, dass ein Modul durch diesen Befehl nicht automatisch geladen wird, so dass man dies mit Hilfe von Import-Module tun muss, um sicherzugehen, dass es wirklich nicht vorhanden ist.

    Keine Kommentare