Objekte
Im Bereich Variablen wurden Hash-Table besprochen. Eine Hash-Table kann ähnlich wie eine ini-Datei zum Speichern von Konfigurationsdaten verwendet werden. Man kann eine Hash-Table allgemein beliebige Daten zusammenfassen. Als Beispiel soll hier einmal ein Benutzer herhalten.
$Benutzer = @{
Name = 'Holger'
Surname = 'Voges'
DisplayName = 'Holger Voges'
Password = 'Passw0rd'
Desription = 'Er liebt Powershell'
}
Die Variable $Benutzer beschreibt mit Schlüssel-Wertepaaren einzelne Eigenschaften eines Benutzers. Wie bereits im Abschnitt Hash-Table beschrieben, kann der Zugriff auf die einzelnen Eigenschaften des Benutzers jetzt einfach über Variablenname.Schlüsselname erfolgen:
$Benutzer.Name
> Holger
Ein Objekt ist im Prinzip einfach nur eine Erweiterung dieses Konzepts. Objekte können genau wie Hash-Table aus Schlüssel-Werte Paaren bestehen, die als Eigenschaften (Properties) bezeichnet werden. Im Gegensatz zu einer Hash-Table gibt es zu jedem Objekt aber immer eine Vorlage oder einen Bauplan, der genau bestimmt, welche Eigenschaften ein neues Objekt besitzt. Diese Vorlagen werden als Klassen oder Typen bezeichnet (Tatsächlich sind Klassen und Typen nicht 100%ig identisch, aber für unsere Betrachtung ist das egal). Mehr zu Klassen und Typen finden Sie im Abschnitt Arbeiten mit .Net.
Powershell arbeitet grundsätzlich immer mit Objekten, was den Zugriff auf Daten deutlich vereinfacht. Um auf die Eigenschaen und Methoden eines Objekts zugreifen zu können, muss man es erst einmal auffangen, z.B. in einer Variablen:
$Notepad = Get-Item -Path C:\Windows\notepad.exe
Das ursprünglich anonyme Objekt hat nun einen Namen, mit dem man arbeiten kann. Der Zugriff auf die Eigenschaften eines Objekts erfolgt jetzt direkt über den Variablennamen, gefolgt von einem Punkt und dem Eigenschaftsnamen:
$Notepad.FullName
> C:\Windows\Notepad.exe
Um sich alle Eigenschaften eines Objekts anzuzeigen, kann man das Kommando Select-Object verwenden (mehr dazu im Abschnitt Pipeline):
$Notepad | Select-Object -Property *
> PSPath : Microsoft.PowerShell.Core\FileSystem::C:\Windows\notepad.exe
> PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\Windows
> PSChildName : notepad.exe
> PSDrive : C
> PSProvider : Microsoft.PowerShell.Core\FileSystem
> PSIsContainer : False
> Mode : -a----
> VersionInfo : File: C:\Windows\notepad.exe
…
Prinzipiell sehen Sie die Objekteigenschaften auch, wenn Sie ein Objekt direkt in die Konsole ausgeben, also einfach mit Get-Childitem - allerdings zeigt Powershell standardmäßig nicht alle Objekteigenschaften an, da die meisten Objekte sehr viele Eigenschaften haben und die Darstellung in der Konsole dann sehr unübersichtlich wäre. Mehr zu dem Thema finden Sie unter dem Schwort ETS (Extended Type-System) unter Extended Type System Overview.
Objekt-Methoden
Objekte können zusätzlich zu Eigenschaften auch noch Methoden aufweisen. Eine Methode ist Programmcode, der mit dem Objekt gespeichert ist und der auf die Eigenschaften des Objekts zugreifen und sie verarbeiten kann - normalerweise, ohne das Objekt selbst zu verändern. Das ist nützlich, um Informationen über das Objekt offenzulegen, wie z.B. mit der Methode GetType(), die weiter oben bereits zum Einsatz kam. Zum anderen kann ein Objekt auch Code zur Verarbeitung der Objektdaten enthalten, den man sonst selbst schreiben müsste. Z.B. kann man jedes String-Objekt in Großbuchstaben umwandeln, indem man die Methode .ToUpper(), oder in Kleinbuchstaben, indem man die Methode .ToLower() aufruft. Die Methode verarbeitet dabei immer nur Daten des Objekts, zu dem sie gehört.
Wenn Sie neben den Eigenschaften eines Objekts auch seine Methoden angezeigt bekommen wollen, verwenden Sie das Cmdlet Get-Member. Get-Member zeigt Ihnen alle relevanten Informationen eines Objekts inklusive seines Typs an:
Get-member -InputObject $Notepad # Ein Objekt direct übergeben
> TypeName: System.IO.FileInfo
> Name MemberType Definition
> ---- ---------- ----------
> LinkType CodeProperty System.String LinkType{get=GetLinkT...
> Mode CodeProperty System.String Mode{get=Mode;}
> Target CodeProperty System.Collections.Generic.IEnumera..
Alternativ können Sie das Objekt auch in Get-Member pipen. Mit dem Parameter -Membertype können Sie die Eigenschaftentypen filtern, die angezeigt werden sollen. Sie können beim Membertype sogar Platzhalter verwenden.
'Ich bin ein kleiner Text' | get-member -membertype *property # Mit Pipeline
> TypeName: System.String
> Name MemberType Definition
> ---- ---------- ----------
> Chars ParameterizedProperty char Chars(int index) {get;}
> Length Property int Length {get;}
Get-Member ist ein ausgesprochen hilfreiches Cmdlet, weil es alle interessanten Informationen eines Objekts offenlegt.
Um sich alle Methoden eines Objekts anzeigen zu lassen, filtern Sie auf den Membertype Method:
'Ich bin ein kleiner Text' | Get-Member -MemberType Method

Abbildung 2 - Teilausgabe von Get-Member für einen String
In der Auflistung der Methoden finden Sie den Namen der Methode und ihre Definition. In der Definition kann man sehen, welche Parameter der Methode übergeben werden können. Wenn Sie eine hilfreiche Methode gefunden haben, können Sie den Aufruf über die Spalte Definition ersehen. Einfach ist es aber, wenn Sie die Methode einfach wie eine Eigenschaft aufrufen, also ohne die runden Klammern. Sie bekommen dann die möglichen Parameteraufrufe (Überladungen) zurück:
'ich bin ein kleiner Text'.substring
> OverloadDefinitions
> -------------------
> string Substring(int startIndex)
> string Substring(int startIndex, int length)
Methoden sind Programme, die direkt am Objekt aufgerufen werden können. Und wie bei den meisten Programmen kann man Methoden über Parameter Konfigurationswerte (Argumente) übergeben. Im Gegensatz zu Powershell ist die Reihenfolge der Parameter nicht beliebig, sondern fest. Dadurch muss nur das Argument beim Aufrufen einer Methode übergeben werden.
Das String-Objekt im obigen Beispiel verfügt über zwei Überladungen für die Methode Substring(). Überladungen sind einfach nur unterschiedliche Möglichkeiten, die Methode aufzurufen und entsprechen ungefähr Parametersätzen in Powershell.
Die erste Überladung sieht so aus:
OverloadDefinitions
-------------------
string Substring(int startIndex)
Das bedeutet, dass Sie der Methode Substring für den Parameter startIndex einen Ganzzahl-Wert (int) übergeben können und Ihnen die Methode dann einen String (die erste Angabe in der Überladung) als Rückgabe liefert:
'ich bin ein kleiner Text'.substring(12)
> kleiner Text
In diesem Beispiel wurde der Methode Substring() als Startindex die Zahl 12 übergeben, woraufhin Substring() einen Teilstring ab dem Startindex zurückgeliefert hat. Wenn Sie sich wundern, warum Substring erst ab dem 13. Zeichen zurückliefert – der erste Buchstabe hat den Index 0.
Die zweite Überladung sieht so aus:
OverloadDefinitions
-------------------
string Substring(int startIndex, int length)
Sie akzeptiert zwei Parameter, Startindex und Length. Die Länge gibt an, wie viele Zeichen ab dem Startindex zurückgeliefert werden soll. Auch Length muss als Ganzzahl übergeben werden, und wieder liefert die Methode einen String zurück.
'ich bin ein kleiner Text'.substring(12,7)
> kleiner
Die Beschreibung der Methode Substring und vieler, vieler anderer .Net-Methoden finden Sie, wenn Sie in der Suchmaschine Ihrer Wahl einfach den Methodennamen und msdn eingeben. Der erste Treffer sollte Sie dann auf die Seite docs.Microsoft.com und direkt zur Methode weiterleiten. Für die Substring-Methode ist das die Seite https://learn.microsoft.com/en-us/dotnet/api/system.string.substring.