PowerShell 7 und Windows PowerShell. Tobias Weltner
Kommentare
Kommentare sind zwar eigentlich keine Literale, denn sie dienen dazu, Anmerkungen und Notizen in Ihren Code einzufügen, und werden von PowerShell normalerweise ignoriert. Trotzdem sollen sie gleich zu Anfang besprochen werden. Spätestens wenn Sie nämlich Code speichern und ein paar Tage (oder Monate) später noch verstehen wollen, was Sie da eigentlich gemacht haben, sind ein paar erklärende Kommentare als Gedächtnisstütze Gold wert.
# verwandelt alles Folgende bis zum nächsten Zeilenumbruch zum Kommentar.
<# leitet einen (beliebig langen) Kommentar ein, der mit #> abgeschlossen wird. Hier können Sie also selbst bestimmen, wo der Kommentar enden soll. Ein Skript könnte mit einem mehrzeiligen Blockkommentar zum Beispiel wichtige Hinweise zu Autor und Historie geben:
<#
Autor: Tobias Weltner
Version: 1.2
12.12.2020: Version 1.0 - erstes Proof-of-Konzept
31.12.2020: Version 1.1 - Variablennamen bereinigt
10.01.2021: Version 1.2 - Rechtschreibfehler behoben
#>
Möglich sind aber auch Kommentare innerhalb einer Zeile, zum Beispiel um bestimmte Teile des Befehls vorübergehend »auszukommentieren«:
PS> Get-ChildItem -Path $home <#$home = Benutzerprofil#> -Recurse <#inkl. Unterordnern#>
Besondere Kommentare
Einige Kommentare sind nicht bloß persönliche Notizen, die von PowerShell höflich ignoriert werden, sondern entfalten – je nachdem, in welchem Kontext Sie sie einsetzen – erstaunliche Wirkungen:
Interaktive Konsole
Alle Zeilen, die Sie in interaktive PowerShell-Konsolen eingeben und mit
Um einen früher bereits eingegebenen Befehl erneut zu verwenden, können Sie entweder
Gespeichertes Skript
Haben Sie PowerShell-Code in einer Datei gespeichert und führen diese Datei aus, legt der Kommentar #requires am Anfang des Skripts die Voraussetzungen fest, die erfüllt sein müssen, um dieses Skript erfolgreich ausführen zu können. Sind diese Voraussetzungen nicht erfüllt, startet PowerShell das Skript erst gar nicht.
Benötigt ein Skript zum Beispiel Administratorrechte, verhindert der folgende Kommentar am Beginn eines Skripts, dass dieses Skript ohne Administratorrechte ausgeführt wird:
#requires -RunAsAdministrator
Auch eine bestimmte PowerShell-Mindestversion (hier 5.1) sowie die Verfügbarkeit eines bestimmten Moduls kann verlangt werden (Modulnamen können bei mehreren Modulen als kommaseparierte Liste angegeben werden). Sind die Voraussetzungen nicht erfüllt, startet das Skript nicht:
#requires -Version 5.1 -Modules PrintManagement
Editoren
Spezialisierte PowerShell-Editoren wie ISE oder VSCode nutzen Kommentare für Regionsdefinitionen (siehe Abbildung 2.1). Regionen lassen sich einklappen und dienen dazu, schnell die Grundstruktur (den »Blick aufs Wesentliche«) eines Skripts sichtbar zu machen, indem der Detailcode innerhalb der Regionen eingeklappt wird.
Abbildung 2.1: Ein- und ausklappbare Regionen in PowerShell-Editoren
Cmdlets: die PowerShell-Befehle
Wenn Sie Aufgaben automatisieren möchten, sind Cmdlets Ihr erster Anlaufpunkt, weil solche Befehle die Möglichkeiten der PowerShell am besten ausnutzen. Einige Cmdlets sind Ihnen bereits begegnet:
Expand-Archive # Entpackt eine ZIP-Datei.
Get-ChildItem # Listet einen Ordnerinhalt auf.
Get-Variable # Listet alle Variablen auf.
Get-History # Listet die Befehlshistorie der Konsole auf.
Get-Date # Listet ein Datum auf.
Dabei springen syntaktische Gemeinsamkeiten ins Auge: PowerShell-Befehle tragen immer einen Doppelnamen, der aus genau zwei Wortteilen besteht: einem Verb (Tätigkeit) und einem Nomen (Tätigkeitsbereich, engl. Noun), beide in Englisch und in der Einzahl (Singular), getrennt durch einen Bindestrich.
Dank dieser Systematik lassen sich PowerShell-Befehle mit Get-Command leicht aufspüren, und das ist auch nötig, denn PowerShell bietet Ihnen Tausende von Befehlen:
PS> (Get-Command -Verb * -Noun *).Count
3091
Hinweis
Runde Klammern funktionieren bei PowerShell wie in der Mathematik: Sie fassen zusammen, was darinsteht, und arbeiten mit dem Ergebnis weiter: in diesem Fall das Ergebnis des Befehls Get-Command.
Dieses Ergebnis ist eine Liste von Befehlen (ein sogenanntes Array). Die Größe solcher Listen kann man in PowerShell stets mit Count abfragen. Und weil das ein weiteres Grundprinzip ist, könnten Sie auf diese Weise auch die Anzahl vieler weiterer Dinge feststellen:
PS> (Get-Service).Count
292
PS> (Get-Process).Count
252
PS> (Get-Process -Name p*).Count
7
PS> (Get-ChildItem -Path c:\windows -Filter *.log).Count
8
Wenn Sie mit PowerShell künftig eine Aufgabe lösen möchten, überlegen Sie sich, was das gesuchte Cmdlet eigentlich genau für Sie tun soll, getrennt nach Tätigkeit (Verb) und Tätigkeitsbereich (Noun).
Dabei können Sie sich an Befehlsnamen orientieren, die Sie vielleicht schon kennen. In der Einleitung haben Sie Expand-Archive kennengelernt, mit dem man ZIP-Archive auspacken kann. Wie könnte man wohl umgekehrt Dateien in ein neues ZIP-Archiv verpacken?
Nach Tätigkeitsbereich suchen (»Noun«)
Expand-Archive nutzt als zweiten Namensteil das Noun Archive. Um ähnliche Cmdlets zu finden, die auch etwas mit »Archiven« zu tun haben, suchen Sie mit Get-Command nach Cmdlets, die dieses Noun ebenfalls verwenden:
PS> Get-Command -Noun Archive