Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 16 Min.

Kraftmuschel, kernlos

Die plattformneutrale PowerShell 7 bietet mittlerweile fast alle Funktionen der klassischen Windows PowerShell und eine Reihe neuer Befehle.
© dotnetpro
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 Dev­Ops-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 Power­Shell.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: Power­Shell 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 Power­Shell-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

Verfügbare Versionen Edition Basisframework Unterstützte Betriebssysteme Wird weiterentwickelt
Windows PowerShell 1.0 bis 5.1 Desktop .NET Framework Windows Nein, aber noch Bugfixes über Windows Update
Windows PowerShell Core 5.1 Core .NET Core Windows Nano Server Nein
PowerShell Core 6.0 bis 6.2 Core .NET Core Windows, Linux, macOS Nein
PowerShell Ab 7.0 Core .NET Core (7.0) beziehungsweise .NET (seit 7.1) Windows, Linux, macOS Ja
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].
Der große Vorteil der PowerShell gegenüber klassischen Shells wie bash, ksh, tcsh, zsh, fish und Co. ist der zweite Punkt: ihre Objektorientierung basierend auf .NET-Objekten, die das Zusammenspiel verschiedener Commandlets sehr einfach und robust macht. In den textbasierten Shells der Linux-Welt ist das Koppeln von Kommandozeilenwerkzeugen per Textauswertung mit Befehlen wie grep und awk mitunter eine mühsame und fehleranfällige Arbeit.

Nicht alle Funktionen in der modernen PowerShell

In PowerShell Core 6.x fehlten jedoch viele Commandlets und Funktionen der Grundausstattung der Windows Power­Shell, 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 mac­OS 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 Power­Shell-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).
Dass in PowerShell 7.2 unter Linux und macOS nur 270 Befehle existieren, liegt vor allem daran, dass die vielen in Windows eingebauten PowerShell-Module zur Verwaltung von Betriebssystemfunktionen (zum Beispiel ActiveDirectory, Dns­Client, Storage, Appx, Bitlocker, Defender, Dism, Hyper-V, IISAdministration, NetTCPIP, SmbShare, StartLayout, Vpn­Client und viele mehr) nicht existieren. Diese Module werden nicht vom PowerShell-Entwicklungsteam, sondern vom Windows-Entwicklungsteam implementiert.Zudem fehlen unter Linux und macOS aber auch einige Kernbefehle der PowerShell, zum Beispiel
  • 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 an­dere grafische Benutzeroberfläche gibt.
Aktuell ist der Funktionsumfang der PowerShell 7 unter Linux und macOS also deutlich geringer als unter Windows. Insbesondere fehlen dort konkrete Commandlets, um mit den Betriebssystemen und Anwendungen zu interagieren: Derzeit muss man noch selbst die Textausgaben der Standard-Kommandozeilenbefehle in Objekte umwandeln, bevor man von der Macht der PowerShell-OO-Pipeline profitiert.

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 Power­Shell 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 -Skip­EditionCheck. Dieser Parameter sorgt dafür, dass Get-Mo­dule 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 >= 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 Power­Shell 5.1 eingebaut.Wenn der PowerShell-Nutzer versucht, nicht kompatible Module mit dem Commandlet Import-Module in Power­Shell 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 Power­Shell 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 Po­werShell 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
In PowerShell 7.3 kommt das Commandlet Switch-Process hinzu [4], das aber nur in Linux und macOS verfügbar ist.Darüber hinaus finden sich viele weitere kleine Verbesserungen bei der Skriptsprache und den älteren Befehlen; hier nur einige Beispiele:
  • 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 Start­upType.
  • 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 power­shell.
  • 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 7 kann man parallel zu den bisherigen Windows-PowerShell-Installationen auf einem Windows-Rechner betreiben. Zudem lassen sich beliebig viele Versionen und Varianten (Release und Preview) der PowerShell 7 parallel installieren. Auch kann man aus den verschiedenen bisher genannten Quellen parallel installieren; dies führt dann dazu, dass man im Startmenü und im Menü des Windows Terminal viele verschiedene Einträge mit dem Wort PowerShell sieht. Das kann verwirren, siehe Bild 7.
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 Po­werShell 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.
Das Installations- und Anwendungsmuster sieht in der Regel so aus: einmalige Installation von der PowerShell-Gallery, dann Import pro Konsole
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
Dass es vier Skripte gibt, erklärt sich so, dass das Profilskript global für alle Benutzer in PowerShell und benutzerbezogen vorliegt sowie für einen speziellen PowerShell-Host und für alle PowerShell-Hosts.Sofern die Dateien existieren, werden alle vier Profilskripte gestartet. Die Ausführungsreihenfolge ist so, dass die Profilskripte für alle Benutzer Vorrang vor den benutzerspezifischen Profilskripten haben. Zudem haben die Profilskripte für alle PowerShell-Hosts Vorrang vor den Profilskripten für den konkreten Host.Die oben genannten Profilskripte werden aber nur in der PowerShell 7 geladen. Die alte Windows PowerShell besitzt eigene Profilskripte:
  • 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
