Skip to the main content.

ScriptRunner Blog

Willkommen zu PowerShell 7

Inhaltsverzeichnis

Post Featured Image

PowerShell 7 ist die Nachfolgerin von PowerShell Core und der in Windows integrierten Windows PowerShell. In diesem Artikel erhalten Sie einen kurzen Überblick über die wichtigsten Neuerungen und erfahren, warum es sich lohnt, eine Aktualisierung durchzuführen.

PowerShell 7 – die Highlights

PowerShell 7 ist die neue von Microsoft empfohlene Shell-Umgebung für Windows. Im Gegensatz zur Windows PowerShell basiert das neuste LTS-Release PowerShell 7 auf .NET Core 3.1.

Der zentrale Effekt dieser Änderung, ist, dass PowerShell 7 dadurch plattformübergreifend für Windows, Linux und MacOS verfügbar ist, und das nicht nur lokal, sondern auch in der Cloud und in hybriden Infrastrukturen.

Weiterhin verspricht das Update auf .NET Core 3.1 eine verbesserte Performance, bessere Kompatibilität mit Windows PowerShell Modulen und weitere neue Features, auf die wir im weiteren Text eingehen werden.

 

PowerShell 7 Download und Installation

Systemvoraussetzungen

Im Gegensatz zur Windows PowerShell ist PowerShell 7 bisher noch nicht standardmäßig in Windows-Installationen enthalten und Microsoft plant derzeit auch nicht die in Windows vorinstallierte Windows PowerShell zu entfernen.

Wie bereits im vorigen Absatz beschrieben, ist PowerShell 7 jedoch plattformübergreifend verfügbar und unterstützt neben Windows auch macOS und Linux. Laut Microsoft Docs (Stand 2020-07-30) ist PowerShell 7 derzeit für die folgenden x64-Betriebssysteme verfügbar:

  • Windows 7, 8.1, und 10
  • Windows Server 2008 R2, 2012, 2012 R2, 2016, and 2019
    macOS 10.13+
  • Red Hat Enterprise Linux (RHEL) / CentOS 7+
  • Fedora 29+
  • Debian 9+
  • Ubuntu 16.04+
  • openSUSE 15+
  • Alpine Linux 3.8+
  • macOS 10.13+

Installation

Es gibt verschiedene Möglichkeiten, wie PowerShell 7 installiert werden kann. Prinzipiell gilt: da PowerShell seit 2016 open-source ist, stehen die Installationsdateien frei zum Download auf dem PowerShell GitHub Repository zur Verfügung.

Nach dem Download kann die entsprechende Datei einfach per Doppelklick installiert werden.

Auf Windows kann die Installation außerdem per „Steve Lee One-Liner“ über die Windows PowerShell durchgeführt werden:

iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI"

Analog dazu lässt sich PowerShell 7 mit folgendem Befehl auf Linux über die Konsole installieren:

sudo wget https://aka.ms/install-powershell.sh; sudobash install-powershell.sh; rminstall-powershell.sh

Detaillierte Informationen zum entsprechenden Vorgehen auf Windows und Linux  finden Sie u. a. auf dem Blog von Thomas Maurer, Senior Cloud Advocate bei Microsoft..

 


PowerShell 7 auf Windows nutzen

Bereits Ende 2017 verkündete der Microsoft Support, dass PowerShell zukünftig die Eingabeaufforderung als Befehlsshell für den File Explorer ablösen würde.

Natürlich können Sie PowerShell 7 auch mit dem neuen Windows Terminal für Windows 10 verwenden. Wenn gewünscht, können Sie sogar parallel mit der PowerShell und der Eingabeaufforderung arbeiten: Standardmäßig nutzt das Windows Terminal PowerShell 7. Sie können aber parallel dazu Windows PowerShell, die Eingabeaufforderung, Azure Cloud Shell und beliebige, Remote Shells (winrm/ssh) in Registerkarten öffnen (Abbildung 1). Selbst die Unix-Shell  können Sie einbinden, wenn Sie in Windows das Windows-Subsystem für Linux installiert haben.

 


PowerShell 7 auf Linux nutzen

Wie bereits im Abschnitt „Systemvoraussetzungen“ beschrieben, gibt es eine Reihe von Linux-Distributionen, die von PowerShell 7 offiziell unterstützt werde, außerdem einige, wie z. B. Arch Linux, Kali und Raspbian, die von der Community unterstützt werden.

