Tags: PowerShell, Troubleshooting
Der designierte Nachfolger für Windows PowerShell und PowerShell Core nähert sich seiner offiziellen Fertigstellung. Die kürzlich erschienene Preview 5 bringt jedoch noch eine Reihe neuer Features, darunter vier Operatoren, ein Cmdlet für die Fehleranalyse und eine Benachrichtigung 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öffentlichte 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 nachfolgenden 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).
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.
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 Zeichenkette nach dem ??-Operator ausgeben. Ist der Ausdruck vor dem ?? jedoch $false, dann kommt der zweite Teil nicht zum Zug, weil nur die Übereinstimmung 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.
Meistens will man aber verhindern, dass eine Aktion ausgeführt wird, wenn ein Ausdruck den Wert $null hat, um unerwü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"
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 Verbesserungen. So kann man die Werte für Variablen über Autovervollstä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 benutzerfreundlicher. Standardmäß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.
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.
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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Ähnliche Beiträge
- Windows-Sicherheit öffnet sich nicht: Store-App mit PowerShell zurücksetzen
- Updates in WSUS importieren mit Internet Explorer oder PowerShell
- WSUS-Speicherplatz zurückgewinnen: Alte und ersetzte Updates löschen
- Invoke-WebRequest: Es konnte kein geschützter SSL/TLS-Kanal erstellt werden
- DHCP-Server analysieren mit PowerShell
Weitere Links