PowerShell

Aus besserwiki.de
PowerShell
PowerShell Core 6.0 icon.png
PowerShell Core 7.1.5 with Windows Terminal.png
Screenshot einer PowerShell 7-Sitzung in Windows Terminal
ParadigmaImperativ, Pipeline, objektorientiert, funktional und reflektiv
Entworfen vonJeffrey Snover, Bruce Payette, James Truher (u. a.)
EntwicklerMicrosoft
Erstmals erschienenNovember 14, 2006; vor 16 Jahren
Stabile Version
7.2.5 / 21. Juni 2022; vor 8 Monaten
Vorschau-Version
v7.3.0-preview.5 / 24. Juni 2022; vor 7 Monaten
Disziplin bei der TypisierungStark, sicher, implizit und dynamisch
ImplementierungsspracheC#
Plattform.NET
BETRIEBSSYSTEM
  • Windows 7 und höher
  • Windows Server 2008 R2 und höher
  • macOS 10.12 und höher
  • Ubuntu 14.04, 16.04, 18.04 und 20.04
  • Debian 8.7+, 9 und 10
  • CentOS 7 und 8
  • Red Hat Enterprise Linux 7 und 8
  • openSUSE 42.2, 42.3, 15.0, 15.1, 15.2
  • Fedora 28, 29, 30
LizenzMIT-Lizenz (aber die Windows-Komponente bleibt proprietär)
Dateinamen-Erweiterungen
  • .ps1 (Skript)
  • .ps1xml (XML-Dokument)
  • .psc1 (Konsolendatei)
  • .psd1 (Datendatei)
  • .psm1 (Skript-Modul)
  • .pssc (Sitzungskonfigurationsdatei)
  • .psrc (Rollenfähigkeitsdatei)
  • .cdxml (Cmdlet-Definitions-XML-Dokument)
Beeinflusst von
Python, Ksh, Perl, C#, CL, DCL, SQL, Tcl, Tk, Chef, Puppet

PowerShell ist ein Programm zur Aufgabenautomatisierung und Konfigurationsverwaltung von Microsoft, das aus einer Befehlszeilen-Shell und der dazugehörigen Skriptsprache besteht. Ursprünglich eine reine Windows-Komponente, bekannt als Windows PowerShell, wurde es am 18. August 2016 mit der Einführung von PowerShell Core quelloffen und plattformübergreifend gemacht. Erstere basiert auf dem .NET Framework, letztere auf .NET Core.

In der PowerShell werden administrative Aufgaben in der Regel über Cmdlets (sprich: Command-Lets) ausgeführt, die spezialisierte .NET-Klassen sind, die eine bestimmte Operation implementieren. Sie greifen auf Daten in verschiedenen Datenspeichern wie dem Dateisystem oder der Windows-Registrierung zu, die der PowerShell über Anbieter zur Verfügung gestellt werden. Entwickler von Drittanbietern können Cmdlets und Anbieter zu PowerShell hinzufügen. Cmdlets können von Skripts verwendet werden, die wiederum in Module verpackt werden können. Cmdlets arbeiten mit der .NET-API zusammen.

Die Unterstützung von PowerShell für .NET Remoting, WS-Management, CIM und SSH ermöglicht es Administratoren, Verwaltungsaufgaben sowohl auf lokalen als auch auf Remote-Windows-Systemen durchzuführen. PowerShell bietet auch eine Hosting-API, mit der die PowerShell-Laufzeit in andere Anwendungen eingebettet werden kann. Diese Anwendungen können dann die PowerShell-Funktionalität verwenden, um bestimmte Vorgänge zu implementieren, einschließlich derjenigen, die über die grafische Oberfläche zugänglich sind. Diese Fähigkeit wurde von Microsoft Exchange Server 2007 genutzt, um seine Verwaltungsfunktionen als PowerShell-Cmdlets und -Provider bereitzustellen und die grafischen Verwaltungstools als PowerShell-Hosts zu implementieren, die die erforderlichen Cmdlets aufrufen. Andere Microsoft-Anwendungen, einschließlich Microsoft SQL Server 2008, stellen ihre Verwaltungsschnittstelle ebenfalls über PowerShell-Cmdlets zur Verfügung.

PowerShell enthält eine eigene umfangreiche, konsolenbasierte Hilfe (ähnlich den Man Pages in Unix-Shells), die über das Cmdlet Get-Help zugänglich ist. Aktualisierte lokale Hilfeinhalte können über das Cmdlet "Update-Help" aus dem Internet abgerufen werden. Alternativ kann die Hilfe aus dem Internet von Fall zu Fall über die Option -online in Get-Help abgerufen werden.

PowerShell
PowerShell 6.0 icon
Windows PowerShell
Screenshot der powershell.exe 5.0 innerhalb conhost.exe unter Windows 8.1
Basisdaten
Entwickler Microsoft
Betriebssystem Microsoft Windows, ab Version 6 auch Linux und macOS
Kategorie Kommandozeileninterpreter
Lizenz Proprietär, MIT-Lizenz
deutschsprachig ja
PowerShell

Seit Version 6 basiert PowerShell auf der Core Common Language Runtime (CoreCLR) und ist als plattformübergreifendes Open-Source-Projekt unter der MIT-Lizenz für Linux, macOS und Windows verfügbar.

Hintergrund

Hintergrund

Der Befehlszeileninterpreter (CLI) war ein untrennbarer Bestandteil der meisten Microsoft-Betriebssysteme. MS-DOS und Xenix stützten sich fast ausschließlich auf die CLI. (MS-DOS 5 wurde mit einer ergänzenden DOS-Shell geliefert.) Die Windows 9x-Familie wurde mit COMMAND.COM, der Befehlszeilenumgebung von MS-DOS, ausgeliefert. Die Windows NT- und Windows CE-Familien wurden jedoch mit einer neuen cmd.exe ausgeliefert, die starke Ähnlichkeiten mit COMMAND.COM aufwies. Beide Umgebungen unterstützen einige grundlegende interne Befehle und eine primitive Skriptsprache (Stapeldateien), die zur Automatisierung verschiedener Aufgaben verwendet werden können. Sie können jedoch nicht alle Facetten der grafischen Benutzeroberfläche (GUI) von Windows automatisieren, da die Befehlszeilenäquivalente von Operationen begrenzt sind und die Skriptsprache elementar ist.

Microsoft versuchte, einige dieser Mängel zu beheben, indem es 1998 mit Windows 98 den Windows Script Host und seinen kommandozeilenbasierten Host, cscript.exe, einführte. Er ist mit der Active-Script-Engine integriert und ermöglicht das Schreiben von Skripten in kompatiblen Sprachen wie JScript und VBScript, wobei die von Anwendungen über das Component Object Model (COM) bereitgestellten APIs genutzt werden. Es hat jedoch seine eigenen Schwächen: Seine Dokumentation ist nicht sehr zugänglich, und es erlangte schnell den Ruf, ein Schwachpunkt im System zu sein, nachdem mehrere bekannte Computerviren Schwächen in seinen Sicherheitsvorkehrungen ausgenutzt hatten. Verschiedene Windows-Versionen boten verschiedene spezielle Befehlszeileninterpreter (wie netsh und WMIC) mit eigenen Befehlssätzen, die jedoch nicht interoperabel waren. Windows Server 2003 unternahm weitere Versuche, die Befehlszeile zu verbessern, aber die Skriptunterstützung war immer noch nicht zufriedenstellend.

Kermit

In den späten 1990er Jahren wandte sich Intel an Microsoft mit der Bitte um Hilfe, Windows, das auf Intel-CPUs lief, zu einer geeigneteren Plattform zu machen, um die Entwicklung zukünftiger Intel-CPUs zu unterstützen. Zu dieser Zeit wurde die Entwicklung von Intel-CPUs auf Sun Microsystems-Computern durchgeführt, auf denen Solaris (eine Unix-Variante) auf CPUs mit RISC-Architektur lief. Die Möglichkeit, die vielen KornShell-Automatisierungsskripte von Intel unter Windows auszuführen, wurde als Schlüsselfunktion erkannt. Intern begann Microsoft mit der Entwicklung einer Windows-Portierung der KornShell, die den Codenamen Kermit erhielt. Intel wechselte schließlich zu einer Linux-basierten Entwicklungsplattform, die auf Intel-CPUs laufen konnte, wodurch das Kermit-Projekt überflüssig wurde. Mit einem vollständig finanzierten Team erkannte Jeffrey Snover, Programmmanager bei Microsoft, die Möglichkeit, eine allgemeinere Lösung für Microsofts Problem der Verwaltungsautomatisierung zu entwickeln.

