PowerShell 7: Vier neue Operatoren in Preview 5, offizielles Release im Januar

    PowerShell 7 Preview 5Der desig­nierte Nach­folger für Windows Power­Shell und Power­Shell Core nähert sich seiner offi­ziellen Fertig­stellung. Die kürz­lich erschienene Preview 5 bringt jedoch noch eine Reihe neuer Features, darunter vier Opera­toren, ein Cmdlet für die Fehler­analyse und eine Benach­richtigung bei Updates.

    Der Roadmap von Microsoft zufolge soll im November eine letzte Preview folgen, bevor im Dezember der Release Candidate erscheint. Dieser soll auf der finalen Version von .NET Core 3.1 beruhen und bereits alle Features enthalten. PowerShell 7 wird nach diesen Planungen offiziell im Januar verfügbar sein.

    Längerer Support als bei PowerShell Core

    Bei der ersten Version für den produktiven Einsatz handelt es sich dann um ein Long Term Servicing (LTS) Release. Die Ankündigung nennt aber keinen Zeitpunkt, bis zu dem Microsoft PowerShell 7 GA unterstützen wird.

    Nachdem aber .NET Core 3.1 ebenfalls als LTS erscheint und mindestens drei Jahre Support erhält, dürfte für PowerShell 7 das Gleiche gelten. Bei PowerShell Core hingegen endet die Unterstützung bereits 6 Monate nach dem Erscheinen einer neuen Minor Version.

    Die eben veröffent­lichte Preview 5 bringt einige interessante Neuerungen. Nachdem die Preview 4 einen ternären Operator nach dem Vorbild von C und davon abgeleiteten Sprachen einführte, kommen nun vier weitere hinzu.

    Logische Verkettung von Befehlen

    Zwei von ihnen dienen dazu, Befehle logisch zu verketten ("chain operators"). Sie sind von Unix-Shells bekannt und werden auch von cmd.exe unterstützt. Ein logisches "und" sorgt dafür, dass der oder die nach­folgenden Befehle nur ausgeführt werden, wenn die vorgehenden erfolgreich sind:

    alias ls && "Wird nur ausgeführt, wenn der erste Befehl erfolgreich ist"

    Wie man aus diesem Beispiel entnehmen kann, verwendet PowerShell hier nicht den logischen Operator "-and", sondern übernimmt && von den Unix-Shells und cmd.exe. Der gesamte Ausdruck kann nur richtig sein, wenn alle Teilausdrücke wahr sind (Konjunktion).

    Der zweite Befehl wird nicht mehr ausgeführt, wenn der erste scheitert, weil dann das Gesamtergebnis nicht mehr true sein kann.

    Scheitert der erste Befehl, dann lässt sich dieses Ziel nicht mehr erreichen und PowerShell spart sich die Ausführung der restlichen Befehlskette. "Scheitern" kann je nach Kommando alles Mögliche bedeuten, grundsätzlich geht es aber einfach nur um den Exit-Code eines Befehls, den man in PowerShell über die Variable $? abfragen kann.

    Variiert man das obige Beispiel so, dass Get-Alias einen nicht definierten Kurznamen finden soll, dann ist sein Rückgabe false:

    alias xx && "Wird nicht ausgeführt, weil 'alias xx' den Wert false zurückgibt"

    Keine Rolle spielen hier Boolsche Werte als Ergebnis eines Befehls:

    1 -eq 2 && "Wird ausgeführt, weil es auf Boolsche Werte nicht ankommt"

    In diesem Beispiel ergibt der erste Ausdruck false, weil 1 offensichtlich nicht gleich 2 ist. Dennoch führt PowerShell auch den zweiten Teil aus, weil der Vergleich ja erfolgreich absolviert wurde.

    Neben der Verkettung über ein logisches "und" führt PowerShell 7 auch ein "oder" ein, das als "||" geschrieben wird:

    dir *.crt || "Wird nicht ausgeführt, wenn dir-Befehl erfolgreich"

    Findet Get-ChildItem (Alias "dir") eine Datei mit der Endung .crt im aktuellen Verzeichnis, dann ist der Befehl erfolgreich und alles nach dem Operator "||" wird ignoriert.

    Eine Disjunktion ist bereits wahr, wenn der erste Befehl erfolgreich ist. Deswegen ignoriert PowerShell dann den zweiten Teil.

    Damit eine Verknüpfung mit "oder" (Disjunktion) insgesamt wahr ergibt, reicht es nämlich, wenn eine Teilaussage wahr ist. Ist das der Fall, dann ignoriert PowerShell den Rest des Ausdrucks.

    Der wesentliche Vorteil der beiden Operatoren besteht darin, dass sie eine kürzere Schreibweise erlauben als ein äquivalentes if-Statement:

    Prüfung auf $null

    Ähnlich verhält es sich mit dem Operator "??", der eine kürzere Variante eines Vergleichs mit $null erlaubt. Angenommen, die Variable $test wurde noch nicht initialisiert, dann würde dieses Beispiel

    $test ?? "Variable test ist null"

    die Zeichen­kette nach dem ??-Operator ausgeben. Ist der Ausdruck vor dem ?? jedoch $false, dann kommt der zweite Teil nicht zum Zug, weil nur die Überein­stimmung mit $null das Ergebnis $true liefert:

    1 -eq 2 ?? "Vergleich ist falsch. Meldung wird nicht angezeigt"

    Auch hier geht es also nicht um den Vergleich mit Boolschen Werten.

    Variable auf den Wert $null prüfen mit dem neuen ??-Operator

    Meistens will man aber verhindern, dass eine Aktion ausgeführt wird, wenn ein Ausdruck den Wert $null hat, um uner­wünschte Effekte zu vermeiden. In diesem Fall müsste man den Testausdruck negieren:

    -not($test) ?? "Wird nicht ausgeführt, wenn Variable test null ist"

    Möchte man diesen Zustand gleich ändern und dem Testausdruck einen anderen Wert als $null zuweisen, dann kommt der vierte der neuen Operatoren ins Spiel, nämlich "??=":

    $test ??= "Variable test ist nicht mehr null"

    Wenn eine Variable den Wert $null hat, dann kann man ihr mit ??= gleich einen neuen Wert zuweisen.

    Die Zuweisung der Zeichenkette zu $test erfolgt nur, wenn die Variable erfolgreich auf den Wert $null getestet wurde.

    Weitere Neuerungen

    Die Preview 5 bringt noch einige kleinere Verbes­serungen. So kann man die Werte für Variablen über Autover­vollständigen abrufen, wenn diese vorher fest definiert wurden. Das gilt zum Beispiel für Aufzählungen mit enum oder für Parameter, deren zulässige Werte mit [ValidateSet()] festgelegt wurden.

    Eine kleine Änderung macht den Einsatz von Select-String benutzer­freundlicher. Standard­mäßig hebt es nun die Treffer für den Suchausdruck in der Zeichenkette optisch hervor. Über den Schalter NoEmphasis kann man dieses Verhalten bei Bedarf abstellen.

    Select-String hebt in PowerShell 7 die gefundenen Treffer hervor.

    Nachdem ein wesentliches Bestreben bei PowerShell 7 darin bestand, alle Cmdlets aus Windows PowerShell zu unterstützen, nachdem PowerShell Core hier anfangs große Lücken ließ, reicht die Preview 5 mit Get-HotFix eines der letzten noch fehlenden nach. Mit der Preview 4 kam Out-GridView dazu.

    Ein weiteres neues Cmdlet, das es unter Windows PowerShell aber nicht gibt, hilft bei der Suche nach Fehlern. Es handelt sich dabei um Get-Error, das detaillierte Informationen über zuletzt ausgeführte, gescheitere Befehle liefert. Ohne Argumente erhält man nur Auskunft über den letzten Fehler, mit dem Parameter Newest kann man eine gewünschte Zahl angeben.

    Detaillierte Informationen zu den zuletzt aufgetretenen Fehlern mit Get-Error abrufen.

    Schließlich wird PowerShell 7 in Zukunft darüber informieren, dass eine neuere Version erschienen ist. Das kann sowohl eine Preview als auch eine stabile Version betreffen. Das  Feature soll sich auch deaktivieren lassen, Details dazu finden sich aktuell aber noch nicht.

    Diese Anleitung zeigt, wie man PowerShell 7 Preview unter Windows oder Linux installiert.

    Keine Kommentare