PowerShell 7.0: Funktionsumfang

Der Dotnet-Doktor  –  0 Kommentare

Die PowerShell 7.0 hat sich hinsichtlich des Befehlsumfangs stark an die PowerShell 5.1 angenähert. 95 Befehle fehlen aber weiterhin. Und unter Linux und macOS ist nur ein Bruchteil der Funktionen verfügbar.

Im ersten Teil meiner PowerShell-7.0-Serie habe ich mich mit der technischen Basis und der Installation der neuen PowerShell-Version beschäftigt. Nun möchte ich den Funktionsumfang im Vergleich zu den Vorgängern Windows PowerShell 5.1 und PowerShell Core 6.0/6.1/6.2 besprechen.

Bruch zwischen Version 5.1 und 6.0

Zwischen der Windows PowerShell 5.1 (nur für Windows) und PowerShell Core 6.0 (für Windows, Linux und macOS) gab es einen funktionalen Bruch. Die folgende Liste zeigt die Anzahl der verfügbaren Befehle in der jeweiligen PowerShell-Version auf der aktuellen Vorschauversion von Windows 10 20H1. Als Befehle wurden hier Commandlets und Funktionen gezählt, die bei einer Windows-10-Standardinstallation enthalten sind. Es wurden keine zusätzliche Windows-Features aktiviert und keine Zusatzsoftware installiert.

  • PowerShell 5.1 auf Windows 10 v20H1: 1586 Befehle
  • PowerShell Core 6.0 auf Windows 10 v20H1: 425 Befehle
  • PowerShell Core 6.1 auf Windows 10 v20H1: 1436 Befehle
  • PowerShell Core 6.2 auf Windows 10 v20H1: 1439 Befehle
  • PowerShell 7.0 auf Windows 10 v20H1: 1507 Befehle
  • PowerShell 7.0 auf Linux und macOS: 270 Befehle

Das Absinken der Anzahl der Befehle zwischen Windows PowerShell 5.1 (erschienen am 2. August 2016) von 1586 auf nur noch 425 in PowerShell Core 6.0 (erschienen am 20. Januar 2018) ergab sich aus drei Faktoren:

  1. Microsoft wollte einige alte Zöpfe (z.B. WMI-Commandlets der ersten Generation, Snap-Ins) abschneiden.
  2. .NET Core, die Basis für PowerShell Core, war 2018 noch nicht mächtig genug, um zahlreiche PowerShell-Befehle zu realisieren.
  3. Zahlreiche der in Windows integrierten PowerShell-Module waren nicht kompatibel zu PowerShell Core.

Unterschiede zwischen Windows PowerShell 5.1 und PowerShell 7.0

In den zwei Jahren zwischen 2018 und 2020 hat Microsoft an Punkt 2 und 3 gearbeitet. .NET Core 3.1, die Basis für PowerShell 7.0, ist nun mächtiger und damit war es auch leichter, die PowerShell-Module in Windows dazu kompatibel zu bekommen. Viele Commandlets, die in PowerShell Core 6.x fehlten, zum Beispiel für die Zwischenablage (Get-Clipboard, Set-Clipboard), die Druckerausgabe (Out-Printer) und grafische Ausgaben (Out-GridView, Show-Command, Get-Help -ShowWindow), sind in PowerShell 7.0 zurückgekehrt.

Ganz verschwunden ist der funktionale Unterschied zwischen Windows PowerShell 5.1 und PowerShell 7.0 jedoch nicht, wie folgende Rechnung zeigt:

1586 Befehle in Windows PowerShell 5.1 plus 15 neue Befehle in PowerShell 7.0 (einschließlich der Neuerungen aus PowerShell Core 6.0 bis 6.2) minus 95 entfallene entfallene Befehle in PowerShell 7.0 gegenüber Windows PowerShell 5.1 macht in Summe 1507 Befehle im PowerShell 7.0.

Zu den Funktionen, die es in Windows PowerShell 5.1 gibt und in der PowerShell 7.0 weiterhin fehlen, gehören insbesondere:

  • Commandlets für die Windows Management Instrumentation (WMI) der ersten Generation (WMI v1) wie Get-WmiObject und Invoke-WmiMethod. Die zweite Generation der WMI-Commandlets wie Get-CimInstance und Invoke-CimMethod ist allerdings vorhanden.
  • Beitritt zu Windows-Domänen mit Add-Computer
  • Workflows in PowerShell (die Basistechnik, Windows Workflow Foundation, gibt es in .NET Core nicht).
  • Zugriff auf das Windows-Ereignisprotokoll (Get-EventLog, Write-EventLog u.a.)
  • Unterstützung für Transaktionen (Get-Transaction, Complete-Transaction, Undo-Transaction u.a.)
  • Commandlets für den Windows-Dienst User Experience Virtualization (UE-V)
  • PowerShell-Snap-ins (Add-PSSnapin, Remove-PSSnapin). Es gibt seit PowerShell Core 6.0 nur noch Module, und dies soll auch für die Zukunft so bleiben.

Noch weniger Befehle unter Linux und macOS

Bereits in der PowerShell Core 6.x gab es Befehle, die die Plattformneutralität durchbrachen und nur auf Windows verfügbar waren (z.B. zur Dienstverwaltung, Benutzerverwaltung und Dateiberechtigungsvergabe). In PowerShell 7.0 hat sich diese Liste noch etwas um solche Befehle erweitert, die grafische Ausgaben erzeugen (z.B. Out-GridView und Show-Command). Diese Befehle basieren auf der Windows Presentation Foundation (WPF), die es in .NET Core seit Version 3.0 zwar in der .NET Core Windows Desktop Runtime gibt, die jedoch weiterhin nicht für Linux und macOS implementiert ist. Auch die in PowerShell 7.0 wieder eingeführten Befehle Out-Printer, Get-HotFix und Clear-RecycleBin funktionieren nur auf Windows.

Unter Linux und macOS fehlen alle PowerShell-Module, die nicht zum Kern der PowerShell, sondern zu Windows gehören. So findet man unter Linux und macOS lediglich 270 Befehle statt der 1507 Befehle auf Windows 10.

Unter Linux und macOS bleibt also das Problem bestehen, dass es nur sehr wenig Befehle gibt. Für Linux-Administratoren bringt die PowerShell gegenüber den klassischen Linux-Shells zu wenig Verbesserung. Für DevOps ist es hingegen eine gute Sache, dass man Skripte für Build- und Release-Pipelines schreiben kann, die plattformneutral funktionieren.