Monad

Im Jahr 2002 begann Microsoft mit der Entwicklung eines neuen Konzepts für die Befehlszeilenverwaltung, einschließlich einer Befehlszeilenschnittstelle namens Monad (auch bekannt als Microsoft Shell oder MSH). Die Ideen dahinter wurden im August 2002 in einem Whitepaper mit dem Titel "Monad Manifesto" von Jeffrey Snover, dem leitenden Architekten, veröffentlicht. In einem Interview aus dem Jahr 2017 erklärt Snover die Entstehung der PowerShell, indem er sagt, dass er versucht hat, Unix-Tools unter Windows verfügbar zu machen, was aufgrund der "grundlegenden architektonischen Unterschiede zwischen Windows und Linux" nicht funktioniert hat. Insbesondere stellte er fest, dass Linux alles als ASCII-Textdatei betrachtet, während Windows alles als "API, die strukturierte Daten zurückgibt", betrachtet. Sie seien grundsätzlich inkompatibel, was ihn dazu veranlasste, einen anderen Ansatz zu wählen.

Monad sollte eine neue, erweiterbare Befehlszeilenschnittstelle (CLI) mit einem neuen Design sein, die eine Reihe von wichtigen Verwaltungsaufgaben automatisieren kann. Microsoft präsentierte Monad erstmals öffentlich auf der Professional Development Conference in Los Angeles im Oktober 2003. Einige Monate später wurde eine private Betaversion gestartet, die schließlich in eine öffentliche Betaversion mündete. Microsoft veröffentlichte die erste öffentliche Beta-Version von Monad am 17. Juni 2005, die Beta 2 am 11. September 2005 und die Beta 3 am 10. Januar 2006.

PowerShell

Am 25. April 2006, nicht lange nach der ersten Ankündigung von Monad, gab Microsoft bekannt, dass Monad in Windows PowerShell umbenannt wurde, um es als wichtigen Teil seines Angebots an Verwaltungstechnologie zu positionieren. Release Candidate (RC) 1 von PowerShell wurde zur gleichen Zeit veröffentlicht. Ein wichtiger Aspekt sowohl der Namensänderung als auch des RC war, dass es sich nun um eine Komponente von Windows handelte und nicht mehr um ein bloßes Add-on.

Release Candidate 2 von PowerShell Version 1 wurde am 26. September 2006 veröffentlicht, die endgültige Veröffentlichung im Internet erfolgte am 14. November 2006. PowerShell für frühere Versionen von Windows wurde am 30. Januar 2007 veröffentlicht. Die Entwicklung von PowerShell v2.0 begann vor der Auslieferung von PowerShell v1.0. Während der Entwicklung lieferte Microsoft drei Community Technology Previews (CTP) aus. Microsoft stellte diese Versionen der Öffentlichkeit zur Verfügung. Die letzte CTP-Version von Windows PowerShell v2.0 wurde im Dezember 2008 zur Verfügung gestellt.

PowerShell für Linux 6.0 Alpha 9 auf Ubuntu 14.04 x64

PowerShell v2.0 wurde im August 2009 als integraler Bestandteil von Windows 7 und Windows Server 2008 R2 fertiggestellt und für die Produktion freigegeben. Versionen von PowerShell für Windows XP, Windows Server 2003, Windows Vista und Windows Server 2008 wurden im Oktober 2009 veröffentlicht und stehen sowohl für 32-Bit- als auch für 64-Bit-Plattformen zum Download bereit. In einer Ausgabe des TechNet Magazine vom Oktober 2009 bezeichnete Microsoft die Beherrschung der PowerShell als "die wichtigste Fähigkeit, die ein Windows-Administrator in den kommenden Jahren benötigen wird".

Windows 10 enthielt ein Test-Framework für PowerShell.

Am 18. August 2016 gab Microsoft bekannt, dass es PowerShell als Open Source und plattformübergreifend mit Unterstützung für Windows, macOS, CentOS und Ubuntu veröffentlicht hat. Der Quellcode wurde auf GitHub veröffentlicht. Mit der Umstellung auf Open Source entstand eine zweite Inkarnation der PowerShell namens "PowerShell Core", die auf .NET Core läuft. Sie unterscheidet sich von der "Windows PowerShell", die auf dem vollständigen .NET Framework ausgeführt wird. Ab Version 5.1 ist PowerShell Core im Lieferumfang von Windows Server 2016 Nano Server enthalten.

Entwurf

Eine wichtige Designtaktik für PowerShell war die Nutzung der großen Anzahl von APIs, die bereits in Windows, Windows Management Instrumentation, .NET Framework und anderer Software vorhanden waren. PowerShell-Cmdlets "umschließen" vorhandene Funktionen. Diese Taktik zielt darauf ab, eine verwalterfreundliche, konsistentere Schnittstelle zwischen Administratoren und einer Vielzahl von zugrunde liegenden Funktionen bereitzustellen. Mit PowerShell muss ein Administrator keine Kenntnisse in .NET, WMI oder Low-Level-API-Codierung haben und kann sich stattdessen auf die Verwendung der von PowerShell bereitgestellten Cmdlets konzentrieren. In dieser Hinsicht schafft PowerShell kaum neue Funktionen, sondern konzentriert sich darauf, vorhandene Funktionen für eine bestimmte Zielgruppe zugänglicher zu machen.

Grammatik

Die Entwickler von PowerShell haben die Kerngrammatik des Tools an die POSIX 1003.2 KornShell angelehnt.

Die Sprache von PowerShell wurde jedoch auch von PHP, Perl und vielen anderen bestehenden Sprachen beeinflusst.

Benannte Befehle

Windows PowerShell kann vier Arten von benannten Befehlen ausführen:

  • Cmdlets (.NET Framework-Programme, die für die Interaktion mit PowerShell entwickelt wurden)
  • PowerShell-Skripts (Dateien mit der Endung .ps1)
  • PowerShell-Funktionen
  • Eigenständige ausführbare Programme

Wenn es sich bei einem Befehl um ein eigenständiges ausführbares Programm handelt, wird er von PowerShell in einem separaten Prozess gestartet; wenn es sich um ein Cmdlet handelt, wird es im PowerShell-Prozess ausgeführt. PowerShell bietet eine interaktive Befehlszeilenschnittstelle, über die die Befehle eingegeben und ihre Ausgabe angezeigt werden kann. Die Benutzeroberfläche bietet eine anpassbare Tabulatorvervollständigung. PowerShell ermöglicht die Erstellung von Aliasen für Cmdlets, die PowerShell textuell in Aufrufe der ursprünglichen Befehle übersetzt. PowerShell unterstützt sowohl benannte als auch positionale Parameter für Befehle. Bei der Ausführung eines Cmdlets wird die Aufgabe der Bindung des Argumentwerts an den Parameter von PowerShell selbst übernommen, aber bei externen ausführbaren Dateien werden die Argumente von der externen ausführbaren Datei unabhängig von der PowerShell-Interpretation geparst.

PowerShell wurde speziell für die Systemverwaltung und -automatisierung entworfen.

Sie verbindet die aus Unix-Shells bekannte Philosophie von Pipes und Filtern mit dem Paradigma der objektorientierten Programmierung. Der Benutzer kann wie bisher einfache Befehle an einer Kommandozeile ausführen und miteinander verknüpfen oder aber auch komplexe Skript-Programme mit der eigens dafür entwickelten PowerShell Scripting Language schreiben.

Die PowerShell erlaubt Zugriff auf WMI-Klassen, COM-Objekte sowie auf das gesamte .NET Framework.

Erweitertes Typsystem

Das erweiterte PowerShell-Typsystem (Extended Type System, ETS) basiert auf dem .NET-Typsystem, verfügt jedoch über eine erweiterte Semantik (z. B. propertySets und Erweiterbarkeit durch Drittanbieter). Es ermöglicht beispielsweise die Erstellung verschiedener Ansichten von Objekten, indem nur eine Teilmenge der Datenfelder, Eigenschaften und Methoden offengelegt wird, sowie die Angabe von benutzerdefiniertem Formatierungs- und Sortierverhalten. Diese Ansichten werden mithilfe von XML-basierten Konfigurationsdateien auf das ursprüngliche Objekt abgebildet.

Cmdlets

Cmdlets sind spezialisierte Befehle in der PowerShell-Umgebung, die bestimmte Funktionen implementieren. Dies sind die nativen Befehle im PowerShell-Stapel. Cmdlets folgen einem Verb-Nomen-Benennungsmuster, wie z. B. Get-ChildItem, wodurch der Code selbstdokumentierend ist. Cmdlets geben ihre Ergebnisse als Objekte aus und können auch Objekte als Eingabe empfangen, wodurch sie sich für die Verwendung als Empfänger in einer Pipeline eignen. Wenn ein Cmdlet mehrere Objekte ausgibt, wird jedes Objekt in der Sammlung durch die gesamte Pipeline weitergereicht, bevor das nächste Objekt verarbeitet wird.

