12. Dez 2022
Lesedauer 16 Min.
Kraftmuschel, kernlos
PowerShell 7 versus Windows PowerShell 5.1
Die plattformneutrale PowerShell 7 bietet mittlerweile fast alle Funktionen der klassischen Windows PowerShell und eine Reihe neuer Befehle.

Die PowerShell ist eine .NET-basierte Laufzeitumgebung für interaktive Befehle und Scripting mit einer eigenen, C#-ähnlichen Sprachsyntax. Sie wird für die System- und Netzwerkadministration sowie allgemein für Automatisierungsprozesse wie Datenimporte und -exporte sowie DevOps-Pipelines eingesetzt. Die erste Version der PowerShell erschien unter dem Namen Windows PowerShell im November 2006. Bis 2016 folgten die Versionen 2.0, 3.0, 4.0, 5.0 und 5.1.
PowerShell im „Core“-Zeitalter
Genau wie bei der .NET-Basis begann dann auch das „Core“-Zeitalter bei der PowerShell. Die Versionen „PowerShell Core 6.0“ bis „PowerShell Core 6.2“, die 2018 bis 2019 erschienen sind, basierten nicht mehr auf dem klassischen .NET Framework, sondern auf .NET Core. Seitdem läuft die PowerShell dadurch nicht nur auf Windows, sondern auch auf Linux und macOS.Anders als bei .NET hat Microsoft bei der PowerShell die „Core“-Versionszählung nicht wieder bei 1.0 gestartet. Dass die aktuelle PowerShell und die aktuelle .NET-Version im Jahr 2022 nun aber beide bei Version 7 angekommen sind, resultiert aus der kleinschrittigeren Versionszählung bei der PowerShell.Seit der Version 7.0 vom 4. März 2020 verzichtet Microsoft wieder auf das „Core“ im Namen der PowerShell, auch wenn die PowerShell 7.0 noch auf .NET-Core-Version 3.1 basierte. Seit PowerShell-Version 7.1 erscheint die PowerShell immer synchron mit einer neuen .NET-Version, das heißt: PowerShell 7.1 basiert auf und erschien gleichzeitig mit .NET 5.0 am 11.11.2020. PowerShell 7.2 kam dann am 8.11.2021 zusammen mit dem zugrunde liegenden .NET 6.0. Und kurz nach Fertigstellung dieses Artikels erschien die finale Fassung der PowerShell 7.3 am 8.11.2022 zusammen mit .NET 7.0.Microsoft nannte das klassische .NET Framework eine Zeit lang „Desktop Edition“. Dieser Name findet sich noch in der Eigenschaft PSEdition in der Hashtable, die $psversiontable in der Windows PowerShell liefert. Bei den aktuellen PowerShell-7-Versionen steht dort immer noch Core, siehe Bild 1.
Versionen im Vergleich:Windows PowerShell 5.1, PowerShell Core 6.2, PowerShell 7.2 und PowerShell 7.3 Preview (hier unterWindows 10)(Bild 1)
Autor
Endgültig verwirren kann, dass es in der ersten Version des Windows Nano Server eine „Windows PowerShell Core“ gab, siehe Tabelle 1. Diese Variante basierte auch auf .NET Core, meldet sich aber mit der Versionsnummer 5.1.
Tabelle 2: Anzahl der Befehle im Vergleich
|
Auch bei der PowerShell gibt es eine „Modern Support Policy“ [1] mit Long-Term-Support-Versionen und Short-Term-Support (anders als bei .NET hier aber noch „Current Release“ genannt). Microsoft hat die Wartung und den Support der PowerShell-Core-Versionen 6.x sowie 7.1 bereits beendet. Die aktuellen Long-Term-Support-Versionen 7.0 und 7.2 hängen am Support der zugrunde liegenden .NET-Versionen. PowerShell 7.0 wird also noch wie .NET Core 3.1 bis zum 13. Dezember 2022 unterstützt, PowerShell 7.2 wie .NET 6.0 bis zum 12. November 2024.
Kernfunktionen der PowerShell
Die Kernfunktionen der PowerShell sind in allen Varianten gleich:- Zahlreiche eingebaute Befehle, die Commandlets (abgekürzt Cmdlets) genannt werden.
- Robuster Datenaustausch zwischen Commandlets durch Pipelines basierend auf typisierten .NET-Objekten.
- Zugang zu allen .NET-Klassen, die entweder Teil der .NET-Laufzeitumgebung sind oder aber in externen DLLs liegen.
- Zugang zu allen Objekten, die durch COM-Bibliotheken und die Windows Management Instrumentation (WMI) bereitgestellt werden (beides gibt es allerdings nur unter Windows).
- Ein einheitliches Navigationsparadigma für verschiedene Datenspeicher (zum Beispiel Dateisystem, Registrierungsdatenbank, Zertifikatsspeicher, Active Directory und Umgebungsvariablen) – sofern auf dem jeweiligen Betriebssystem vorhanden.
- Eine einfach zu erlernende, aber mächtige Skriptsprache mit wahlweise schwacher oder starker Typisierung.
- Ein Sicherheitsmodell, das die Ausführung unerwünschter Skripte unterbindet.
- Integrierte Funktionen für die Ablaufverfolgung und das Debugging.
- Erweiterbarkeit um eigene Befehle (mithilfe von Skripten und auch binären Modulen).
- Hosting der PowerShell: Die PowerShell kann in eigene Anwendungen integriert werden. Während bei der alten Windows PowerShell die passende System.Management.Automation.dll schon im Betriebssystem mitgeliefert wurde, gibt es für die modernen PowerShell-Versionen ein SDK als NuGet-Paket [2].
Nicht alle Funktionen in der modernen PowerShell
In PowerShell Core 6.x fehlten jedoch viele Commandlets und Funktionen der Grundausstattung der Windows PowerShell, und viele der verfügbaren PowerShell-Erweiterungsmodule liefen nicht in der PowerShell Core. Die Anzahl der fehlenden Commandlets hat sich in PowerShell 7 gegenüber PowerShell Core 6.0 stark verringert. Das beruht darauf, dass Microsoft zwischen .NET Core 2.0 und .NET Core 3.1 sehr viele .NET-Klassen aus dem klassischen .NET Framework nach .NET Core portiert hat, insbesondere im Windows Compatibility Pack [3].Auch wenn Microsoft die PowerShell 7.x als Nachfolger der Windows PowerShell versteht, sind nicht alle Funktionen aus der Windows PowerShell in der aktuellsten Version enthalten. Dabei ist noch zu differenzieren zwischen Windows einerseits und Linux/macOS andererseits.Während in Windows 11 Version 22H2 genau 95 der Windows PowerShell-Befehle in PowerShell 7 auf Windows fehlen, sind lediglich 15 neue Befehle hinzugekommen (siehe Tabelle 2 und Bild 2). Gemessen wurde jeweils die absolute Anzahl der Befehle (also Commandlets und Funktionen), die Get-Command mit dem Basissetup von Windows 11 ohne optionale Features und ohne Zusatzsoftware liefert.Die Anzahl der PowerShell-7-Befehle ist unter Windows weit größer als unter Linux und macOS. Unter Linux und macOS sind gerade einmal 270 Befehle in PowerShell 7.2 verfügbar, denn PowerShell 7 unter Linux und macOS umfasst nur die von der PowerShell gelieferten Kernbefehle (siehe Bild 3). Anders als unter Windows gibt es dort keine PowerShell-Module als Teil des Betriebssystems mit Funktionen zur Verwaltung des Betriebssystems.
Ausgabe der Versionstabelleund der Anzahl der Befehle von PowerShell 7.2 auf Ubuntu 21.04(Bild 3)
Autor