Ein Beispiel für ein Profilskript zeigt Listing 2. Es aktiviert IntelliSense für das .NET CLI und lädt mehrere Erweiterungsmodule. Zudem wird eine Informationszeile mit Angaben zum aktuellen Computer und Benutzer ausgegeben.
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 Po­werShell und moderner PowerShell einzubauen. Das bedeutet also: Die ISE kennt weder die neueren Features der modernen PowerShell, noch kann man dort ein Skript mit Po­werShell 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
Während beim Start der plattformneutralen PowerShell die Suche nach den für Linux und macOS verfügbaren PowerShell-Modulen in der Po­werShell Gallery [21] noch sehr mühsam war, ist auch die Po­werShell Gallery inzwischen auf die plattformneutrale Power­Shell eingerichtet. Ende September 2022 weisen immerhin 921 Po­werShell-Module das Tag Linux [22] und 541 das Tag Mac [23] auf. In Bild 12 werden die Linux-fähigen Power­Shell-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 Ora­cle (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 Power­Shell-Skripten zu zahlreichen Praxisgebieten findet man im aktuellen PowerShell-Buch des Autors dieses Beitrags, das im Oktober 2022 als neunte Ausgabe in 16 Power­Shell-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 Po­werShell 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 Power­Shell 7 auf ihren Plattformen aber wohl dann erst als Alternative begeistern können, wenn sie dort mehr Befehle zur Betriebssystem- und Netzwerkadministration bietet.

Fussnoten

  1. Modern Support Policy, http://www.dotnetpro.de/SL2301PowerShell7_1
  2. PowerShell SDK als NuGet-Paket, http://www.dotnetpro.de/SL2301PowerShell7_2
  3. Windows Compatibility Pack, http://www.dotnetpro.de/SL2301PowerShell7_3
  4. Commandlet Switch-Process, http://www.dotnetpro.de/SL2301PowerShell7_4
  5. PowerShell auf GitHub, http://www.dotnetpro.de/SL2301PowerShell7_5
  6. Von PowerShell unterstützte Linux-Distributionen, http://www.dotnetpro.de/SL2301PowerShell7_6
  7. .NET-SDK-CLI-Erweiterung auf NuGet, http://www.dotnetpro.de/SL2301PowerShell7_7
  8. PowerShell als Docker-Image, http://www.dotnetpro.de/SL2301PowerShell7_8
  9. Windows Terminal, http://www.dotnetpro.de/SL2301PowerShell7_9
  10. Terminal-Icons, http://www.dotnetpro.de/SL2301PowerShell7_10
  11. Posh-Git, https://github.com/dahlbyk/posh-git
  12. Oh-my-Posh, https://ohmyposh.dev
  13. Azure-Webportal, https://portal.azure.com
  14. Cloud Shell im Windows Terminal, http://www.dotnetpro.de/SL2301PowerShell7_11
  15. Azure Mobile Apps für Android und iOS, http://www.dotnetpro.de/SL2301PowerShell7_12
  16. UTF-8 als Standard in PowerShell, http://www.dotnetpro.de/SL2301PowerShell7_13
  17. VS Code, https://code.visualstudio.com
  18. Erweiterung VSCode-PowerShell auf GitHub, http://www.dotnetpro.de/SL2301PowerShell7_14
  19. Erweiterung VSCode-PowerShell, http://www.dotnetpro.de/SL2301PowerShell7_15
  20. PowerShell Script Analyzer, http://www.dotnetpro.de/SL2301PowerShell7_16
  21. PowerShell Gallery, http://www.powershellgallery.com
  22. PowerShell-Module mit dem Tag „Linux“, http://www.dotnetpro.de/SL2301PowerShell7_17
  23. PowerShell-Module mit dem Tag „Mac“, http://www.dotnetpro.de/SL2301PowerShell7_18
  24. PowerShell Community Extension (PSCX), http://www.dotnetpro.de/SL2301PowerShell7_19
  25. PowerShell-Dokumentation, https://learn.microsoft.com/powershell/
  26. PowerShell Scripting Blog, http://www.dotnetpro.de/SL2301PowerShell7_20
  27. Holger Schwichtenberg, PowerShell 7 und Windows PowerShell 5 – das Praxisbuch, Carl Hanser, Oktober 2022, ISBN 978-3-446-47296-9,
  28. Janik Vonrotz, Awesome PowerShell, http://www.dotnetpro.de/SL2301PowerShell7_21

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige