Powershell basiert auf dem .NET-Framework, genau wie C# und einige andere Programmiersprachen von Microsoft. Durch diese Verwandtschaft kann Powershell im Prinzip auf alle Funktionen des .NET-Frameworks zurückgreifen, was eine schier unerschöpfliche Menge an zusätzlichen Funktionalitäten zur Verfügung stellt, die man sehr einfach anzapfen kann.
Ein Framework besteht aus einer Reihe von Komponenten, die zu einem Produkt zusammengeschnürt sind. Im Falle des .NET-Framework sind diese Komponenten im Wesentlichen die CLR oder Common Language Runtime, die für die Ausführung von Programmen zuständig ist, und der für Powershell-Skripter wesentlich interessantere Teil, die Klassenbibliothek. Die Klassenbibliothek stellt eine riesige Menge an Klassen zur Verfügung, die im .NET-Framework direkt verwendet werden können.
Klassen, oder allgemeiner Typen (der Unterschied ist in Powershell nicht relevant), sind Vorlagen für Objekte. Sie können keine Objekte erstellen, ohne eine Vorlage dafür zu haben. Für gänzliche neue Ob-jekte müssen Sie also immer erst einen Typ erstellen, bevor Sie ein neues Objekt darauf aufbauen kön-nen. Mehr zur Objekten und wie Sie neue Objekte erstellen können finden Sie auch im Abschnitt Varia-blen und Objekte. Wenn Sie von einem Typ ein neues Objekt ableiten, spricht man auch von instanziie-ren, das neue Objekt ist eine neue Instanz.
Wie bereits im Abschnitt Variablen und Objekte besprochen, können Sie ein neues Objekt mit dem Cmdlet New-Object erzeugen. Sie müssen hierfür nur wissen wie die Vorlage Ihres Objekts heißt.
Die Vorlage des Objekts (der Typ-Name oder die Klasse) heißt in diesem Fall also system.Datetime und stellt alle Informationen bereit, um ein neues Datums-Objekt zu erzeugen. Die Erstellung eines Objekts aus einer Vorlage wird auch als instanzieren bezeichnet, das Objekt selbst als Instanz.
Der Typ-Name setzt sich aus dem Namen des Typs und dem "Namespace" zusammen, also dem Bezeichner vor dem Typ-Namen. Im Falle des Datetime-Typs ist das system. Ein Namespace ist einfach ein "Ordner", in dem sich der Typ befindet. Namespaces haben nur einen Zweck – sicher zu stellen, dass neue erstellte Klassen immer eindeutige Namen haben. Namespaces werden z.B. auch im Domain Name System (DNS) oder im Dateisystem verwendet. Die Ordner, in denen sich eine Datei befindet, stellen den Namespace dar. Auf diese Weise kann es in Windows z.B. zwei Dateien Notepad.exe geben: C:\Windows\Notepad.exe und C:\Windows\System32\Notepad.exe.
Wenn ein Programmierer einen neuen Datentyp bzw. eine Klasse erstellen will, braucht er nur einen neuen Namespace ("Ordner") zu erstellen und kann dann sicher sein, dass alle Typ-Namen, die er hier ablegt, eindeutig sind. Um ein neues Objekt zu erstellen, muss man immer den vollqualifizierten Namen der Klasse angeben.Genau wie im Dateisystem gibt es aber auch Namespaces, die sich im "Pfad" befinden. Typen, die hier liegen, können direkt über Ihren Namen referenziert werden.
New-Object -TypeName system.Datetime
> Montag, 1. Januar 0001 00:00:00
New-Object -Typename Datetime
Datetime kann auch direkt referenziert werden, der System-Namespace (in dem sich alle Basis-Typen wie String, Datetime, Int usw. befinden) ist also "im Pfad". In einem Typ sind alle Eigenschaften, Methoden und Ereignisse definiert, die eine neue Instanz eines Objekts nach dem Instanziieren besitzt.
$Datum = New-Object -TypeName Datetime
Eigenschaften sind Werte, die direkt abgefragt werden können. Sie "beschreiben" das Objekt. Um eine Eigenschaft abzufragen, schreibt man hinter das Objekt einen Punkt und dann den Eigenschaft-Namen.
$Datum.Year
> 1
Methoden sind Programme, die zum Objekt gehören. Methoden lesen meist Eigenschaften des Objekts aus, verarbeiten diese und geben den verarbeiteten Wert aus, ohne das eigentliche Objekt zu verändern. Methoden-Parameter werden in runden Klammern hinter dem Methoden-Namen angegeben. Im Gegensatz zu Powershell haben diese aber eine feste Reihenfolge, man muss also bei der Übergabe der Argumente die Reihenfolge beibehalten. Eine Methode wird wie eine Eigenschaft aufgerufen, hat aber immer ein paar runde Klammern hinter dem Methodennamen, über die die Parameter übergeben werden können.
$Datum.AddYears(2019)
> Mittwoch, 1. Januar 2020 00:00:00
Events oder Ereignisse erlauben es, auf Änderungen des Objekts zu reagieren. Events sind sehr üblich bei grafischen Oberflächen, weil es mit ihrer Hilfe möglich ist, auf Interaktionen wie einen Maus-klick auf einen Button automatisch zu reagieren. Ohne ein Event müsste man eine Schleife bauen, die dauerhaft prüft, ob der Button gedrückt wurde. Mit einem Event ist es möglich, Code ausführen zu lassen, wenn das Click-Ereignis eintritt. Da Datums-Objekte über keine Events verfügen, hier ein kleines Skript zum Erstellen einer sehr simplen Windows-Forms GUI.
Add-Type -AssemblyName system.windows.forms
$Form = New-Object system.Windows.Forms.Form
$Form.ClientSize = '248,92'
$Form.text = "ShutdownGUI"
$btn_Shutdown = New-Object system.Windows.Forms.Button
$btn_Shutdown.text = 'Herunterfahren'
$btn_Shutdown.width = 190
$btn_Shutdown.height = 42
$btn_Shutdown.location = New-Object System.Drawing.Point(26,26)
$btn_Shutdown.Font = 'Microsoft Sans Serif,10'
$btn_Shutdown.Add_Click({ $btn_Shutdown.Text = 'Starten' })
$Form.controls.AddRange(@($btn_Shutdown))
$Form.ShowDialog()
Dieses Skript öffnet bei der Ausführung ein Fenster mit einem Button.

Grafische Oberflächen bestehen ausschließlich aus Objekten. Windows Forms ist recht einfach zu benutzen. Sie benötigen ein Formular, in das grafische Elemente eingebettet werden. Die ersten vier Zeilen legen die Eigenschaften des Formular-Objekt fest und konfigurieren die Größe und den Text in der Kopfzeile.
In den folgenden Zeilen wird das Button-Objekt erstellt und konfiguriert. Die Eigenschaft Text beinhaltet dabei den Text, der auf dem Button angezeigt werden soll, und Location definiert, an welcher Position auf dem Formular der Button gezeichnet werden soll. Hierfür wird ein Drawing-Point verwendet.
Der Drawing-Point ist sehr einfaches Objekt, das nur x- und y-Koordinate eines Punktes speichert. Die Größe des Buttons wird über die Eigenschaften Width und Heigth angegeben. Wirklich interessant ist aber diese Zeile:
$btn_Shutdown.Add_Click({ $btn_Shutdown.Text = 'Starten' })
Hier wird dem Button ein Click-Event hinzugefügt. Add_Click() ist eine Methode (also ein Programm), die beim Auftreten des Click-Events gestartet wird. Als Parameter wird ein Skriptblock übergen, der ausgeführt wird, wenn der Button geklickt wird. Der Skriptblock kann wie üblich beliebigen Powershell-Code enthalten. Im Beispiel wird sicherheitshalber der Text des Buttons angepasst, so dass nach dem Klicken 'Starten' auf dem Button steht – Sie können den Code aber auch einfach durch Stop-Computer ersetzen, und schon fährt Ihr Computer herunter.
Die letzten beiden Zeilen verknüpfen den Button mit dem Formular – ohne diese Zeile sind der Button und das Formular einfach zwei Objekte, die nichts miteinander zu tun haben. Anschließend wird die Methode $Form.Showdialog aufgerufen, die das Formular anzeigt. Ohne diese Zeile wird das Formular zwar im Hintergrund erzeugt, aber Windows zeigt es am Bildschirm nicht an.
Wenn Sie sich selbst eine grafische Oberfläche mit Windows Forms erstellen möchte – dieses kleine Beispiel wurde auf der Website PoshGui.Com erzeugt. Dort gibt es einen Online-Editor, der Ihnen den Code automatisch erzeugt. Eine etwas weitergehende Einführung gibt es außerdem bei Microsoft.learn.
$Form = New-Object system.Windows.Forms.Form
$Form.ClientSize = '248,92'
$Form.text = "ShutdownGUI"
$btn_Shutdown = New-Object system.Windows.Forms.Button
$btn_Shutdown.text = 'Herunterfahren'
$btn_Shutdown.width = 190
$btn_Shutdown.height = 42
$btn_Shutdown.location = New-Object System.Drawing.Point(26,26)
$btn_Shutdown.Font = 'Microsoft Sans Serif,10'
$btn_Shutdown.Add_Click({ $btn_Shutdown.Text = 'Starten' })
$Form.controls.AddRange(@($btn_Shutdown))
$Form.ShowDialog()