Vergleich der Ausgabeder Versionstabelle und der Anzahl der Befehle von Windows PowerShell 5.1 (links) und PowerShell 7.2 (rechts) auf Windows 11(Bild 2)
Autor
Fehlende Befehle in PowerShell 7
95 der in PowerShell 5.1 verfügbaren PowerShell-Kern-Commandlets gibt es also nicht in PowerShell 7.2, auch nicht in PowerShell 7.2 unter Windows. Zu diesen Befehlen gehören:- Alte Commandlets für die Windows Management Instrumentation (WMI) der ersten Generation (WMI v1) wie Get-WmiObject und Invoke-WmiMethod. Die WMI-v2-Commandlets wie Get-CimInstance und Invoke-CimMethod werden aber unterstützt.
- Beitritt zu Domänen mit Add-Computer.
- Start von Workflows in der PowerShell (die Basistechnik, Windows Workflow Foundation, ist in .NET Core / .NET nicht verfügbar).
- Verwendung von PowerShell-Snap-ins (Add-PSSnapin, Remove-PSSnapin). Es gibt seit PowerShell Core 6.0 zur Erweiterung der PowerShell nur noch Module.
- Zugriff auf das Windows-Ereignisprotokoll (Get-EventLog, Write-EventLog und andere).
- Unterstützung für Transaktionen (Get-Transaction, Complete-Transaction, Undo-Transaction und andere).
- Commandlets für den Dienst Microsoft User Experience Virtualization (UE-V).
- zur Dienstverwaltung (zum Beispiel Start-Service, Resume-Service),
- zur lokalen Benutzer- und Gruppenverwaltung (zum Beispiel Get-LocalGroup, New-LocalUser),
- zum Lesen und Ändern von Zugriffsrechtelisten (Get-Acl, Set-Acl),
- Befehle mit grafischen Ausgaben wie Out-GridView, da diese auf der Windows Presentation Foundation (WPF) basieren und es in der der PowerShell 7 zugrunde liegen-
- � den .NET-Runtime auf Linux und macOS weder WPF noch eine andere grafische Benutzeroberfläche gibt.
Erweiterungsmodule in PowerShell 7 nutzen
Auch unter Windows laufen nicht alle Erweiterungsmodule des Betriebssystems korrekt unter PowerShell 7, zum Beispiel die Module AppLocker, iSCSI, ISE, MsDtc, PSScheduledJob, PSWorkflow. Eine Liste der nicht oder nur eingeschränkt funktionierenden Module kann man per Skript in PowerShell 7 ermitteln (siehe Listing 1), denn die Module deklarieren dort selbst, ob sie „Core“-fähig sind. Das Commandlet Get-Module liefert normalerweise nur die PowerShell-7-kompatiblen Module, außer beim Einsatz des Parameters -SkipEditionCheck. Dieser Parameter sorgt dafür, dass Get-Module auch Module liefert, die installiert, aber nicht nutzbar sind.Listing 1: Nicht kompatible Module ermitteln
<span class="hljs-keyword">if</span> (!<span class="hljs-variable">$iscoreclr</span>) { <span class="hljs-built_in">Write-warning</span> <span class="hljs-string">"Das Skript muss in </span><br/><span class="hljs-string"> PowerShell-Version &gt;= 6.0 laufen!"</span>; <span class="hljs-keyword">return</span> } <br/><span class="hljs-variable">$m1</span> = (<span class="hljs-built_in">Get-Module</span> -list | <span class="hljs-built_in">Sort-Object</span> name | <br/> <span class="hljs-built_in">Get-Unique</span>) <br/><span class="hljs-variable">$m2</span> = (<span class="hljs-built_in">Get-Module</span> -list -SkipEditionCheck | <br/> <span class="hljs-built_in">Sort-Object</span> name | <span class="hljs-built_in">Get-Unique</span>) <br/><br/><span class="hljs-string">"Alle nutzbaren Module: "</span> + <span class="hljs-variable">$m1</span>.Count <br/><span class="hljs-string">"Alle installierten Module: "</span> + <span class="hljs-variable">$m2</span>.Count <br/><span class="hljs-built_in">Compare-Object</span> <span class="hljs-variable">$m1</span> <span class="hljs-variable">$m2</span>
Dass ein Modul nicht kompatibel ist, bedeutet aber nicht, dass es gar nicht nutzbar ist. Microsoft hat in die PowerShell 7 eine Brücke zwischen PowerShell 7 und Windows PowerShell 5.1 eingebaut.Wenn der PowerShell-Nutzer versucht, nicht kompatible Module mit dem Commandlet Import-Module in PowerShell 7 zu laden, kommt es bei einigen zu einer Fehlermeldung, bei anderen erscheint aber nur eine Warnung (siehe Bild 4). Diese besagt, dass PowerShell 7 eine PowerShell-Remoting-Verbindung zu einer Instanz der Windows PowerShell aufbaut und dort die Befehle ausführt. Dieses Verfahren nennt Microsoft „WinPSCompatSession“; es ist natürlich nur unter Windows verfügbar, nicht auf Linux und macOS, denn dort gibt es keine Windows PowerShell.

Importnicht kompatibler PowerShell-Module in PowerShell 7(Bild 4)
Autor
Zu beachten sind dabei zwei Dinge:
- Alle Objekte sind wegen des Einsatzes von PowerShell Remoting serialisiert und deserialisiert. Das Objekt hat dabei alle seine Methoden verloren außer den Standardmethoden ToString() und GetType(), die jedes .NET-Objekt besitzt.
- Auch der Einsatz von WinPSCompatSession bedeutet nicht, dass die Commandlets vollständig und korrekt unter PowerShell 7 funktionieren.
Neue Funktionen der PowerShell 7
Der Zuwachs von 15 Befehlen zwischen PowerShell Core 6.0 und PowerShell 7.2 ist nicht groß. Zudem stellt man fest: Es sind keine neuen Befehle in PowerShell 7.1 und 7.2 hinzugekommen. Die 15 neuen Befehle in PowerShell 7.2 gegenüber Windows PowerShell 5.1 sind:- ConvertFrom-Markdown
- Disable-ExperimentalFeature
- Enable-ExperimentalFeature
- Find-DSCResource
- Get-Error
- Get-ExperimentalFeature
- Get-MarkdownOption
- Get-Uptime
- Join-String
- Remove-Alias
- Remove-Service
- Set-MarkdownOption
- Show-Markdown
- Start-ThreadJob
- Test-Json
- Seit PowerShell Core 6.x gib es vier neue eingebaute/vordefinierte Variablen, die mit Boolean-Variablen das Betriebssystem anzeigen ($IsLinux, $IsWindows, $IsmacOS) und definieren, ob .NET Core ($IsCoreCLR) als Basis verwendet wird. In Windows PowerShell gibt es die Variablen nicht, aber da man Variablen nicht deklarieren muss, liefert $IsCoreCLR zumindest immer $null, was $false entspricht.
- Aus der Programmiersprache C# hat Microsoft den Null Coalescing Operator ??, den Null Coalescing Assignment Operator ??= und den Null Conditional Operator (?. und ?[]) in die PowerShell-Skriptsprache übernommen.
- Bei dem Commandlet Get-Service liefert PowerShell im ServiceController-Objekt mehr Attribute als die Windows PowerShell: Neu sind die Eigenschaften UserName, Description, DelayedAutoStart, BinaryPathName und StartupType.
- Seit PowerShell Core 6.0 kann man mit Set-Service auch das Dienstkonto für einen Systemdienst setzen.
- New-Timespan besitzt ab PowerShell 7.3 auch einen Parameter -Milliseconds.
- Den zusätzlichen Parameter -HttpVersion gibt es in den Commandlets Invoke-RestMethod und Invoke-WebRequest (ab PowerShell 7.3).
- Get-Process liefert den benötigten Speicher der Prozesse im Attribut WorkingSet64 nicht mehr wie bisher in Kilobyte, sondern in Megabyte aus.
- Die von Get-Childitem (alias Dir) gelieferten Objekte vom Typ System.IO.DirectoryInfo und System.IO.FileInfo werden auf Basis von ANSI Color Escape Sequences in verschiedenen Farben ausgegeben.
- Fehlerbehandlung mit den Pipelineverkettungsoperatoren && und ||. && wird ausgeführt, wenn der vorherige Befehl ohne Fehler ablief. Der Befehl nach || wird ausgeführt, wenn der vorherige Befehl einen Fehler verursachte, zum Beispiel: node.exe --version && echo ”NodeJS installiert” || echo ”NodeJS nicht gefunden!”
- Die moderne PowerShell liefert deutlich übersichtlichere Fehlerausgaben.
- Bei der Entwicklung skriptbasierter eigener Commandlets kann man zusätzlich zu den Blöcken begin { … }, process
{ … } und end { … } ab PowerShell 7.3 auch einen Block clean { … } verwenden, um in den anderen Blöcken verwendete Ressourcen aufzuräumen. - Jede Version der PowerShell seit Version 7 enthält auch immer einige Features, die Microsoft noch als „experimentell“ deklariert (siehe Bild 5) und die man mit Get-ExperimentalFeature ermitteln sowie mit Enable-ExperimentalFeature und Disable-ExperimentalFeature aktivieren beziehungsweise deaktivieren kann.