Die Einbindung dieser Plattformen bringt nicht nur Vorteile für bestehende PowerShell User, die nun ihr Know-How auf neue Infrastrukturen übertragen können. Sie bringt auch Vorteile für Linux-User, bzw. Bash-User, die nun im Rahmen von PowerShell auch mit Objekten arbeiten können, statt nur mit Strings.

An dieser Stelle ist zu beachten, dass bei der Administration von Linux-Maschinen via PowerShell 7-Remoting der Einsatz von SSH eine entscheidende Rolle spielt, denn erst dadurch wird echtes PowerShell-Remoting zwischen Windows- und Linux-Computern möglich.

 

PowerShell 7 versus Windows PowerShell

Kompatibilität

Der Funktionsumfang von PowerShell 7 wurde um viele Cmdlets und Operatoren erweitert, nur wenige Cmdlets, wie z.B. die WMI-Cmdlets sind entfallen. Allerdings sind nicht alle Windows PowerShell Module mit der neuen Shell kompatibel. In solchen Fällen besteht in Windows weiterhin die Möglichkeit parallel die Windows PowerShell zu nutzen (wie im vorherigen Absatz beschrieben).

Eine Liste aller lokal zur Verfügung stehenden Module die sie mit PowerShell 7 verwenden können, können Sie sich in mit dem Befehl „Get-Module -ListAvailable“ anzeigen lassen (Abbildung 2).

Eine Übersicht der von Microsoft veröffentlichten Module, die nativ mit PowerShell 7 funktionieren oder mit PowerShell 7 kompatibel sind, finden Sie in der online Kompatibilitätsliste.

Screenshot Windows Terminal: List of available PowerShell modules as output of the Get-Module -ListAvailable command

Abb. 2: PowerShell-Module für die Verwendung mit der PowerShell 7 ausgeben lassen

Windows Usern steht zusätzlich das Cmdlet „Import-Module“ mit dem Parameter „-UseWindowsPowerShell“ zur Verfügung. Dieser Befehl erleichtert den Wechsel zu PowerShell 7 und ermöglicht es, Windows PowerShell Module weiterhin zu nutzen. Der Parameter erstellt ein Proxymodul in der PowerShell 7, das einen lokalen Windows PowerShell-Prozess verwendet, um implizit alle in diesem Modul enthaltenen Cmdlets auszuführen.

Natürlich stehen nicht alle Cmdlets, die für Windows optimiert sind, auch in den Versionen für Linux und macOS zur Verfügung. Aber auch hier gilt, dass Microsoft ständig nachbessert. Es ist jedoch zu erwarten, dass in Linux und macOS sicher nie alle Cmdlets identisch zur Verfügung stehen werden, wie in Windows.

Unterschiede

Die folgende Tabelle gibt einen Überblick über die grundlegenden Unterschiede zwischen Windows PowerShell und PowerShell 7.

  PowerShell 7 Windows PowerShell Event Log App log/PowerShell Core App log/Windows PowerShell Module Module paths %ProgramFiles%PowerShellModules %ProgramFiles%WindowsPowerShellModules SPEICHERORT DER USER-PROFILE …[username]documentsPowerShell …[username]documentsWindowsPowerShell INSTALLATIONSPFAD %programfiles%powershell7 …WindowsSystem32WindowsPowerShellv1.0 AUSFÜHRUNGSDATEI Pwsh.exe PowerShell.exe PRÄFERIERTE ENTWICKLUNGSUMGEBUNG Visual Studio Code + PowerShell Extension ISE

 

Neue Funktionen in PowerShell 7


SSH-basiertes PowerShell-Remoting

Eine der bedeutendsten Neuerungen von Powershell 7 ist sicherlich die Einführung von SSH als Netzwerkprotokoll für PowerShell-Remoting. SSH-Remoting ist für alle Plattformen verfügbar und ermöglicht so echtes Multiplattform-PowerShell-Remoting.

Im Zuge dieser Änderung, wurden außerdem die Cmdlets New-PSSession, Enter-PSSession und Invoke-Command um einen neuen Parametersatz zur Unterstützung von SSH-Remoting-Verbindung ergänzt:

[-HostName ] [-UserName ] [-KeyFilePath ]

Ternärer Operator „a ? b : c“

Der neue ternäre Operator a ? b : c ermöglicht die Formulierung einer vereinfachten „if-else“-Anweisung. Die Syntax lautet folgendermaßen:

[condition] ? [if-true] : [if-false]