Cmdlets sind spezialisierte .NET-Klassen, die die PowerShell-Laufzeit instanziiert und zur Ausführungszeit aufruft. Cmdlets leiten sich entweder von Cmdlet oder von PSCmdlet ab, wobei Letzteres verwendet wird, wenn das Cmdlet mit der PowerShell-Laufzeitumgebung interagieren muss. Diese Basisklassen legen bestimmte Methoden fest - BeginProcessing(), ProcessRecord() und EndProcessing() -, die von der Cmdlet-Implementierung überschrieben werden, um die Funktionalität bereitzustellen. Wenn ein Cmdlet ausgeführt wird, ruft PowerShell diese Methoden nacheinander auf, wobei ProcessRecord() aufgerufen wird, wenn es Pipelineeingaben erhält. Wenn eine Sammlung von Objekten über die Pipeline geleitet wird, wird die Methode für jedes Objekt in der Sammlung aufgerufen. Die Klasse, die das Cmdlet implementiert, muss über ein .NET-Attribut - CmdletAttribute - verfügen, das das Verb und das Substantiv angibt, aus denen der Name des Cmdlets besteht. Übliche Verben werden als Enum bereitgestellt.

Wenn ein Cmdlet entweder eine Pipelineeingabe oder eine Befehlszeilenparametereingabe erhält, muss in der Klasse eine entsprechende Eigenschaft mit einer Mutatorimplementierung vorhanden sein. PowerShell ruft den Mutator mit dem Parameterwert oder der Pipelineeingabe auf, die von der Mutatorimplementierung in Klassenvariablen gespeichert wird. Auf diese Werte wird dann von den Methoden verwiesen, die die Funktionalität implementieren. Eigenschaften, die Befehlszeilenparametern zugeordnet sind, sind durch ParameterAttribute gekennzeichnet und werden vor dem Aufruf von BeginProcessing() festgelegt. Eigenschaften, die Pipeline-Eingaben abbilden, sind ebenfalls mit ParameterAttribute gekennzeichnet, wobei jedoch der Parameter ValueFromPipeline-Attribut gesetzt ist.

Die Implementierung dieser Cmdlet-Klassen kann sich auf eine beliebige .NET-API beziehen und kann in einer beliebigen .NET-Sprache erfolgen. Darüber hinaus stellt PowerShell bestimmte APIs zur Verfügung, z. B. WriteObject(), das für den Zugriff auf PowerShell-spezifische Funktionen verwendet wird, z. B. das Schreiben von Ergebnisobjekten in die Pipeline. Cmdlets können .NET-Datenzugriffs-APIs direkt verwenden oder die PowerShell-Infrastruktur von PowerShell-Providern nutzen, die Datenspeicher über eindeutige Pfade adressierbar machen. Datenspeicher werden über Laufwerksbuchstaben und Hierarchien in ihnen, die als Verzeichnisse angesprochen werden, dargestellt. Windows PowerShell wird mit Providern für das Dateisystem, die Registrierung, den Zertifikatspeicher sowie die Namespaces für Befehlsaliase, Variablen und Funktionen geliefert. Windows PowerShell enthält auch verschiedene Cmdlets zur Verwaltung verschiedener Windows-Systeme, einschließlich des Dateisystems, oder zur Verwendung der Windows-Verwaltungsinstrumentation zur Steuerung von Windows-Komponenten. Andere Anwendungen können Cmdlets bei der PowerShell registrieren, damit diese sie verwalten kann, und wenn sie einen Datenspeicher (z. B. eine Datenbank) enthalten, können sie auch spezifische Anbieter hinzufügen.

Die Anzahl der Cmdlets, die in der PowerShell-Basisinstallation enthalten sind, ist im Allgemeinen mit jeder Version gestiegen:

Version Cmdlets
Windows PowerShell 1.0 129
Windows PowerShell 2.0 632
Windows PowerShell 3.0 etwa 1.000
Windows PowerShell 4.0 ?
Windows PowerShell 5.0 ca. 1.300
Windows PowerShell 5.1 1586
PowerShell-Kern 6.0 ?
PowerShell-Kern 6.1 ?
PowerShell-Kern 6.2 ?
PowerShell 7.0 1507
PowerShell 7.1 ?
PowerShell 7.2 ?

Cmdlets können der Shell über Snap-Ins (in v2 veraltet) und Module hinzugefügt werden; Benutzer sind nicht auf die Cmdlets beschränkt, die in der PowerShell-Basisinstallation enthalten sind.

Pipeline

PowerShell implementiert das Konzept einer Pipeline, die es ermöglicht, die Ausgabe eines Cmdlets an ein anderes Cmdlet als Eingabe weiterzuleiten. Beispielsweise könnte die Ausgabe des Cmdlets "Get-Process" über die Pipeline an das Cmdlet "Where-Object" weitergeleitet werden, um alle Prozesse zu filtern, die über weniger als 1 MB ausgelagerten Speicher verfügen, und dann an das Cmdlet "Sort-Object" (z. B. zum Sortieren der Objekte nach Handle-Anzahl) und schließlich an das Cmdlet "Select-Object", um nur die ersten zehn Prozesse auf der Grundlage der Handle-Anzahl auszuwählen.

Wie bei Unix-Pipelines können PowerShell-Pipelines komplexe Befehle erstellen, wobei der Operator | zum Verbinden von Stufen verwendet wird. Die PowerShell-Pipeline unterscheidet sich jedoch von Unix-Pipelines dadurch, dass die Stufen innerhalb der PowerShell-Laufzeit ausgeführt werden und nicht als eine Reihe von Prozessen, die vom Betriebssystem koordiniert werden. Außerdem werden strukturierte .NET-Objekte anstelle von Byteströmen von einer Stufe zur nächsten übergeben. Durch die Verwendung von Objekten und das Ausführen von Stufen innerhalb der PowerShell-Laufzeit entfällt die Notwendigkeit, Datenstrukturen zu serialisieren oder sie durch explizites Parsen von Textausgaben zu extrahieren. Ein Objekt kann auch bestimmte Funktionen kapseln, die mit den enthaltenen Daten arbeiten, die dem Empfängerbefehl zur Verwendung zur Verfügung stehen. Für das letzte Cmdlet in einer Pipeline leitet PowerShell sein Ausgabeobjekt automatisch über die Pipeline an das Cmdlet "Out-Default" weiter, das die Objekte in einen Strom von Formatobjekten umwandelt und diese dann auf dem Bildschirm wiedergibt.

Da es sich bei allen PowerShell-Objekten um .NET-Objekte handelt, haben sie eine gemeinsame .ToString()-Methode, mit der die Textdarstellung der Daten in einem Objekt abgerufen wird. Darüber hinaus ermöglicht PowerShell die Angabe von Formatierungsdefinitionen, sodass die Textdarstellung von Objekten angepasst werden kann, indem ausgewählt wird, welche Datenelemente auf welche Weise angezeigt werden sollen. Um jedoch die Abwärtskompatibilität zu wahren, erhält eine externe ausführbare Datei, die in einer Pipeline verwendet wird, einen Textstrom, der das Objekt repräsentiert, anstatt direkt in das PowerShell-Typsystem integriert zu werden.

Skripterstellung

Windows PowerShell enthält eine dynamisch typisierte Skriptsprache, mit der komplexe Operationen mithilfe von Cmdlets zwingend implementiert werden können. Die Skriptsprache unterstützt Variablen, Funktionen, Verzweigungen (if-then-else), Schleifen (while, do, for und foreach), strukturierte Fehler-/Ausnahmebehandlung und Abschlüsse/Lambda-Ausdrücke sowie die Integration mit .NET. Variablen in PowerShell-Skripten wird ein $ vorangestellt. Variablen können beliebige Werte zugewiesen werden, einschließlich der Ausgabe von Cmdlets. Zeichenketten können entweder in einfache Anführungszeichen oder in doppelte Anführungszeichen eingeschlossen werden: Bei Verwendung von doppelten Anführungszeichen werden Variablen auch dann erweitert, wenn sie sich innerhalb der Anführungszeichen befinden. Wird der Pfad zu einer Datei in geschweifte Klammern mit vorangestelltem Dollarzeichen eingeschlossen (wie in ${C:\foo.txt}), wird ein Verweis auf den Inhalt der Datei erstellt. Wenn er als L-Wert verwendet wird, wird alles, was ihm zugewiesen wird, in die Datei geschrieben. Wird er als R-Wert verwendet, wird der Inhalt der Datei gelesen. Wenn ein Objekt zugewiesen wird, wird es vor dem Speichern serialisiert.

Auf Objektmitglieder kann mit der Notation . zugegriffen werden, wie in der C#-Syntax. PowerShell stellt spezielle Variablen zur Verfügung, z. B. $args, bei dem es sich um ein Array aller Befehlszeilenargumente handelt, die von der Befehlszeile an eine Funktion übergeben werden, und $_, das sich auf das aktuelle Objekt in der Pipeline bezieht. PowerShell bietet auch Arrays und assoziative Arrays. Die PowerShell-Skriptsprache wertet auch arithmetische Ausdrücke, die in die Befehlszeile eingegeben werden, sofort aus, und sie analysiert gängige Abkürzungen wie GB, MB und KB.

Mit dem Funktionsschlüsselwort ermöglicht PowerShell die Erstellung von Funktionen. Eine einfache Funktion hat das folgende allgemeine Aussehen:

function name ([Typ]$Param1, [Typ]$Param2)
{
  # Anweisungen
} <span title="Aus: Englische Wikipedia, Abschnitt &quot;Scripting&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/PowerShell#Scripting <span style="color:#dddddd">ⓘ</span>]</span>

PowerShell ermöglicht jedoch auch erweiterte Funktionen, die benannte Parameter, Positionsparameter, Schalterparameter und dynamische Parameter unterstützen.

function Verb-Nomen
{
  param (
    # Definition der statischen Parameter
  )
  dynamicparam {
    # Definition der dynamischen Parameter
  }
  begin {
    # Satz von Anweisungen, die am Anfang der Pipeline ausgeführt werden
  }
  process {
    # Hauptbefehlssätze, die für jedes Element in der Pipeline ausgeführt werden
  }
  end {
    # Satz von Befehlen, die am Ende der Pipeline ausgeführt werden
  }
} <span title="Aus: Englische Wikipedia, Abschnitt &quot;Scripting&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/PowerShell#Scripting <span style="color:#dddddd">ⓘ</span>]</span>

Die definierte Funktion wird in einer der folgenden Formen aufgerufen:

name wert1 wert2
Verb-Nomen -Param1 wert1 -Param2 wert2 <span title="Aus: Englische Wikipedia, Abschnitt &quot;Scripting&quot;" class="plainlinks">[https://en.wikipedia.org/wiki/PowerShell#Scripting <span style="color:#dddddd">ⓘ</span>]</span>

PowerShell ermöglicht den Aufruf beliebiger statischer .NET-Methoden durch Angabe ihrer in Klammern ([]) eingeschlossenen Namespaces und die Verwendung eines Paars von Doppelpunkten (::) zur Angabe der statischen Methode. Ein Beispiel:

[Konsole]::WriteLine("PowerShell")

Es gibt Dutzende von Möglichkeiten, Objekte in PowerShell zu erstellen. Nach der Erstellung kann man auf die Eigenschaften und Instanzmethoden eines Objekts mit der Notation . zugreifen.

PowerShell akzeptiert Zeichenketten, sowohl rohe als auch escapete. Eine in einfache Anführungszeichen eingeschlossene Zeichenkette ist eine unbearbeitete Zeichenkette, während eine in doppelte Anführungszeichen eingeschlossene Zeichenkette eine escapete Zeichenkette ist. PowerShell behandelt gerade und geschweifte Anführungszeichen als gleichwertig.

Die folgende Liste von Sonderzeichen wird von PowerShell unterstützt:

PowerShell-Sonderzeichen
Sequenz Bedeutung
`0 Null
`a Warnung
`b Rücktaste
`e Escape
`f Formularvorschub
`n Zeilenumbruch
`r Wagenrücklauf
`t Horizontaler Tabulator
u{x} Unicode-Escape-Sequenz
`v Vertikaler Tabulator
--% Jedes Zeichen von diesem Punkt an wörtlich behandeln

Für die Fehlerbehandlung bietet PowerShell einen .NET-basierten Mechanismus für die Ausnahmebehandlung. Im Falle von Fehlern werden Objekte mit Informationen über den Fehler (Exception-Objekt) geworfen, die mit dem try ... catch-Konstrukt abgefangen werden (obwohl auch ein Trap-Konstrukt unterstützt wird). PowerShell kann so konfiguriert werden, dass die Ausführung stillschweigend fortgesetzt wird, ohne dass die Ausnahme tatsächlich ausgelöst wird; dies kann entweder für einen einzelnen Befehl, eine einzelne Sitzung oder dauerhaft geschehen.

Mit PowerShell geschriebene Skripte können in einer .ps1-Datei oder einer .psm1-Datei (letztere wird zur Implementierung eines Moduls verwendet) sitzungsübergreifend aufbewahrt werden. Später können dann entweder das gesamte Skript oder einzelne Funktionen des Skripts verwendet werden. Skripte und Funktionen funktionieren analog zu Cmdlets, d. h. sie können als Befehle in Pipelines verwendet werden und es können Parameter an sie gebunden werden. Pipelineobjekte können nahtlos zwischen Funktionen, Skripts und Cmdlets übergeben werden. Um die unbeabsichtigte Ausführung von Skripts zu verhindern, ist die Skriptausführung standardmäßig deaktiviert und muss explizit aktiviert werden. Das Aktivieren von Skripten kann entweder auf System-, Benutzer- oder Sitzungsebene erfolgen. PowerShell-Skripte können signiert werden, um ihre Integrität zu verifizieren, und unterliegen der Code Access Security.

Die PowerShell-Skriptsprache unterstützt die binäre Präfix-Notation, ähnlich der wissenschaftlichen Notation, die von vielen Programmiersprachen der C-Familie unterstützt wird.

Gib die Zeichenfolge "Hallo Welt!" auf der Konsole aus:

  Write-Host "Hallo Welt!"

Write-Host erzwingt dabei die Ausgabe auf der Konsole. Die Ausgabe wird nicht an die Pipeline weitergegeben und kann nicht weiterverarbeitet werden. Write-Output würde die Ausgabe sowohl an die Konsole, als auch die Pipeline weitergeben.

Hole alle Prozesse, deren Namen mit dem Buchstaben „p“ beginnen:

  Get-Process p* <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Hole alle Prozesse, die mehr als 10 MB Hauptspeicher verwenden:

  Get-Process | where { $_.WS -gt 10MB }

where ist ein Alias für Where-Object und filtert das ausgegebene Objekt von Get-Process auf alle Elemente die als Eigenschaft WS ($_.WS) einen Wert größer 10 MB haben. PowerShell kennt die Maßeinheit Byte und rechnet 10 MB in 10485760 um.

Berechne die Gesamtanzahl der Bytes aller Dateien in einem Verzeichnis:

  Get-ChildItem | Measure-Object -Property Length -Sum <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Warte, bis ein bestimmter Prozess beendet wurde:

  $processToWatch = Get-Process notepad
  $processToWatch.WaitForExit() <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Füge die Zeichenfolge „ABC“ nach dem ersten Buchstaben des Wortes „string“ ein, um als Ergebnis „sABCtring“ zu erhalten:

  "string".Insert(1, "ABC") <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Lade einen bestimmten RSS-Web-Feed herunter und zeige die Überschriften der acht neuesten Einträge:

  $rssUrl = "https://devblogs.microsoft.com/powershell/feed/"
  $blog = [xml] (New-Object System.Net.WebClient).DownloadString($rssUrl)
  $blog.rss.channel.item | select title -First 8 <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Lösche die komplette Festplatte ohne Rückfrage, Äquivalent zu rm -rf / unter Unix:

  Get-PSDrive -p "FileSystem" | % { ls -Recurse $_.Root | rm –Force } <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Beispiele&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Beispiele <span style="color:#dddddd">ⓘ</span>]</span>

Hosten

PowerShell kann auch eingebettet in eine Verwaltungsanwendung verwendet werden, die die PowerShell-Laufzeit zur Implementierung der Verwaltungsfunktionalität nutzt. Hierfür bietet PowerShell eine verwaltete Hosting-API. Über die APIs kann die Anwendung einen Runspace (eine Instanziierung der PowerShell-Laufzeit) instanziieren, der im Prozess der Anwendung ausgeführt und als Runspace-Objekt dargestellt wird. Der Zustand des Runspace ist in einem SessionState-Objekt eingeschlossen. Wenn der Runspace erstellt wird, initialisiert die Windows PowerShell-Laufzeit die Instanziierung, einschließlich der Initialisierung der Anbieter und der Aufzählung der Cmdlets, und aktualisiert das SessionState-Objekt entsprechend. Der Runspace muss dann entweder für die synchrone Verarbeitung oder die asynchrone Verarbeitung geöffnet werden. Danach kann er zur Ausführung von Befehlen verwendet werden.

Um einen Befehl auszuführen, muss eine Pipeline (dargestellt durch ein Pipeline-Objekt) erstellt und mit dem Runspace verknüpft werden. Das Pipeline-Objekt wird dann mit den Cmdlets aufgefüllt, aus denen die Pipeline besteht. Bei sequenziellen Vorgängen (wie in einem PowerShell-Skript) wird für jede Anweisung ein Pipeline-Objekt erstellt und in einem anderen Pipeline-Objekt verschachtelt. Wenn eine Pipeline erstellt wird, ruft Windows PowerShell den Pipelineprozessor auf, der die Cmdlets in ihre jeweiligen Assemblies (den Befehlsprozessor) auflöst und der Pipeline einen Verweis auf sie hinzufügt und sie mit InputPipe-, OutputPipe- und ErrorOutputPipe-Objekten verknüpft, um die Verbindung mit der Pipeline darzustellen. Die Typen werden verifiziert und die Parameter mittels Reflexion gebunden. Sobald die Pipeline eingerichtet ist, ruft der Host die Methode Invoke() auf, um die Befehle auszuführen, oder deren asynchrone Entsprechung InvokeAsync(). Wenn die Pipeline das Cmdlet "Write-Host" am Ende der Pipeline enthält, wird das Ergebnis auf den Konsolenbildschirm geschrieben. Ist dies nicht der Fall, werden die Ergebnisse an den Host übergeben, der entweder eine weitere Verarbeitung vornimmt oder die Ausgabe selbst anzeigt.

Microsoft Exchange Server 2007 verwendet die Hosting-APIs, um seine Verwaltungs-GUI bereitzustellen. Jeder in der grafischen Benutzeroberfläche angezeigte Vorgang wird einer Abfolge von PowerShell-Befehlen (oder Pipelines) zugewiesen. Der Host erstellt die Pipeline und führt sie aus. Die interaktive PowerShell-Konsole selbst ist ein PowerShell-Host, der die in der Befehlszeile eingegebenen Skripts interpretiert, die erforderlichen Pipeline-Objekte erstellt und sie aufruft.

Gewünschte Zustandskonfiguration

Mit DSC lässt sich deklarativ festlegen, wie eine Softwareumgebung konfiguriert werden soll.

Wenn eine Konfiguration ausgeführt wird, sorgt DSC dafür, dass das System den in der Konfiguration beschriebenen Zustand erhält. DSC-Konfigurationen sind idempotent. Der Local Configuration Manager (LCM) fragt das System regelmäßig unter Verwendung des von den Ressourcen beschriebenen Kontrollflusses (zwingende Teile der DSC) ab, um sicherzustellen, dass der Zustand einer Konfiguration beibehalten wird.

Versionen

PowerShell wurde zunächst unter dem Codenamen "Monad" auf der Professional Developers Conference im Oktober 2003 in Los Angeles erstmals öffentlich vorgestellt. Alle Hauptversionen werden nach wie vor unterstützt, und jede Hauptversion ist mit den Vorgängerversionen abwärtskompatibel.

Windows PowerShell 1.0

Die erste Version von PowerShell erscheint 2006 als ein Grundgerüst mit den wichtigsten Funktionen der PowerShell. Insbesondere der Kommandozeileninterpreter ist sehr mächtig, so gibt es bereits die objektbasierte Pipe, eine eigene Skriptsprache und ein Sicherheitsmodell. PowerShell kann sogenannte Namensräume wie das Dateisystem, den Zertifikatsspeicher oder die Registry ansprechen. Cmdlets können ausschließlich in .NET geschrieben werden, Skripte können auf entfernten Computern nur per WMI ausgeführt werden, die verfügbare Konsole ist sehr einfach gehalten.

Windows PowerShell 1.0-Sitzung unter Verwendung der Windows-Konsole

PowerShell 1.0 wurde im November 2006 für Windows XP SP2, Windows Server 2003 SP1 und Windows Vista veröffentlicht. Sie ist eine optionale Komponente von Windows Server 2008.

Windows PowerShell 2.0

Windows PowerShell ISE v2.0 unter Windows 7, eine integrierte Entwicklungsumgebung für PowerShell-Skripts.

PowerShell 2.0 ist in Windows 7 und Windows Server 2008 R2 integriert und wird für Windows XP mit Service Pack 3, Windows Server 2003 mit Service Pack 2 und Windows Vista mit Service Pack 1 veröffentlicht.

PowerShell v2 enthält Änderungen an der Skriptsprache und der Hosting-API sowie mehr als 240 neue Cmdlets.

Zu den neuen Funktionen von PowerShell 2.0 gehören:

  • PowerShell-Remoting: Mithilfe der WS-Verwaltung ermöglicht PowerShell 2.0 das Aufrufen von Skripts und Cmdlets auf einem Remotecomputer oder einer großen Anzahl von Remotecomputern.
  • Hintergrundaufträge: Auch PSJob genannt, ermöglicht es, eine Befehlssequenz (Skript) oder Pipeline asynchron aufzurufen. Aufträge können auf dem lokalen Rechner oder auf mehreren Remote-Rechnern ausgeführt werden. Ein interaktives Cmdlet in einem PSJob blockiert die Ausführung des Auftrags, bis eine Benutzereingabe erfolgt.
  • Transaktionen: Aktivieren Sie Cmdlets und Entwickler können Transaktionsvorgänge durchführen. PowerShell 2.0 enthält Transaktions-Cmdlets zum Starten, Übertragen und Zurücksetzen einer PSTransaktion sowie Funktionen zum Verwalten und Leiten der Transaktion an die beteiligten Cmdlets und Provider-Vorgänge. Der PowerShell-Registrierungsanbieter unterstützt Transaktionen.
  • Erweiterte Funktionen: Dies sind Cmdlets, die mit der PowerShell-Skriptsprache geschrieben wurden. Ursprünglich als "Skript-Cmdlets" bezeichnet, wurde diese Funktion später in "erweiterte Funktionen" umbenannt.
  • SteppablePipelines: Damit kann der Benutzer steuern, wann die Funktionen BeginProcessing(), ProcessRecord() und EndProcessing() eines Cmdlets aufgerufen werden.
  • Module: Damit können Skriptentwickler und Administratoren PowerShell-Skripte in in sich geschlossene, wiederverwendbare Einheiten organisieren und partitionieren. Der Code eines Moduls wird in seinem eigenen, in sich geschlossenen Kontext ausgeführt und wirkt sich nicht auf den Zustand außerhalb des Moduls aus. Module können mithilfe eines Skripts eine eingeschränkte Runspace-Umgebung definieren. Sie haben einen dauerhaften Status sowie öffentliche und private Mitglieder.
  • Datensprache: Eine domänenspezifische Untermenge der PowerShell-Skriptsprache, die es ermöglicht, Datendefinitionen von den Skripts zu entkoppeln und lokalisierte Zeichenfolgenressourcen zur Laufzeit in das Skript zu importieren (Skriptinternationalisierung).
  • Skript-Debugging: Es ermöglicht das Setzen von Haltepunkten in einem PowerShell-Skript oder einer Funktion. Haltepunkte können auf Zeilen, Zeilen und Spalten, Befehle und Lese- oder Schreibzugriffe auf Variablen gesetzt werden. Es enthält eine Reihe von Cmdlets zur Steuerung der Haltepunkte über ein Skript.
  • Ereignissteuerung: Diese Funktion ermöglicht das Abhören, Weiterleiten und Handeln auf Management- und Systemereignisse. Mit Eventing können PowerShell-Hosts über Zustandsänderungen an ihren verwalteten Entitäten benachrichtigt werden. Außerdem können PowerShell-Skripte ObjectEvents, PSEvents und WmiEvents abonnieren und sie synchron oder asynchron verarbeiten.
  • Integrierte Windows PowerShell-Skriptumgebung (ISE): PowerShell 2.0 enthält einen GUI-basierten PowerShell-Host, der einen integrierten Debugger, Syntaxhervorhebung, Tabulatorvervollständigung und bis zu 8 PowerShell-Unicode-fähige Konsolen (Runspaces) in einer Benutzeroberfläche mit Registerkarten sowie die Möglichkeit bietet, nur die ausgewählten Teile eines Skripts auszuführen.
  • Netzwerk-Dateiübertragung: Native Unterstützung für die priorisierte, gedrosselte und asynchrone Übertragung von Dateien zwischen Computern mithilfe des Background Intelligent Transfer Service (BITS).
  • Neue Cmdlets: Einschließlich Out-GridView, das tabellarische Daten im WPF GridView-Objekt anzeigt, auf Systemen, die dies zulassen, und wenn ISE installiert und aktiviert ist.
  • Neue Operatoren: -Split-, -Join- und Splatting (@)-Operatoren.
  • Ausnahmebehandlung mit Try-Catch-Finally: Im Gegensatz zu anderen .NET-Sprachen sind hier mehrere Ausnahmetypen für einen einzigen Catch-Block möglich.
  • Verschachtelbare Here-Strings: PowerShell Here-Strings wurden verbessert und können nun verschachtelt werden.
  • Block-Kommentare: PowerShell 2.0 unterstützt Blockkommentare unter Verwendung von <# und #> als Begrenzer.
  • Neue APIs: Die neuen APIs reichen von der Übergabe von mehr Kontrolle über den PowerShell-Parser und die Laufzeit an den Host über das Erstellen und Verwalten von Runspaces (RunspacePools) bis hin zur Möglichkeit, eingeschränkte Runspaces zu erstellen, die nur den Aufruf einer konfigurierten Teilmenge der PowerShell erlauben. Die neuen APIs unterstützen auch die Teilnahme an einer von PowerShell verwalteten Transaktion

Windows PowerShell 3.0

PowerShell 3.0 ist in Windows 8 und in Windows Server 2012 integriert. Microsoft hat PowerShell 3.0 auch für Windows 7 mit Service Pack 1, für Windows Server 2008 mit Service Pack 1 und für Windows Server 2008 R2 mit Service Pack 1 verfügbar gemacht.

PowerShell 3.0 ist Teil eines größeren Pakets, Windows Management Framework 3.0 (WMF3), das auch den WinRM-Dienst zur Unterstützung von Remoting enthält. Microsoft hat mehrere Community Technology Preview-Versionen von WMF3 veröffentlicht. Eine frühe Community Technology Preview 2 (CTP 2) Version von Windows Management Framework 3.0 wurde am 2. Dezember 2011 veröffentlicht. Windows Management Framework 3.0 wurde im Dezember 2012 zur allgemeinen Verfügbarkeit freigegeben und ist standardmäßig in Windows 8 und Windows Server 2012 enthalten.

Zu den neuen Funktionen in PowerShell 3.0 gehören:

  • Geplante Aufträge: Aufträge können so geplant werden, dass sie zu einer voreingestellten Zeit und an einem voreingestellten Datum mithilfe der Windows Task Scheduler-Infrastruktur ausgeführt werden.
  • Sitzungskonnektivität: Sitzungen können getrennt und wieder verbunden werden. Remote-Sitzungen sind nun toleranter gegenüber vorübergehenden Netzwerkausfällen.
  • Verbessertes Schreiben von Code: Code-Vervollständigung (IntelliSense) und Snippets wurden hinzugefügt. PowerShell ISE ermöglicht Benutzern die Verwendung von Dialogfeldern zum Ausfüllen von Parametern für PowerShell-Cmdlets.
  • Unterstützung der Delegation: Administrative Aufgaben können an Benutzer delegiert werden, die keine Berechtigungen für diese Art von Aufgaben haben, ohne ihnen dauerhaft zusätzliche Berechtigungen zu gewähren.
  • Hilfeaktualisierung: Hilfedokumentationen können über den Befehl Update-Help aktualisiert werden.
  • Automatische Modul-Erkennung: Module werden implizit geladen, wenn ein Befehl aus diesem Modul aufgerufen wird. Die Code-Vervollständigung funktioniert auch für nicht geladene Module.
  • Neue Befehle: Dutzende von neuen Modulen wurden hinzugefügt, darunter Funktionen zur Verwaltung von Festplatten get-WmiObject win32_logicaldisk, Volumes, Firewalls, Netzwerkverbindungen und Druckern, die zuvor über WMI ausgeführt wurden.

2012 wird die PowerShell in der Version 3.0 ausgereifter und benutzerfreundlicher. Workflows auf Basis der Windows Workflow Foundation werden eingeführt, womit es mit geringen Mitteln möglich ist, Aufgaben parallel erledigen zu lassen. Erstmals wird CIM und JSON unterstützt. Im System verfügbare Module werden automatisch geladen und stehen dem Administrator somit sofort zur Verfügung.

Windows PowerShell 4.0

PowerShell 4.0 ist in Windows 8.1 und in Windows Server 2012 R2 integriert. Microsoft hat PowerShell 4.0 auch für Windows 7 SP1, Windows Server 2008 R2 SP1 und Windows Server 2012 verfügbar gemacht.

Zu den neuen Funktionen in PowerShell 4.0 gehören:

  • Desired State Configuration: Deklarative Spracherweiterungen und Tools, die die Bereitstellung und Verwaltung von Konfigurationsdaten für Systeme ermöglichen, die die DMTF-Verwaltungsstandards und das WS-Management-Protokoll verwenden
  • Neue Standardausführungsrichtlinie: Auf Windows-Servern lautet die Standardausführungsrichtlinie jetzt RemoteSigned.
  • Hilfe speichern: Die Hilfe kann jetzt für Module gespeichert werden, die auf entfernten Computern installiert sind.
  • Verbessertes Debugging: Der Debugger unterstützt jetzt das Debuggen von Workflows, die Remote-Skriptausführung und das Beibehalten von Debugging-Sitzungen bei erneuten PowerShell-Sitzungsverbindungen.
  • -PipelineVariable-Schalter: Ein neuer allgegenwärtiger Parameter, mit dem das aktuelle Pipeline-Objekt zu Programmierzwecken als Variable dargestellt werden kann
  • Netzwerkdiagnose zur Verwaltung von physischen und virtualisierten Hyper-V-Netzwerk-Switches
  • Die Where- und ForEach-Methodensyntax bietet eine alternative Methode zum Filtern und Iterieren über Objekte.

Windows PowerShell 5.0

PowerShell 5.0-Symbol

Windows Management Framework (WMF) 5.0 RTM, das PowerShell 5.0 enthält, wurde am 24. Februar 2016 erneut im Web veröffentlicht, nachdem die erste Version einen schwerwiegenden Fehler aufwies.

Zu den wichtigsten Funktionen gehören:

  • Das neue class-Schlüsselwort, das Klassen für die objektorientierte Programmierung erstellt
  • Das neue enum-Schlüsselwort zum Erstellen von Enums
  • OneGet-Cmdlets zur Unterstützung des Chocolatey-Paketmanagers
  • Ausweitung der Unterstützung für die Switch-Verwaltung auf Layer-2-Netzwerk-Switches.
  • Debugging für PowerShell-Hintergrundaufträge und Instanzen von PowerShell, die in anderen Prozessen gehostet werden (jeder dieser Prozesse wird als "Runspace" bezeichnet)
  • Desired State Configuration (DSC) Local Configuration Manager (LCM) Version 2.0
  • DSC-Teilkonfigurationen
  • DSC Local Configuration Manager-Metakonfigurationen
  • Erstellung von DSC-Ressourcen mithilfe von PowerShell-Klassen

Windows PowerShell 5.1

Es wurde zusammen mit dem Windows 10 Anniversary Update am 2. August 2016 und in Windows Server 2016 veröffentlicht. PackageManagement unterstützt jetzt Proxys, PSReadLine hat jetzt ViMode-Unterstützung, und zwei neue Cmdlets wurden hinzugefügt: Get-TimeZone und Set-TimeZone. Das LocalAccounts-Modul ermöglicht das Hinzufügen/Entfernen von lokalen Benutzerkonten. Eine Vorschau für PowerShell 5.1 wurde am 16. Juli 2016 für Windows 7, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 und Windows Server 2012 R2 veröffentlicht und wurde am 19. Januar 2017 freigegeben.

PowerShell 5.1 ist die erste Version, die es in zwei Editionen gibt: "Desktop" und "Core". Die "Desktop"-Edition ist die Fortsetzung der traditionellen Windows PowerShell, die auf dem .NET Framework-Stack läuft. Die "Core"-Edition läuft auf .NET Core und ist mit Windows Server 2016 Nano Server gebündelt. Im Austausch für den geringeren Platzbedarf fehlen einige Funktionen wie die Cmdlets zur Verwaltung der Zwischenablage oder zum Beitritt eines Computers zu einer Domäne, WMI Version 1 Cmdlets, Event Log Cmdlets und Profile. Dies war die letzte Version der PowerShell, die ausschließlich für Windows entwickelt wurde.

PowerShell Core 6

PowerShell Core 6.0 wurde erstmals am 18. August 2016 angekündigt, als Microsoft PowerShell Core und seine Entscheidung, das Produkt plattformübergreifend, unabhängig von Windows, frei und quelloffen zu machen, vorstellte. Es wurde am 10. Januar 2018 für Windows, macOS und Linux allgemein verfügbar. Es hat einen eigenen Support-Lebenszyklus und hält sich an die mit Windows 10 eingeführte Microsoft-Lifecycle-Politik: Nur die neueste Version von PowerShell Core wird unterstützt. Microsoft plant, alle sechs Monate eine kleinere Version von PowerShell Core 6.0 zu veröffentlichen.

Die wichtigste Änderung in dieser Version von PowerShell ist die Ausweitung auf andere Plattformen. Für Windows-Administratoren enthält diese Version der PowerShell keine wesentlichen neuen Funktionen. In einem Interview mit der Community am 11. Januar 2018 wurde das PowerShell-Team gebeten, die 10 aufregendsten Dinge aufzulisten, die für einen Windows-IT-Profi, der von Windows PowerShell 5.1 auf PowerShell Core 6.0 migriert, passieren würden; als Antwort konnte Angel Calvo von Microsoft nur zwei nennen: plattformübergreifend und Open-Source.

Laut Microsoft ist eine der neuen Funktionen von PowerShell 6.1 die "Kompatibilität mit über 1900 bestehenden Cmdlets in Windows 10 und Windows Server 2019." In der Vollversion des Änderungsprotokolls sind jedoch keine Details zu diesen Cmdlets zu finden. Microsoft erklärt später, dass diese Zahl unzureichend war, da PowerShell Core es nicht geschafft hat, Windows PowerShell 5.1 zu ersetzen und auf Windows an Boden zu gewinnen. Es war jedoch unter Linux sehr beliebt.

PowerShell Core 6.2 konzentriert sich in erster Linie auf Leistungsverbesserungen, Fehlerbehebungen und kleinere Cmdlet- und Sprachverbesserungen, die die Produktivität der Entwickler verbessern.

PowerShell 7

PowerShell 7 ist der Ersatz für die PowerShell Core 6.x-Produkte sowie für Windows PowerShell 5.1, die letzte unterstützte Windows PowerShell-Version. Der Schwerpunkt bei der Entwicklung lag darauf, PowerShell 7 zu einem brauchbaren Ersatz für Windows PowerShell 5.1 zu machen, d. h. eine annähernde Parität mit Windows PowerShell in Bezug auf die Kompatibilität mit Modulen, die mit Windows ausgeliefert werden.

Zu den neuen Funktionen in PowerShell 7 gehören:

  • Der -Parallel-Schalter für das Cmdlet "ForEach-Object" zur Unterstützung der parallelen Verarbeitung
  • Nahezu Parität mit Windows PowerShell in Bezug auf die Kompatibilität mit integrierten Windows-Modulen
  • Eine neue Fehleransicht
  • Das Cmdlet "Get-Error
  • Pipelineverkettungsoperatoren (&& und ||), die die bedingte Ausführung des nächsten Cmdlets in der Pipeline ermöglichen
  • Der Operator ?: für ternäre Operationen
  • Der Operator ??=, der einer Variablen nur dann einen Wert zuweist, wenn der vorhandene Wert der Variablen null ist
  • Der Operator ?? für die Null-Koaleszenz
  • Plattformübergreifende Invoke-DscResource (experimentell)
  • Rückgabe des Cmdlets Out-GridView
  • Rückgabe des Schalters -ShowWindow für Get-Help

PowerShell 7.2

PowerShell 7.2 ist die nächste Version von PowerShell mit Langzeitunterstützung nach Version 7.0. Sie verwendet .NET 6.0 und bietet universelle Installer-Pakete für Linux. Unter Windows werden Updates für PowerShell 7.2 und höher über den Microsoft Update-Dienst bereitgestellt; diese Funktion fehlte in PowerShell 6.0 bis 7.1.

Vergleich von Cmdlets mit ähnlichen Befehlen

Die folgende Tabelle enthält eine Auswahl der Cmdlets, die mit PowerShell geliefert werden, und verweist auf ähnliche Befehle in anderen bekannten Befehlszeileninterpretern. Viele dieser ähnlichen Befehle sind in PowerShell sofort als Aliase definiert, sodass Benutzer, die mit anderen gängigen Shells vertraut sind, leicht mit der Arbeit beginnen können.

Vergleich von PowerShell-Cmdlets mit internen und externen Befehlen anderer Befehlszeileninterpreter
PowerShell (Cmdlet) PowerShell (Alias) Windows-Eingabeaufforderung Unix-Shell Beschreibung
Get-ChildItem gci, dir, ls dir ls Listet alle Dateien und Ordner im aktuellen oder angegebenen Ordner auf
Test-Verbindung ping ping ping Sendet ICMP-Echo-Anfragen an den angegebenen Rechner vom aktuellen Rechner aus oder weist einen anderen Rechner an, dies zu tun
Inhalt abrufen gc, typ, cat Typ cat Ruft den Inhalt einer Datei ab
Get-Befehl gcm Hilfe, wo typ, welcher, compgen Listet die verfügbaren Befehle auf und ermittelt den Befehlspfad
Get-Help Hilfe, man Hilfe apropos, man Druckt die Dokumentation zu einem Befehl auf der Konsole aus
Clear-Host cls, löschen cls löschen Löscht den Bildschirm
Artikel kopieren cpi, copy, cp kopieren, xcopy, robocopy cp Kopiert Dateien und Verzeichnisse an einen anderen Ort
Verschieben-Element mi, verschieben, mv verschieben mv Verschiebt Dateien und Verzeichnisse an einen neuen Ort
Entfernen-Element ri, del, löschen, rmdir, rd, rm del, löschen, rmdir, rd rm, rmdir Löscht Dateien oder Verzeichnisse
Umbenennen-Element rni, ren, mv ren, rename mv Benennt eine einzelne Datei, einen Ordner, einen Hardlink oder einen symbolischen Link um
Standort ermitteln gl, cd, pwd cd pwd Zeigt den Arbeitspfad an (aktueller Ordner)
Pop-Verzeichnis popd popd popd Ändert den Arbeitspfad zu dem Ort, der zuletzt auf den Stapel geschoben wurde
Push-Ort pushd pushd pushd Speichert den Arbeitspfad auf dem Stack
Ort setzen sl, cd, chdir cd, chdir cd Ändert den Arbeitspfad
Tee-Objekt tee tee Leitet die Eingabe in eine Datei oder eine Variable, wobei die Eingabe entlang der Pipeline weitergegeben wird
Schreib-Ausgabe echo, schreiben echo echo Gibt Zeichenketten oder andere Objekte auf der Standardausgabe aus
Get-Process gps, ps tlist, tasklist ps Listet alle laufenden Prozesse auf
Prozess anhalten spps, kill kill, taskkill kill Hält einen laufenden Prozess an
Select-Zeichenfolge sls findstr find, grep Druckt Zeilen, die einem Muster entsprechen
Set-Variable sv, setzen setzen env, export, set, setenv Erzeugt oder ändert den Inhalt einer Umgebungsvariablen
Invoke-WebRequest iwr, curl, wget curl wget, curl Ruft Inhalte von einer Webseite im Internet ab

Hinweise

Dateinamen-Erweiterungen

Erweiterung Beschreibung
.ps1 Skript-Datei
.psd1 Manifestdatei des Moduls; wird in der Regel mit einem Skriptmodul oder Binärmodul geliefert
.psm1 Skriptmodul-Datei
.dll DLL-konforme Binärmoduldatei
.ps1xml Format- und Typdefinitionsdatei
.xml XML-konforme serialisierte Datendatei
.psc1 Konsolendatei
.pssc Sitzungskonfigurationsdatei
.psrc Role Capability Datei

Software-Unterstützung

Unterstützt werden unter anderem folgende Systeme:

Software Version Cmdlets Provider Grafische Benutzeroberfläche
Microsoft Exchange Server 2007 ja (402) ja ja
Microsoft Exchange Server 2010 ja ja ja
Microsoft Windows Server 2008 ja ja nein
Microsoft Windows Server 2008 Core nein nein nein
Microsoft Windows Server Microsoft Windows Server 2008 R2 ja nein nein
Microsoft SQL Server 2008 ja ja nein
SharePoint 2010, 2013 ja ja nein
Microsoft System Center Operations Manager 2007 ja (74) ja nein
Microsoft System Center Virtual Machine Manager 2007 ja ja ja
Microsoft System Center Data Protection Manager 2007 ja nein nein
Microsoft Windows Compute Cluster Server 2007 ja ja nein
Microsoft Transporter Suite for Lotus Domino 08.02.0012 ja (47) nein nein
Microsoft PowerTools for Open XML 1.0 ja (33) nein nein
IBM WebSphere MQ 6.0.2.2 ja (44) nein nein
Quest Management Shell for Active Directory 1.1 ja (40) nein nein
Special Operations Software Specops Command 1.0 ja nein ja
VMware Infrastructure Toolkit 1.0 Update 1 ja (125) nein nein
Internet Information Services 7.0 ja (54) ja nein
Microsoft Windows 7 Troubleshooting Center 6.1 ja nein ja
Microsoft Deployment Toolkit 2010 ja nein nein
LOGINventory 5.x ja ja ja
Citrix XenApp seit v5.x ja ja ja
Citrix XenDesktop seit v5.x ja ja ja

Alternative Implementierung

Ein Projekt namens Pash, ein Wortspiel mit der weithin bekannten Unix-Shell "bash", ist eine quelloffene und plattformübergreifende Neuimplementierung von PowerShell über das Mono-Framework. Pash wurde von Igor Moochnick entwickelt, in C# geschrieben und unter der GNU General Public License veröffentlicht. Die Entwicklung von Pash kam 2008 zum Stillstand, wurde 2012 auf GitHub wieder aufgenommen und schließlich 2016 eingestellt, als PowerShell offiziell quelloffen und plattformübergreifend gemacht wurde.

PowerShell Host

Der PowerShell Host ist die Benutzerschnittstelle zur PowerShell Engine. In Windows steht standardmäßig die Windows PowerShell (auch Konsole) (powershell.exe, bereitgestellt durch conhost.exe) und Windows PowerShell ISE (Integrated Scripting Environment, kurz ISE) (powershell_ise.exe) zur Verfügung. Die ISE ist ein modernes Eingabefenster mit unter anderem integriertem Skripteditor, Debugger und IntelliSense. Beide Hosts erlauben es auch, herkömmliche Kommandozeilenanwendungen auszuführen, wie beispielsweise ipconfig.exe. Jedoch erlaubt die ISE keine Interaktion, wie zum Beispiel bei nslookup.exe. Die ISE kann durch Add-ons erweitert werden; eine bekannte Erweiterung ist ISESteroids. Auch Verwaltungskonsolen, wie etwa die Exchange Management Console (EMC) seit Exchange Server 2007, sind ein Host. Darüber hinaus gibt es auf dem Markt weitere Hosts, wie PowerShell Plus von Idera. Zwar nutzen alle Hosts dieselbe Engine, doch da die Implementierung unterschiedlich sein kann, ist es auch möglich, dass sich die Hosts untereinander unterschiedlich verhalten.

PowerShell Provider

PowerShell Provider (auch PSProvider) bieten dem Zugriff auf Daten und Komponenten (Namensräume), die sonst nicht einfach über den Host abrufbar wären, und präsentieren die Daten in einem konsistenten Format als Laufwerke. Das bekannteste Beispiel dafür ist das Dateisystem, welches eine Partition als Laufwerk C darstellt. Es sind jedoch auch weitere Provider möglich, wie etwa Variablen, die Registry, Active Directory und der Zertifikatsspeicher. In allen Laufwerken (zum Beispiel C:, D:, Env:, HKLM: oder Cert:) kann gleichermaßen Navigiert oder Elemente verarbeitet werden (Set-Location, Get-ChildItem, Remove-Item, …).

Liste von Providern

Folgende Liste zeigt einige der Standardprovider in PowerShell.

Name Typ Aufgabe
Alias Container Bindet ein logisches Laufwerk mit dem Namen „Alias:“ ein. Über dieses Laufwerk lassen sich als Schlüssel-Wert Paare definierte Alias (etwa mit Get-ChildItem Alias:) abrufen.
Environment Container Bindet ein logisches Laufwerk mit dem Namen „env:“ ein. Über dieses Laufwerk lassen sich die Umgebungsvariablen abfragen.
FileSystem Navigation Über den FileSystem Provider wird der Zugriff auf das Dateisystem ermöglicht. Über den FileSystem-Provider können Laufwerke, Wechseldatenträger, Netzlaufwerke, u. ä., sowie die darauf befindlichen Dateien und Ordner zugegriffen werden. Laufwerke werden dabei jedoch nicht als logisches Laufwerk in PowerShell integriert, sondern als Referenz im Function-Provider hinterlegt.
Function Container Verwaltet Funktionen, welche mit New-Item erstellt oder in einem PowerShell-Skript deklariert wurden.
Registry Navigation Ermöglicht unter Windows den Zugriff auf die Registrierungsdatenbank. Standardmäßig werden die Laufwerke „HKLM:“ (für HKEY_LOCAL_MACHINE) und „HKLU:“ (für HKEY_LOCAL_USER) erstellt. Weitere Laufwerke lassen sich bei Bedarf mit New-PSDrive (z. B. New-PSDrive -name HKU -psprovider Registry -root HKEY_USERS) anlegen.
Variable Container Verwaltet die im PowerShell-Host erstellten Variablen und deren Werte und bindet diese als logisches Laufwerk „Variable:“ ein.
Certificate Navigation Verwaltet die Sicherheitszertifikate des Systems und bindet sich als logisches Laufwerk „Cert:“ ein. Der Certificate-Provider wird von Get-PSProvider nicht aufgelistet.

Skripte

PowerShell Skripte können in einer Skript-Datei zusammengefasst werden. Skript-Dateien enthalten Funktionen mit zugehöriger Beschreibung in einem Kommentarblock, sowie Variablen und Befehle. Skript-Dateien haben die Endung .ps1 und werden mit dem Befehl ., gefolgt vom vollständigen Namen der Datei geladen und verarbeitet.

Beispiel
<#
.SYNOPSIS
    Hello World Application. <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.DESCRIPTION
    This script is a more complex Hello World function that intends to show some of the syntax of PowerShell.
    To use it, write ". ./Write-Hello.ps1" (dot, space, filename) into your PowerShell first, so that the script gets loaded. <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.NOTES
    File Name: Write-Hello.ps1 <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.EXAMPLE
    Write-Hello
    Hello World! <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.EXAMPLE
    Write-Hello "World"
    Hello World! <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.EXAMPLE
    greet "World"
    Hello World! <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.EXAMPLE
    Write-Hello -Name "World"
    Hello World! <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.EXAMPLE
    "World" | Write-Hello
    Hello World! <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.EXAMPLE
    @("Jack", "Jill") | Write-Hello
    Hello Jack!
    Hello Jill! <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.ALIAS
    greet <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.LINK
    http://de.wikipedia.org/wiki/PowerShell <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.INPUTTYPE
    Takes a name of type [string]. <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.RETURNVALUE
    Output a greeting of type [string]. <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

.PARAMETER Name
    A list of names of the persons to greet. Greets the world by default.
#> <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

function Write-Hello
{
    [CmdletBinding()]
    param(
        # get name parameter from the pipeline or as a parameter
        [Parameter(Mandatory = $False, Position = 0, ValueFromPipeline = $True, HelpMessage = "The name to greet.")]
        [string]$Name = "World"
    ) <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

    begin {
        # load assemblies from Global Assembly Cache (deprecated method)
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Exception") <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

        # cancel the execution if an error occurs
        $ErrorActionPreference = "Stop"
    } <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

    # process once for every input that was given
    process {
        try {
            if($Name -eq "Error") {
                throw New-Object System.Exception("The name must not be 'Error'.")
            }
        }
        catch [System.Exception] {
            Write-Error $_
        } <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

        # process the request
        [string]$Greeting = [string]::Format("Hello {0}!", $Name) <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

        # outputs a string object to the PowerShell pipeline
        # note: using write-host calls .ToString() method on the returned object
        Write-Output $Greeting
    } <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

    end { <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

    }
} <span title="Aus: Deutsche Wikipedia, Abschnitt &quot;Skripte&quot;" class="plainlinks">[https://de.wikipedia.org/wiki/PowerShell#Skripte <span style="color:#dddddd">ⓘ</span>]</span>

# setting an alias
Set-Alias greet Write-Hello

Dateiendungen

  • .ps1 – Windows PowerShell Shellskript
  • .ps1xml – Windows PowerShell Format- und Typdefinitionen
  • .psc1 – Windows PowerShell Konsolendatei (exportierte Shell-Konfiguration)
  • .psd1 – Windows PowerShell Datendatei
  • .psm1 – Windows PowerShell Moduldatei