Microsoft gibt PowerShell 7 frei: die wichtigsten Neuerungen im Überblick

    PowerShell 7Rund ein halbes Jahr nach der Preview 1 veröffent­licht Micro­soft nun PowerShell 7. Wie PowerShell 6 Core handelt es sich dabei um eine Cross-Platt­form-Version, die auch unter macOS und Linux läuft. PowerShell 7 ver­bessert die Kompa­tibilität mit Windows Power­Shell und bringt einige Neuerungen in der Sprache selbst.

    Anders als die Core-Version soll PowerShell 7 nicht bloß parallel zu Windows PowerShell existieren, sondern der Nachfolger für beide werden. Microsoft gab bereits bei der ersten Ankündigung bekannt, dass Windows PowerShell nicht mehr weiter­entwickelt wird und Innovationen nur noch der Multi-Plattform-Ausführung zugute kommen.

    Kompatibilität mit Windows PowerShell

    Aus diesem Grund lag ein Schwerpunkt der Entwicklung von PowerShell 7 darauf, eine möglichst hohe Kompatibilität mit Windows PowerShell zu erzielen. Dies wurde zum einen durch den Umstieg auf .NET Core 3.1 erreicht, das wesentlich mehr API-Funktionen des vollständigen Frameworks unterstützt als .NET Core 2.x in PowerShell 6.

    Die meisten der vorinstallierten Module von Windows-PowerShell sind bereits mit PowerShell 7 kompatibel.

    Zum anderen lassen sich inkompatible Module über implizites Remoting nutzen. Dabei startet PowerShell 7 im Hintergrund eine Session auf Basis von Windows PowerShell, wo die betroffenen Cmdlets ausgeführt werden. Die Kommunikation erfolgt für den Benutzer transparent über PowerShell-Remoting. Für diesen Zweck unterstützt das Cmdlet Import-Module nun den Parameter UseWindowsPowerShell.

    Unterschiedliche Funktionsumfänge

    Der Dokumentation der Module und Cmdlets zufolge gibt es noch eine ganze Reihe von Befehlen, die in der Version 7 noch nicht verfügbar sind. Dazu zählen demnach etwa all jene zur Verwaltung lokaler User und Gruppen, mehrere Cmdlets für das Management von Jobs und für Diagnose oder für den Zugriff auf das Eventlog.

    Der Dokumentation zufolge stehen die Cmdlets aus dem Modul Microsoft.PowerShell.LocalAccounts nicht zur Verfügung, lassen sich aber trotzdem nutzen.

    Allerdings zeigt sich, dass umgekehrt auch PowerShell 7 über mehrere Cmdlets verfügt, die es in Windows PowerShell nicht gibt und nicht geben wird. Darunter fallen etwa Get-Error, Remove-Service, Get-Uptime, Join-String oder solche für das Verarbeiten von Markdown.

    PowerShell-Anwender finden sich somit aktuell in der Situation, dass die Version 7 noch nicht alle Möglichkeiten der alten Shell bietet, aber sie umgekehrt immer mehr Neuerungen erhält, auf die sie in Windows PowerShell verzichten müssen.

    Sprachänderungen

    Dies betrifft nicht nur die erwähnten Cmdlets, sondern auch eine ganze Reihe von Änderungen an der Sprache selbst. Dazu zählt die Einführung eines ternären Operators nach dem Muster

    $true ? "Wahr" : "Falsch"

    sowie die logische Verkettung von Befehlen wie von den Unix-Shells bekannt:

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

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

    Hinzu kommt ein Operator für die Prüfung eines Ausdrucks auf $null (Null-coalescing):

    $test ?? "Variable test ist null"

    Zu den exklusiven Neuerungen von PowerShell 7 gehören auch die parallele Ausführung von ForEach-Object oder die aktuell noch experi­mentellen Operatoren, mit denen man den Zugriff auf Methoden und Eigenschaften von Objekten vermeidet, deren Wert Null ist.

    Inkonsistenz zwischen den Plattformen

    Eine noch größere Funktionslücke klafft zwischen den Ausführungen von PowerShell 7 für die verschiedenen Plattformen. Während die verbesserte Kompatibilität mit Windows PowerShell insgesamt zu einem großen Funktionsumfang führt, beschränkt sich dieser unter Linux und macOS auf die Module, die zum Lieferumfang von PowerShell 7 gehören. In der oben erwähnten Dokumen­tation sind 173 Cmdlets mit "Windows only" markiert.

    Wie bereits bei PowerShell 6 basiert das Remoting zwischen den verschiedenen OS auf SSH, während von Windows zu Windows nach wie vor WinRM unterstützt wird. Ersteres aktiviert man bei den einschlägigen Cmdlets wie Enter-PSSession, indem man den Remote-Rechner über den Parameter HostName angibt. Dagegen führt die Verwendung von ComputerName wie gewohnt zu einer Verbindung über WinRM.

    Systemvoraussetzungen und Verfügbarkeit

    PowerShell 7 läuft unter Windows 7 und Server 2008 R2 oder höher, macOS 10.13 oder neuer sowie auf ver­schiedenen Linux-Distributionen (RHEL / CentOS 7+, Fedora 29+, Debian 9+, Ubuntu 16.04+, openSUSE 15+, etc.).

    Aktuell gibt es noch keine Aussage von Microsoft, wonach PowerShell 7 künftig als Bestandteil des Betriebs­systems oder über WSUS ausgeliefert wird. Vielmehr muss man das passende Paket von Github holen.

    Installationsoptionen unter Windows

    Es enthält bereits .NET Core und man muss es abhängig vom OS mit den dortigen Mitteln installieren (siehe dazu: PowerShell 7 unter Windows und Linux installieren). PowerShell 7 lässt sich parallel zu Windows PowerShell betreiben.

    Der Support-Zyklus der Version 7 richtet sich nicht nach jenem des Betriebs­systems, sondern orientiert sich an .NET Core 3.1. Dieses ist im Dezember 2019 erschienen und erhält ab diesem Zeitpunkt drei Jahre Unterstützung. Es handelt sich bei PowerShell 7 somit um ein Long-Term-Servicing-Release.

    2 Kommentare

    Bild von Heiko
    Heiko sagt:
    8. März 2020 - 10:32

    Powershell v6 wird stillschweigend deinstalliert.

    Bild von Thommi
    Thommi sagt:
    13. Mai 2020 - 9:36

    Ebenso fehlen u. a. die get-help-Optionen -Full und -Examples. Auch nach Deinstallation von v7 stehen sie nicht mehr zur Verfügung. Was soll diese Heimlichkeit?