[condition] steht hierbei für den Bedingungsausdruck, welcher ausgewertet werden soll. Das Ergebnis dieser Auswertung wird in einen booleschen Wert umgewandelt. Dieser bestimmt wiederum, welcher Ausdruck in der Folge ausgeführt wird. Ein einfaches Beispiel. Es soll geprüft werde, ob die Gleichung 10*5 = 20 richtig (true), oder falsch (false) ist:

$total = 10*5 -eq 20 ? 'yes' : 'no'

Ein weiteres Beispiel, in dem geprüft werden soll, ob das verwendete System MacOS, Linux oder ein anderes (Windows) ist.

# PowerShell 7 
$IsMacOS? 'You are on a Mac' : $IsLinux? 'You are on Linux' : 'You must be on Windows’ 
# Windows PowerShell 
If ($IsMacOS) { 'You are on a Mac' } elseif ($IsLinux) { 'You are on Linux' } else { 'You must be on Windows' }

 

Pipeline-Kettenoperatoren && und ||

Ein großer Vorteil von  PowerShell im Vergleich zur betagten Eingabeaufforderung, waren von Anfang an die Pipeline-Funktionen, die mit | genutzt werden konnten. Damit können mehrere Befehle in Reihe verbunden werden, um gemeinsame Aktionen auszuführen (sozusagen als „Mini-Skripte“).

Seit PowerShell 7 können mehrere Pipelines konditional miteinander in Verbindung gesetzt werden. Zu diesem Zweck stehen in PowerShell 7 die Pipeline-Kettenoperatoren && und || zur Verfügung.
Beide Operatoren haben den Effekt, dass einzelne Teile der Pipeline nur unter bestimmten Bedingungen ausgeführt werden.

Der Unterschied zwischen beiden Operatoren liegt darin, dass bei der Verwendung von &&, der rechte Teil der Pipeline nur dann ausgeführt wird, wenn der linke Teil der Pipeline keinen Fehler ausgegeben hat („ausführen, wenn das Vorhergehende keinen Fehler ausgibt“). Beispiel:

Write-Output 'Hello' && Write-Output 'World'
# Output 
Hello World

Im obigen Beispiel werden beide Teile der Pipeline ohne Fehler ausgeführt.

Im Gegensatz dazu wird bei der Verwendung von || der rechte Teil der Pipeline nur dann ausgeführt, wenn der Befehl im linken Teil der Pipeline einen Fehler ausgibt („ausführen, nur wenn das Vorhergehende einen Fehler ausgibt“). Beispiel:

Write-Output 'Hello' || Write-Output 'World'
# Output Hello

Im zweiten Beispiel wurde der linke Teil der Pipeline ohne Fehler ausgeführt, daher wird der rechte Teil der Pipeline nicht ausgeführt.

Ein weiteres Beispiel:

Get-Process notepad -ErrorAction SilentlyContinue || "Notepad process is not available"

Sofern Notepad gestartet ist, erscheinen Informationen zum Prozess, wenn nicht, erscheint der Text „Es ist kein Notepad-Prozess verfügbar“ (Abbildung 3).

Screenshot: Output of the PowerShell pipeline

Abb. 3: Ausgabe der verketteten PowerShell Pipeline

Eine ausführliche Erklärung der neuen Pipeline Chain Operatoren in PowerShell 7 finden Sie in den Microsoft Docs.

NULL-Bedingungsoperatoren: ?? und ??=

Ähnlich wie die neuen Pipeline-Kettenoperatoren dienen die neuen NULL-Bedingungsoperatoren dazu, eine bedingte Abfrage auszuführen:

Der NULL-Sammeloperator ?? gibt den Wert seines linken Operanden zurück, wenn er nicht Null ist. Andernfalls wertet er den rechten Operanden aus und liefert dessen Ergebnis zurück. Beispiel: Es soll geprüft werden ob $x  NULL ist.

# $x is assigned the value $null 
$x = $null

# the new operator ?? is used to check whether the left operand $x is NULL 
$x ?? 100 

# since this is true, the right operand "100" is evaluated and its result is returned 
100

Der NULL-Zuweisungsoperator ??= weist dem linken Operanden den Wert des rechten Operanden zu, sofern der linke Operand mit NULL ausgewertet wird. Ein Beispiel: Wenn $x NULL ist, soll ihm der Wert „100“ zugewiesen werden.

# $x is assigned the value $null 
$x = $null 

# now ??= is used to check whether the left operand $x is NULL 
$x ??= 100 

# since this is true, the right operand "100" is evaluated and its result is assigned to the left operand 
$x
100

 

