PowerShell 7 die Neuerungen, was erwartet den Umsteiger
PowerShell 7 Theme
PowerShell 7 die Neuerungen, was erwartet den Umsteiger

Überblick

Windows PowerShell (für Windows) und PowerShell Core (für Windows, MacOS und Linux) wurden in PowerShell 7 zusammengeführt und bilden deren Nachfolger.

PowerShell 7 basiert und ist kompatibel mit .NET Core 3.1 (LTS).

PowerShell 7 ist abwärtskompatibel und kann auch parallel zu Windows PowerShell produktiv genutzt werden.

PowerShell 7 ist auch für .NET-Entwickler attraktiv, da man in einer einzigen Skriptsprache plattformübergreifend .NET-Anwendungen schreiben kann.

Screenshot PowerShell 7 Console

Die Neuerungen und Änderungen der PowerShell 7 beziehen sich auf folgende Bereiche:

  • Allgemeine und übergreifende Änderungen
  • Cmdlets
  • System-Variablen
  • Operatoren
  • PowerShell-Verhalten
  • Handling & Dokumentation

Was ist neu und lohnt der Umstieg?

Die aktuellste Version von PowerShell 7 können Sie auf GitHub beziehen:
PowerShell 7 Download.

Die offizielle Beschreibung der Änderung in PowerShell finden Sie hier:
What's New in PowerShell 7.0.

Den Verlauf der Veröffentlichung von PowerShell Modulen finden Sie hier:
Release-Verlauf von Modulen und Cmdlets.

Schnelleinstieg - PowerShell Tutorial für Einsteiger und Profis.

PowerShell 7 wird für folgende Betriebssysteme angeboten:

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

Nach der Installation von PowerShell 7 finden Sie den neuen Kommandozeileninterpreter unter:
& 'C:\Program Files\PowerShell\7\PwSh.exe'

TIPP - Denken Sie auch daran, nach der Installation von PowerShell 7 Ihre Module und Hilfe-Dateien zu aktualisieren.

# TODO Module aktualisieren:
Update-Module -Name '*' -Scope 'AllUsers' -AcceptLicense -Force
Update-Module -Name '*' -Scope 'CurrentUser' -AcceptLicense -Force

# TODO Hilfe aktualisieren:
Update-Help -Name '*' -UICulture 'en-US' -Scope 'AllUsers' -Force

1. Experimentelle Funktionen

Die Unterstützung für experimentelle Funktionen in PowerShell 7 bietet einen Mechanismus, mit dem experimentelle Funktionen mit vorhandenen stabilen Funktionen koexistieren können (s. about_Experimental_Features).

# ? Funktionen die sich noch Experimentierstatus befinden ein- / ausschalten:
Get-ExperimentalFeature | Enable-ExperimentalFeature
Get-ExperimentalFeature | Disable-ExperimentalFeature

Get-ExperimentalFeature

Zum Beispiel Command-Vorschläge bei nicht gefunden Schlüsselwörter anzeigen (Command not found Suggestion):

# READ Get-Help -Name 'about_Experimental_Feature' -ShowWindow
Enable-ExperimentalFeature -Name 'PSCommandNotFoundSuggestion'

Jetzt schreiben Sie in der PowerShell-Console nur get und lassen sich anschließend mit CTRL+SPACE die Autovervollständigung anzeigen.

TIPP - Experimentelle Funktionen können auch in eigene Module implementiert werden.

Allgemeine Änderungen in PowerShell 7

  • Beim starten des PowerShell-7-Host informiert dieser über das Vorhandensein von Updates:
Get-Help -Name "about_Update_Notifications" -ShowWindow

& PwSh.exe
  • Neue Module-Installationsorte:
$env:PSModulePath -split ";"
  • Windows-PowerShell-Module stehen durch den "Windows Compatibility Wrapper" auch in PowerShell 7 zur Verfügungen. Windows PowerShell 5.1 ist zusätzlich nötig. Wenn das Module-Manifest nicht angibt ob dass Modul mit Core kompatibel ist, wird das Modul in einen Windows PowerShell-Prozess geladen und mittels Remoting in die aktuell PowerShell 7-Sitzung gespiegelt:
# Beschreibt die Windows PowerShell-Kompatibilitätsfunktion für PowerShell 7:
Get-Help -Name "about_Windows_PowerShell_Compatibility" -ShowWindow

Get-Module -ListAvailable -SkipEditionCheck

Import-Module -Name "Microsoft.PowerShell.Archive" -UseWindowsPowerShell

Install-Module -Name "WindowsCompatibility" -Scope "CurrentUser" -AllowClobber -SkipPublisherCheck -Force

Get-Command -Module "WindowsCompatibility"

Get-WinModule -Name "*"

Import-WinModule -Name "Microsoft.PowerShell.LocalAccounts"

Get-LocalUser
  • Ein neues PS-Laufwerk um benutzerbezogene temporäre Dateien abzulegen:
Get-PSDrive -Name "Temp"
Get-ChildItem -Path "Temp:\"
  • Invoke-DscResource arbeit jetzt OS-übergreifende (experimental):
Get-ExperimentalFeature -Name "PSDesiredStateConfiguration.InvokeDscResource" | Enable-ExperimentalFeature

PowerShell Remoting-Zugriff über SSH.

Write-Progress fortschritts-Balken wird nun in Visual Studio Code angezeigt:

1..100 | ForEach-Object -Process { Write-Progress -Activity "Test-Fortschritt" -PercentComplete $_ ; Start-Sleep -Milliseconds 20 }

Neue und geänderte Cmdlets

Clear-RecycleBin - das neue Cmdlet leert den Papierkorb:

Clear-RecycleBin -Force

Get-Error - für die Fehler-Analyse/-Auswertung liefert das neue Cmdlet wichtige Informationen:

# * Fehler provozieren!
Get-Process -FileVersionInfo

# Der letzte Fehler:
Get-Error

# Die letzten 2 Fehler:
Get-Error -Newest 2

# oder so:
Get-Process -FileVersionInfo -ErrorAction "SilentlyContinue" -ErrorVariable "gpErrors"
$gpErrors | Get-Error

Out-GridView - ein neues Module (Microsoft.PowerShell.GraphicalTools, Version 0.2.0) für OS-Übergreifende GUI's (Out-GridView, Show-Command, Get-Help -ShowWindow):

Install-Module -Name "Microsoft.PowerShell.GraphicalTools" -Scope "CurrentUser" -AllowClobber -SkipPublisherCheck -AllowPrerelease -AcceptLicense -Force

Remove-Alias -Name "ogv" -Force

Import-Module -Name "Microsoft.PowerShell.GraphicalTools" -Force

Get-Command -Module "Microsoft.PowerShell.GraphicalTools"

Get-Process | Out-GridView
Show-Command -Name "Update-List" -NoCommonParameter -ErrorPopup
Get-Help -Name "Update-List" -ShowWindow

Test-Json - das neue Cmdlet bietet eine JSON-Schema-Validierung:

$schema = @'
{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/root.json",
  "type": "object",
  "title": "The Root Schema",
  "required": [
    "name",
    "age"
  ],
  "properties": {
    "name": {
      "$id": "#/properties/name",
      "type": "string",
      "title": "The Name Schema",
      "default": "",
      "examples": [
        "Ashley"
      ],
      "pattern": "^(.*)$"
    },
    "age": {
      "$id": "#/properties/age",
      "type": "integer",
      "title": "The Age Schema",
      "default": 0,
      "examples": [
        25
      ]
    }
  }
}
'@
"{'name': 'Ashley', 'age': '25'}" | Test-Json -Schema $schema

ForEach-Object - dieses Cmdlet wurde um eine parallele Verarbeitung erweitert:

Get-Help -Name "ForEach-Object" -ShowWindow

# ! Langsam !
1..8 | ForEach-Object -Process { "Verarbeite Schritt $_" | Write-Warning ; Start-Sleep -Seconds 1 }

# ? Schnell !
1..8 | ForEach-Object -Parallel { "Verarbeite Schritt $_" | Write-Warning ; Start-Sleep -Seconds 1 } -ThrottleLimit 4

PowerShell 7 unterstützt jetzt die Markdown-Auszeichnungssprache. Markdown ist eine vereinfachte Auszeichnungssprache. Ein Ziel von Markdown ist, dass schon die Ausgangsform ohne weitere Konvertierung leicht lesbar ist:

Get-Command -Noun 'Markdown', 'MarkdownOption' -Module 'Microsoft.PowerShell.Utility'

$md = @'
# Überschrift 1

## Überschrift 2

Markdown ist eine vereinfachte **Auszeichnungssprache**. Ein Ziel von Markdown ist, dass schon die *Ausgangsform* ohne weitere Konvertierung **leicht lesbar** ist.

- [ ] Aufgabe 1
- [X] Aufgabe 2
- [ ] Aufgabe 3
'@
$md | ConvertFrom-Markdown -AsVT100EncodedString | Select-Object -ExpandProperty 'VT100EncodedString'
$md | ConvertFrom-Markdown  | Select-Object -ExpandProperty 'Html'
$md | ConvertFrom-Markdown | Show-Markdown -UseBrowser
Get-MarkdownOption

Where-Object - das Cmdlet wurde um einen -Not Switch-Parameter erweitert:

Get-Service | Where-Object -Not -Property "DependentServices"
  • Format-Hex - für die hexadezimale Darstellung von unterschiedlichen Pipeline-Objekten wurde das Cmdlet verbessert:
123, "Hallo Würzburg!", (Get-Item "C:\Windows\win.ini") | Format-Hex -Encoding unicode
  • Select-String - dieses Cmdlet wurde verbessert, um die Fundstellen visuelle Hervorzuheben:
Get-ChildItem 'C:\Windows\Logs\DISM\dism.log' | Select-String 'Error' | Select-Object -First 10

Der Switch-Parameter -NoEmphasis deaktiviert die Hervorhebung.

Update-List - das neue Cmdlet aktualisiert Listen-Einträge (Add / Remove) von Listen-Objekt-Eigenschaften:

class OsDetails {
    [System.Collections.ArrayList]$ProcessItems
    OsDetails() {
        $this.ProcessItems = New-Object -TypeName "System.Collections.ArrayList"
    }
}

$osd = New-Object -TypeName "OsDetails"
$osd.ProcessItems.AddRange((Get-Process | Select-Object -First 3))
$osd.ProcessItems

$notepad = Start-Process "notepad" -PassThru

$osd | Update-List -Property "ProcessItems" -Add $notepad | Out-Null
$osd.ProcessItems

$osd | Update-List -Property "ProcessItems" -Remove $notepad | Out-Null
$osd.ProcessItems

PowerShell 7 Variablen

  • $ErrorView - Die neue Variable bestimmen die Standard-Fehlerausgabe-Menge:
Get-help -Name "ABOUT_PREFERENCE_VARIABLES" -ShowWindow

$ErrorView

# ? Umfassende Fehler-Ausgabe:
$ErrorView = [System.Management.Automation.ErrorView]::NormalView
Get-Item -Path "C:\GibtEsNicht" # * Fehler provozieren!

# ? Fehler-Ausgabe enthält nur eine Kurzfassung (DEFAULT):
$ErrorView = [System.Management.Automation.ErrorView]::ConciseView
Get-Item -Path "C:\GibtEsNicht" # * Fehler provozieren!

# ? Fehler-Ausgabe enthält nur die Kategorie:
$ErrorView = [System.Management.Automation.ErrorView]::CategoryView
Get-Item -Path "C:\GibtEsNicht" # * Fehler provozieren!
  • $ErrorActionPreference - Wird der Variable bzw. dem Parameter -ErrorAction der neue Enum-Wert Break zugewiesen, hält die Ausführung an und es wird in den DEBUG-Modus gewechselt:
$ErrorActionPreference = [System.Management.Automation.ActionPreference]::Break
Get-Process -FileVersionInfo -ErrorAction "Break"

Neue und geänderte Operatoren

Die neuen Operatoren der PowerShell 7
Die neuen Operatoren der PowerShell 7

-split - dieser Operator wurde um die Möglichkeit erweitert, eine Anzahl an Elemente VON RECHTS zu erhalten:

# * ALT: Splittet nur 3 Elemente von Links:
"a b c d e" -split " ",  3

#   NEU: Splittet nur 3 Elemente von Rechts:
"a b c d e" -split " ", -3

a ? b : c - Ternary-Operator - ein dreiteiliger Inline-If-Operator wurde hinzugefügt:

# WENN                     ? DANN                                            : SONST
  ($PSCulture -ieq 'de-DE' ? 'Die PS-Sprache steht auf deutsch-Deutschland.' : "Die PS-Sprache steht auf $PSCulture.") | Write-Warning

&& und || - Pipeline chain operators - Diese Pipeline-Verkettung-Operatoren wurden hinzugefügt:

1/0.1 && "Ich werde ausgeführt wenn die vorherige Anweisung ERFOLGREICH war." | Write-Warning

1/0   || "Ich werde ausgeführt wenn die vorherige Anweisung ERFOLGLOS war."   | Write-Warning

Beschreibt die Verkettung von Pipelines mit && und || Operatoren:
Get-Help -Name "about_Pipeline_Chain_Operators" -ShowWindow

Ein tiefen Einblick in in die Pipeline-Verarbeitung vermittelt der Artikel:
PowerShell Pipeline Sinn & Nutzen.

?? - Null-coalescing operator - NULL-Sammel-Operator wurde hinzugefügt. In Abhängigkeit von einem NULL-Wert soll eine Fallunterscheidung statt finden, was bist dato wie folgt implementiert werden musste:

$a = $null # bzw. $a = 'Dies ist der Inhalt von $a'
if($null -ne $a) {
    $a | Write-Warning
}
else {
    '$a ist ohne Inhalt!' | Write-Warning
}

Dieses Konstrukt lässt sich nun vereinfacht wie folgt implementieren:

$a = $null # bzw. $a = 'Dies ist der Inhalt von $a'
# Sollte $a gleich NULL sein, wird anstelle dessen der String zurückgegeben:
$a ?? '$a ist ohne Inhalt!' | Write-Warning

Die NULL-Sammeloperatoren sind rechtsassoziativ d.h. $a ?? $b ?? $c wird wie folgt abgearbeitet:

$a = $null
$b = $null
$c = 3
$a ?? $b ?? $c

# identisch mit:
$a ?? ($b ?? $c)

??=, ?. - Null-conditional operators - dieser Operatoren wurden hinzugefügt. Sollte eine Variable $NULL enthalten, soll dieser einen Default-Wert zugewiesen werden, was bist dato wie folgt implementiert werden musste:

$a = $null # bzw. $a = 123
if($null -eq $a) {
    $a = 'Diesen String als Default-Wert setzen, wenn $a gleich NULL ist.'
}
$a | Write-Warning

Dieses Konstrukt lässt sich nun vereinfacht wie folgt implementieren:

Get-ExperimentalFeature -Name "PSNullConditionalOperators" | Enable-ExperimentalFeature

$a = $null # bzw. $a = 123
$a ??= 'Diesen String als Default-Wert setzen, wenn $a gleich NULL ist.'
$a | Write-Warning

Oder so:

$t = Get-Process -Name "SvcHost" | Select-Object -First 1
$t.ToString() # Geht!

$t = Get-Process -Name "GibtEsNicht" | Select-Object -First 1
# * ALT: Problematisch, da eine Exception ausgelöst wird ($t = NULL)
$t.ToString()

# NEU: Lösung: Löst keinen Exception aus, wenn $t gleich NULL ist
${t}?.ToString()

Änderungen im Handling & Dokumentation

  • Anzeige von Methoden-Signaturen von COM-Objekten
$excel = New-Object -ComObject "Excel.Application"

# TODO Methode ohne Klammern d.h. unvollständig ausführen um so weitere Details zu erhalten:
$excel.Save
  • Autovervollständigung

Es gibt eine Autovervollständigung (CTRL + SPACE) für das Zuweisen von Aufzählungs-Werten (Enum) zu Variablen.

$ErrorActionPreference = 'Stop'
# ?                      ^ An dieser Stelle in der Console CTRL+SPACE drücken.

Nachschlage-Lektüren

  • Wichtige neue about_*-Seiten lesen:
# PSReadLine bietet eine verbesserte Bearbeitungsfunktion für Befehlszeilen in der PowerShell-Konsole.
Get-Help -Name "about_PSReadLine" -ShowWindow

# Multiplikatorsuffixe für Ganzzahl und Real
Get-Help -Name "about_Numeric_Literals" -ShowWindow

# Konfigurationsdateien für PowerShell, die Registrierungs-Konfiguration ersetzen.
Get-Help -Name "about_PowerShell_Config" -ShowWindow

# Erläutert die Verwendung des PwSh-Befehlszeilentools.
Get-Help -Name "about_PwSh" -ShowWindow

# Beschreibt die in PowerShell gesammelte Telemetrie und das Deaktivieren.
Get-Help -Name "about_Telemetry" -ShowWindow
  • Für Einsteiger:
# Listet die Cmdlets auf, die für die Verwendung mit PowerShell-Anbietern vorgesehen sind.
Get-Help -Name "about_Core_Commands" -ShowWindow

# Beschreibt die Schlüsselwörter in der PowerShell-Skriptsprache.
Get-Help -Name "about_Language_Keywords" -ShowWindow

# Beschreibt das Bearbeiten von Befehlen an der PowerShell-Eingabeaufforderung.
Get-Help -Name "about_Line_Editing" -ShowWindow

# Listet die PowerShell-Operatoren in der Rangfolge auf.
Get-Help -Name "about_Operator_Precedence" -ShowWindow

# Beschreibt, wie PowerShell Befehle analysiert.
Get-Help -Name "about_Parsing" -ShowWindow

# Beschreibt die vollständigen und relativen Pfadnamenformate in PowerShell.
Get-Help -Name "about_Path_Syntax" -ShowWindow

# Beschreibt Regeln für die Verwendung von einfachen und doppelten Anführungszeichen in PowerShell.
Get-Help -Name "about_Quoting_Rules" -ShowWindow

# Listet die reservierten Wörter auf, die nicht als Bezeichner verwendet werden können.
Get-Help -Name "about_Reserved_Words" -ShowWindow
  • Thema OOP:
# Beschreibt das Schlüsselwort Hidden, mit dem Klassenmitglieder vor den Standardergebnissen für Get-Member ausgeblendet werden.
Get-Help -Name "about_Hidden" -ShowWindow
  • Thema Unit-Testing-Framework (Pester):
# Pester ist ein Test-Framework für Windows PowerShell.
Get-Help -Name "about_Pester" -ShowWindow

# Bietet Assertion Convenience-Methoden zum Vergleichen von Objekten und zum Auslösen von Testfehlern, wenn die Testerwartungen fehlschlagen.
Get-Help -Name "about_Should" -ShowWindow

# Beschreibt die Befehle BeforeEach und AfterEach, mit denen eine Reihe von Befehlen ausgeführt wird, die Sie vor oder nach jedem It-Block angeben.
Get-Help -Name "about_BeforeEach_AfterEach" -ShowWindow

# Pester bietet eine Reihe von Mock-Funktionen, mit denen sich Abhängigkeiten leicht vortäuschen und das Verhalten überprüfen lassen.
Get-Help -Name "about_Mocking" -ShowWindow

# Ein PSDrive für Datei-Aktivitäten, das auf den Umfang eines einzelnen Beschreibungs- oder Kontextblocks beschränkt ist.
Get-Help -Name "about_TestDrive" -ShowWindow

Bitte bewerten Sie diesen Artikel


Dieser Beitrag hat einen Kommentar

Schreibe einen Kommentar