In PowerShell 7.3 Preview 8gibt es vier experimentelle Features(Bild 5)
Autor
Die Entwicklung der PowerShell verläuft jedoch seit Version 7.0 eher kleinschrittig. Das heißt, dass nicht viele neue Funktionen in den Versionen 7.1 bis 7.2 hinzugekommen sind, und auch für Version 7.3 befindet sich keine wesentliche Neuerung in Arbeit.
Installation der PowerShell 7
Die PowerShell 7 wird bisher mit keinem Betriebssystem gebündelt ausgeliefert – auch nicht mit Windows. Das ist ein Verbreitungshemmnis, insbesondere in größeren Unternehmen, wo es oft nur mit viel Papierkram möglich ist, auf Servern eine zusätzliche Software zu installieren. Der Zwang zur Aktualisierung durch die Support-Richtline erschwert zusätzlich die Akzeptanz.Es gibt verschiedene Bezugsquellen und Installationsarten für die PowerShell 7. In allen Fällen gilt: Die .NET-Runtime muss nicht vor der Installation der PowerShell 7.x getrennt installiert werden, denn die PowerShell 7 ist eine sogenannte Self-Contained Application (SCA), die alle notwendigen Teile der .NET-Laufzeitumgebung mitbringt.Die PowerShell 7 kann man hier beziehen:- GitHub: Die PowerShell wird als Open-Source-Projekt auf GitHub entwickelt und man findet jede aktuelle und frühere Version unter [5]. Für Windows hat man die Wahl zwischen ZIP-Datei oder Installationsprogramm (MSI oder MSIX). Für Linux und macOS findet man GZ-komprimierte TAR-Archive oder die Installationspaketformate .pkg,
.rpm und .deb (siehe auch Bild 6 [6]).

Von der PowerShellunterstützte Linux-Distributionen(Bild 6)
Bild: Microsoft [6]
- .NET-SDK-CLI-Erweiterung auf NuGet.org [7]: Die Installation der jeweils aktuellen stabilen Version erfolgt bei vorhandenem .NET SDK mit dem Befehl dotnet tool install --global powershell.
- Windows App Store für Windows 10/11: Hier findet man sowohl die stabile Version 7.2 als auch die Preview-Version.
- Docker-Images: siehe [8].

Die PowerShell 7ist hier aus verschiedenen Installationsquellen parallel auf einem System installiert(Bild 7)
Autor
In der Windows PowerShell lautete der Name der Programmdatei powershell.exe. Seit PowerShell Core 6.0 heißt die Programmdatei pwsh.exe (auf Windows) beziehungsweise nur pwsh (auf Linux und macOS). Microsoft hat den Namen gegenüber Windows PowerShell 5.1 bewusst geändert, um den Parallelbetrieb einfacher zu machen.
Bunte Terminals
Selbstverständlich kann man die PowerShell 7 auch im Rahmen des neuen Windows Terminal [9] nutzen, welches es seit Mai 2019 auf GitHub und mittlerweile auch im Windows Store gibt. In Windows 11 wird das Terminal als Betriebssystembestandteil ausgeliefert. Windows Terminal findet PowerShell 7 automatisch, wenn sie global installiert ist, aber nicht, wenn sie nur als entpackte Archivdatei irgendwo auf der Festplatte liegt.Neben der bei PowerShell schon mitgelieferten Eingabehilfe PSReadline gibt es noch andere hilfreiche Erweiterungen für die PowerShell-Standard-Konsole beziehungsweise Windows Terminal, zum Beispiel:- Terminal-Icons zur Anzeige von Datei- und Ordnersymbolen [10], siehe Bild 8,

Einsatz von Oh-my-Posh und Terminal-Iconsbei einer Registerkarte mit PowerShell 7 in Windows Terminal. „~3“ im Prompt zeigt an: Drei Änderungen sind uncommitted(Bild 8)
Autor
- Posh-Git zur Anzeige von Git-Branch und Git-Status im Prompt [11],
- Oh-my-Posh zeigt einen farblich verschönerten Prompt inklusive Git-Informationen [12], siehe Bild 8.
Install-Module Terminal-Icons
Import-Module Terminal-Icons
beziehungsweise
Install-Module posh-git
Import-Module posh-git
beziehungsweise
Install-Module oh-my-posh
Import-Module oh-my-posh
Hier muss man danach noch diesen Befehl pro Terminalfenster ausführen:
oh-my-posh init pwsh | Invoke-Expression
Einen solchen Befehl legt man am besten als Profilskript an, das bei jedem Start der PowerShell ausgeführt wird. Für Einsteiger gestaltet sich dabei schwierig, dass es mehr als ein Profilskript gibt.Für die PowerShell-7-Konsole existieren vier solcher Skripte, die alle ausgeführt werden. Unter Windows sind die Standorte folgende:
- C:\Program Files\PowerShell\7\profile.ps1
- C:\Program Files\PowerShell\7\Microsoft.PowerShell_
profile.ps1 - C:\Users\xy\Documents\PowerShell\profile.ps1
- C:\Users\xy\Documents\PowerShell\
Microsoft.PowerShell_profile.ps1
- C:\Windows\System32\WindowsPowerShell\v1.0\
profile.ps1 - C:\Windows\System32\WindowsPowerShell\v1.0\
Microsoft.PowerShell_profile.ps1 - C:\Users\cy\Documents\WindowsPowerShell\profile.ps1
- C:\Users\xy\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Listing 2: PowerShell-Profilskript des Autors mit IntelliSense für .NET CLI und Laden von Erweiterungsmodulen
# ---------------------------------------------------- <br/># PowerShell-Profilskript von Dr. Holger <br/> Schwichtenberg <br/># Stand 27.09.2022 <br/># ----------------------------------------------------<br/><br/>function Test-WindowsTerminal { test-path <br/> env:WT_SESSION } # Quelle: https://github.com/<br/> microsoft/terminal/issues/6269 <br/><br/>function Test-AdminStatus { <br/> $Wi = [System.Security.Principal<br/> .WindowsIdentity]::GetCurrent() <br/> $wp = New-Object System.Security.Principal<br/> .WindowsPrincipal($wi) <br/> return ($wp.IsInRole([System.Security.Principal<br/> .WindowsBuiltInRole]::Administrator)) <br/>} <br/><br/>function Test-Module($ModuleName) { <br/> if (Get-Module -ListAvailable -Name $ModuleName) { <br/> return $true <br/> } else { <br/> return $false <br/> } <br/>} <br/>function InstallAndImport-Module($ModuleName) { <br/> write-host "Module $ModuleName" -ForegroundColor <br/> Cyan <br/> if (Test-Module -ModuleName $ModuleName) { <br/> } else { <br/> Install-Module $ModuleName -force <br/> } <br/> Import-Module $ModuleName <br/>} <br/><br/># Intellisense für .NET CLI aktivieren # https://<br/> docs.microsoft.com/en-us/dotnet/core/tools/<br/> enable-tab-autocomplete <br/>Register-ArgumentCompleter -Native -CommandName <br/> dotnet -ScriptBlock { <br/> param($commandName, $wordToComplete, $cursorPosition) <br/> dotnet complete --position $cursorPosition <br/> "$wordToComplete" | ForEach-Object { <br/> [System.Management.Automation.CompletionResult]<br/> ::new($_, $_, 'ParameterValue', $_) <br/> } <br/>} <br/><br/># Erweiterungsmodule laden <br/>InstallAndImport-Module PSCX # https://<br/> www.powershellgallery.com/packages/Pscx <br/><br/># Diese Module nur laden, wenn wir im Windows Terminal <br/> sind <br/>if (Test-WindowsTerminal) <br/>{ <br/> InstallAndImport-Module Terminal-Icons # https://<br/> www.powershellgallery.com/packages/<br/> Terminal-Icons <br/> InstallAndImport-Module oh-my-posh # https://<br/> www.powershellgallery.com/packages/oh-my-posh <br/> oh-my-posh init pwsh | Invoke-Expression <br/>} <br/><br/># Ausgaben <br/>$status = if (Test-AdminStatus) { "Admin-Rechte" } <br/> else { "normale Rechte" } <br/>$path = $MyInvocation.MyCommand.path <br/>if (!$path) {$path = $psISE.CurrentFile.Fullpath} <br/>$title = "$path | PowerShell $(<br/> $psversiontable.PSVersion ) | System <br/> $([System.Environment]::MachineName) | <br/> $([System.Environment]::UserDomainName)\<br/> $([System.Environment]::UserName) | $status" <br/>$Host.UI.RawUI.WindowTitle = $title <br/>Write-host $title -ForegroundColor Yellow
Ein Profilskript kann (abhängig von seinem Inhalt) den Start einer PowerShell-Konsole erheblich verzögern. Damit die Schuld für einen trägen Start nicht unverschuldet bei Microsoft hängen bleibt, zeigt die PowerShell 7 die Dauer der Profilskriptverarbeitung bei jedem Start an (siehe Bild 9). Erst ab PowerShell 7.3 kann der Nutzer dieses Verhalten mit dem Parameter -noprofileloadtime bei pwsh.exe unterdrücken:

Anzeigeder Profil-Ladedauer(Bild 9)
Autor
z:\PowerShell-7.3.0-preview.8-win-x64\pwsh.exe
-noprofileloadtime
Schon seit Langem gibt es in der PowerShell-Startdatei den Parameter -noprofile, der das Laden vorhandener Profilskripte verhindert.
Azure Cloud Shell
Ein weiterer Host der PowerShell 7 ist die Azure Cloud Shell zur kommandozeilenbasierten Verwaltung der Azure-Cloud-Dienste. Die Cloud Shell gibt es in drei Varianten:- als Fenster innerhalb des Azure-Webportals im Webbrowser [13], siehe Bild 10,

Azure Cloud Shellmit PowerShell 7.2.6 im Azure Portal(Bild 10)
Autor
- als Registerkarte innerhalb des Windows Terminal [14],
- innerhalb der Azure Mobile Apps für Android und iOS [15].
Skripte und Editoren
PowerShell-Skripte besitzen auch in PowerShell 7 noch die Dateinamenserweiterung .ps1. Da Skripte nichts anderes als Textdateien sind, lassen sich alte Skripte in der modernen PowerShell starten – sofern die Commandlets dort noch vorhanden sind. Das Standard-Encoding war früher Windows-1252. Mittlerweile hat das PowerShell-Team UTF-8 zum Standard erklärt [16].Standardeditor für die Windows PowerShell war die Integrated Scripting Environment (ISE), die – auch wenn man es ihr nicht auf den ersten Blick ansieht – auf der Visual-Studio-Shell basiert. Damit ist die ISE zwangsläufig an das Windows-Betriebssystem gefesselt.Microsoft hat sich auch nicht mehr die Mühe gemacht, innerhalb der ISE eine Umschaltung zwischen Windows PowerShell und moderner PowerShell einzubauen. Das bedeutet also: Die ISE kennt weder die neueren Features der modernen PowerShell, noch kann man dort ein Skript mit PowerShell 7 starten. Microsoft setzt daher nun – sowohl für die alte Windows PowerShell als auch die moderne PowerShell – auf den plattformneutralen Editor VS Code [17] mit der Erweiterung VSCode-PowerShell (siehe [18] und [19]).Die Erweiterung bietet neben Syntax Highlighting, IntelliSense (siehe Bild 11), Code Snippets und Debugging auch Features, die die ISE nicht von Haus aus beherrschte: Go to Definition, Find References, Umbenennen sowie statische Codeanalyse mit dem PowerShell Script Analyzer [20], siehe die gewellten Linien unter den PowerShell-Aliasen where und select in Bild 11. Der Script Analyzer empfiehlt, keine Aliase zu verwenden.
Eingabeunterstützungfür ein PowerShell-Skript in Visual Studio Code mit PowerShell-Erweiterung aufUbuntu-Linux(Bild 11)
Autor
Erweiterungsmodule in der PowerShell Gallery
Während beim Start der plattformneutralen PowerShell die Suche nach den für Linux und macOS verfügbaren PowerShell-Modulen in der PowerShell Gallery [21] noch sehr mühsam war, ist auch die PowerShell Gallery inzwischen auf die plattformneutrale PowerShell eingerichtet. Ende September 2022 weisen immerhin 921 PowerShell-Module das Tag Linux [22] und 541 das Tag Mac [23] auf. In Bild 12 werden die Linux-fähigen PowerShell-Module via Commandlet Find-Module gesucht und nach Hersteller sortiert:
Online-Suche in der PowerShell Gallerynach Linux-fähigen PowerShell-Modulen mit Find-Module (hier via PowerShell 7.2 unter Ubuntu-Linux)(Bild 12)
Autor
Find-Module -tag:Linux | Group-Object companyname |
Sort-Object count –desc
Dies offenbart: Fast die Hälfte der Linux-fähigen Module stammt von Amazon zur Automatisierung von Amazon Web Services (AWS). Die zweite große Gruppe stammt von Oracle (OCI steht für Oracle Cloud Infrastructure).Eine sehr beliebte PowerShell-Erweiterung mit zahlreichen zusätzlichen Befehlen ist die PowerShell Community Extension (PSCX), auch wenn es für diese seit 2018 keinen stabilen Release mehr gab [24]. Die Version 4.0.0-beta4 ist aber beim Autor dieses Beitrags im Einsatz. Diese installiert man folgendermaßen:
Install-Module -Name PSCX -AllowPrerelease
Skriptquellen
Im Gegensatz zu den PowerShell-Modulen gibt es in der PowerShell Gallery kein zentrales Repository für PowerShell-Skripte. Skripte für die PowerShell findet man inzwischen im ganzen Internet verstreut.Für den Einstieg bietet Microsoft eine Reihe von Beispielskripten in der Dokumentation [25]. Der offizielle PowerShell Scripting Blog von Microsoft [26] ist allerdings verwaist: 2020 gab es einen Eintrag, 2021 zwei Einträge, im Verlauf von 2022 bisher leider keinen einzigen. Eine größere Sammlung von PowerShell-Skripten zu zahlreichen Praxisgebieten findet man im aktuellen PowerShell-Buch des Autors dieses Beitrags, das im Oktober 2022 als neunte Ausgabe in 16 PowerShell-Jahren erschienen ist [27].Eine längere Linkliste zum Thema PowerShell enthält das GitHub-Repository Awesome PowerShell [28].Fazit
Der Umstieg von Windows PowerShell auf die moderne PowerShell 7 ist inzwischen in den meisten Fällen technisch möglich. Allerdings zeigt sich in der Praxis: Die Tatsache, dass die PowerShell 7 nicht als Teil von Windows ausgeliefert wird, sowie der Aktualisierungszwang sind echte Verbreitungshemmnisse, gerade in größeren Organisationen, wo man auf den Clients und insbesondere auf Servern nicht „mal eben“ etwas installieren kann.Auf Linux und macOS ist die PowerShell in ihrer bisherigen Ausbaustufe vor allem ein Angebot für Windows-Entwickler und -Administratoren, die nun auch macOS und/oder Linux (oft im Docker-Container) verwenden müssen. Diese finden sich in der neuen Welt wesentlich leichter zurecht, wenn sie ihr Wissen über die Windows PowerShell und ihre Pipelines in der neuen Welt weiterverwenden können.Eingefleischte Linux- und macOS-Nutzer wird die PowerShell 7 auf ihren Plattformen aber wohl dann erst als Alternative begeistern können, wenn sie dort mehr Befehle zur Betriebssystem- und Netzwerkadministration bietet.Fussnoten
- Modern Support Policy, http://www.dotnetpro.de/SL2301PowerShell7_1
- PowerShell SDK als NuGet-Paket, http://www.dotnetpro.de/SL2301PowerShell7_2
- Windows Compatibility Pack, http://www.dotnetpro.de/SL2301PowerShell7_3
- Commandlet Switch-Process, http://www.dotnetpro.de/SL2301PowerShell7_4
- PowerShell auf GitHub, http://www.dotnetpro.de/SL2301PowerShell7_5
- Von PowerShell unterstützte Linux-Distributionen, http://www.dotnetpro.de/SL2301PowerShell7_6
- .NET-SDK-CLI-Erweiterung auf NuGet, http://www.dotnetpro.de/SL2301PowerShell7_7
- PowerShell als Docker-Image, http://www.dotnetpro.de/SL2301PowerShell7_8
- Windows Terminal, http://www.dotnetpro.de/SL2301PowerShell7_9
- Terminal-Icons, http://www.dotnetpro.de/SL2301PowerShell7_10
- Posh-Git, https://github.com/dahlbyk/posh-git
- Oh-my-Posh, https://ohmyposh.dev
- Azure-Webportal, https://portal.azure.com
- Cloud Shell im Windows Terminal, http://www.dotnetpro.de/SL2301PowerShell7_11
- Azure Mobile Apps für Android und iOS, http://www.dotnetpro.de/SL2301PowerShell7_12
- UTF-8 als Standard in PowerShell, http://www.dotnetpro.de/SL2301PowerShell7_13
- VS Code, https://code.visualstudio.com
- Erweiterung VSCode-PowerShell auf GitHub, http://www.dotnetpro.de/SL2301PowerShell7_14
- Erweiterung VSCode-PowerShell, http://www.dotnetpro.de/SL2301PowerShell7_15
- PowerShell Script Analyzer, http://www.dotnetpro.de/SL2301PowerShell7_16
- PowerShell Gallery, http://www.powershellgallery.com
- PowerShell-Module mit dem Tag „Linux“, http://www.dotnetpro.de/SL2301PowerShell7_17
- PowerShell-Module mit dem Tag „Mac“, http://www.dotnetpro.de/SL2301PowerShell7_18
- PowerShell Community Extension (PSCX), http://www.dotnetpro.de/SL2301PowerShell7_19
- PowerShell-Dokumentation, https://learn.microsoft.com/powershell/
- PowerShell Scripting Blog, http://www.dotnetpro.de/SL2301PowerShell7_20
- Holger Schwichtenberg, PowerShell 7 und Windows PowerShell 5 – das Praxisbuch, Carl Hanser, Oktober 2022, ISBN 978-3-446-47296-9,
- Janik Vonrotz, Awesome PowerShell, http://www.dotnetpro.de/SL2301PowerShell7_21