ForEach-Object -Parallel Feature

Der Befehl Foreach-Object ermöglichte bisher nur das sequentielle Ausführen einer Operation für eine Sammlung von Input-Objekten. Die parallele Verarbeitung von Objekten in der Pipeline war nur über Umwege mit dem PSWorkflow Cmdlt möglich.

Mit dem neuen Parameter Set -Parallel bietet PowerShell diese Option nun auch im Rahmen einer ForEach-Object-Schleife:

ForEach-Object
		[-InputObject ]
		-Parallel 
		[-ThrottleLimit ]
		[-TimeoutSeconds ]
		[-AsJob]
		[-WhatIf]
		[-Confirm]
		[]

Über den Parameter -ThrottleLimit kann die Anzahl der Threads, die parallel verarbeitet werden, eingeschränkt werden, um sicherzustellen, dass es zu keiner Überlastung Prozessor-Cores kommt.

Für SkriptBlöcke die lange Wartezeiten beinhalten, in denen keine Rechenleistung benötigt wird, ist es sinnvoll, ein höheres ThrottleLimit als die Anzahl der verfügbaren Prozessor-Cores einzustellen.

Es sollte beachtet werden, dass das Multithreading an sich einen gewissen Overhead erzeugt, da für jeden der parallel ausgeführten Script-Blöcke ein eigener Runspace erzeugt werden muss. Daher lohnt sich dieses Vorgehen nur bei längeren, rechenintensiven Operationen.

Hier ein Beispiel eines möglichen Use Cases: über den Befehl Test-NetConnection sollen mehrere Ports abgefragt werden. Im ersten Teil erfolgt die Verarbeitung der ForEach-Object-Schleife sequentiell:

# Sequential processing
Measure-Command { 
		$port = '53','80','88','443' 
		$port | ForEach-Object { 
				Test-NetConnection -ComputerName 172.30.5.10 -Port $_
		}
} | Select-Object Minutes,Seconds

Wie Abbildung 4 zeigt, beträgt die Dauer beim sequentiellen Ausführen dieser Operation 1:44 Minuten.

Figure 3: Screenshot Windows Powershell

Abb. 4: Sequentielle Verarbeitung einer ForEach-Object Schleife in Windows PowerShell

Im zweiten Teil wird die Operation in PowerShell 7 ausgeführt und der Parameter -Parallel ergänzt:

# Parallel processing
Measure-Command {
		$port = '53','80','88','443'
		$port | ForEach-Object -Parallel {
				Test-NetConnection -ComputerName 172.30.5.10 -Port $_ 
		}
} | Select-Object Minutes,Seconds

Wie Abbildung 5  zeigt, beträgt die Dauer bei der parallelen Verarbeitung dieser Operation nur 15 Sekunden.

Figure 4: Screenshot Powershell 7

Figure 4: Parallel processing of a ForEach-Object loop in PowerShell 7

Weitere Use Cases, in denen sich die parallele Verarbeitung lohnt, zeigen wir in unserem Webinar „Erfolgreich automatisieren mit PowerShell 7„.

Fehlerbehandlung in PowerShell 7: ConciseView und Get-Error Cmdlet

PowerShell 7 erweitert die Variable $ErrorView um neue Optionen, um die Darstellung von Fehlermeldungen nutzerfreundlicher zu machen: Zusätzlich zu den bisherigen Views (NormalView und CategoryView) bietet der ConciseView eine vereinfachte Fehleransicht.

Außerdem kann über das neue Get-Error Cmdlet eine umfassende detaillierte Ansicht des Fehlers, einschließlich Exceptions, StackTrace usw. aufgerufen werden.

 

Fazit

Die oben beschriebenen Features zeigen nur einen kleinen Ausschnitt der Neuerungen, die PowerShell 7 mit sich bringt. In der Linksammlung unten finden Sie einige Quellen, die Sie nutzen können, um sich bezüglich neuer Releases auf dem Laufenden zu halten.

Eine weitere Möglichkeit, sich mit den wichtigsten Neuerungen vertraut zu machen, bietet das ScriptRunner Webinar „Erfolgreich automatisieren mit PowerShell 7“ in dem Sie nicht nur weitere Neuerungen und Anwendungsszenarien von PowerShell 7 kennenlernen, sondern auch erfahren, wie Sie diese in ScriptRunner nutzen können.

Zusammenhängende Posts

5 min read

Microsoft Exchange mit PowerShell managen

2 min read

VMUG Webcast: VMware Management meistern mit PowerCLI