Variablen und Objekte
Wenn ein Powershell-Cmdlet Rückgabewerte ausgibt, werden diese normalerweise in die Konsole geschrieben, also in das Ein-/Ausgabefenster von Powershell. Wenn man Rückgaben weiterverarbeiten möchte, kann man sie aber in einer Variablen "auffangen".
Variablen müssen in Powershell vor der Verwendung nicht explizit deklariert werden. Stattdessen bestimmt Powershell den Datentyp (die "Datenstruktur") einer Variablen selbständig anhand des Rückgabewertes. Sie können die Ausgabe eines Cmdlets mit Hilfe des Gleichheitszeichens direkt einer Variable zuweisen. Dem Variablennamen muss immer ein $ vorangestellt werden, der Name selbst kann aus Buchstaben, Zahlen und dem Unterstrich bestehen.
$Text = 'Hallo Welt' # Der Text 'Hallo Welt' wird der Variablen Text zugewiesen
$Zahl = 1 # Die Zahl 1 wird der Variablen Zahl zugewiesen
$Files = Get-Childitem -Path c:\windows # entspricht Dir c:\windows
Um den Inhalt einer Variablen wieder auszugeben, geben Sie einfach den vollständigen Variablennamen inklusive des $-Zeichens (jetzt ohne das Gleichheitszeichen) in die Konsole ein.
$Text
> Hallo Welt
Sie können den Inhalt der Variable ändern, indem Sie ihr einen neuen Inhalt zuweisen.
$Text = Read-Host -Prompt 'Geben Sie einen Text ein, der $Text zugewiesen werden soll'
> Geben Sie einen Text ein, der $Text zugewiesen werden soll:
Das Cmdlet Read-Host gibt den Text, der mit dem Parameter -Prompt übergeben wurde, in die Konsole aus und erwartet anschließend eine Benutzereingabe. Die Benutzereingabe wird dann in der Variablen Text gespeichert. Ohne die Variablenzuweisung würde die Textausgabe einfach direkt in die Konsole geschrieben werden. Es wird also immer erst das Kommando hinter dem Gleichheitszeichen ausgeführt, und das Ergebnis wird dann anschließend in der Varbiable gespeichert.
In Powershell sind alle Rückgaben grundsätzlich Objekte. Das bedeutet nicht, dass Sie mit Powershell Objektorientiert programmieren, obwohl das seit Powershell 5 geht. Powershell "konsumiert" lediglich Objekte aus dem .NET Framework. Obwohl das Konzept der Objektorientierung an sich nicht trivial ist, sind Objekte selbst simpel erklärt. Objekte sind nämlich letztlich nichts anderes als Container (Behälter), um Daten, die zusammengehören, strukturiert gemeinsam speichern zu können. Nehmen Sie hierfür eine IP-Adresse.
Um eine IP-Adresse auszugeben, können Sie IPConfig.exe verwenden. IPConfig.exe ist kein natives Powershell-Kommando, sondern ein Programm. Es gibt statt eines Objekts einen sehr langen Beschreibungstext zurück. (Eigentlich ist diese Aussage nicht ganz korrekt, denn in Powershell ist auch ein Text tatsächlich ein Objekt, aber in diesem Zusammenhang spielt das keine Rolle). Das Problem an Text ist, dass alle Informationen in dem Text von unserem Gehirn interpretiert werden müssen – für den Computer ist die Ausgabe nur eine zusammenhanglose Aneinanderreihung von Zeichen. Jegliche Strukturen, die einer IP-Adresse innewohnen, wie die IP selbst, aber auch die Subnetzmaske, der Adresstyp (IPv4, IPv6), die gebundene Netzwerkkarte usw. gehen verloren. Um aus der Textausgabe nur die IP-Adresse auszulesen, muss man den Text im Computer wieder interpretieren. Das geht nur durch Textanalyse (siehe hierzu auch der Abschnitt Reguläre Ausdrücke) oder heutzutage durch KI, ist aber immer in relativ aufwendiger Prozess.
Objekte verhalten sich dagegen wie Sortimentsboxen, in denen die relevanten Daten zu einem Ding einzeln gespeichert und einzeln wieder abgerufen werden. Die Idee bei der Objektorientierten Programmierung ist, dass man zusammenhängende Daten kapselt, weil das die Verarbeitung vereinfacht. Damit alle Objekte eines Typs gleich sind, erstellt ein Programmierer hierfür eine Objektvorlage, die alle relevanten Daten eines Dings in einzelnen Eigenschaften ablegt. Jede Eigenschaft ist dabei für sich selbst eine Variable – wie eine Sortimentsbox mit beschrifteten Fächern. Objektvorlagen werden auch als Klassen (oder in .NET als Typen) bezeichnet. Ein Objekt wird immer von einer Vorlage abgeleitet.
Um eine IP-Adresse in Powershell abzurufen, verwendet man statt IPConfig das Cmdlet Get-NetIPAddress:
Get-NetIPAddress -PrefixOrigin dhcp
> IPAddress : 192.168.100.103
> InterfaceIndex : 2
> InterfaceAlias : Ethernet 10
> AddressFamily : IPv4
> Type : Unicast
> PrefixLength : 24
> PrefixOrigin : Dhcp
> SuffixOrigin : Dhcp
> AddressState : Preferred
> ValidLifetime : 9.22:51:50
> PreferredLifetime : 9.22:51:50
> SkipAsSource : False
> PolicyStore : ActiveStore
Die Konsole liefert ein IP-Adressobjekt zurück, das für die Konsolenausgabe in Text umgewandelt wird. Speichert man es in einer Variable, bleibt seine Struktur aber erhalten und man kann über die Punkt-Schreibweise (Objekt.Eigenschaft) direkt auf einzelne Eigenschaften der IP-Adresse zurückgreifen:
$IP = Get-NetIPAddress -PrefixOrigin dhcp
$IP.IPAddress
> 192.168.100.103
Das Cmdlet Get-NetIPAddress ruft alle IP-Adressen des Computers ab. Der Parameter -PrefixOrigin ist ein Filter, mit dem man Get-NetIPAddress anweisen kann, nur die IP-Adressen auszugeben, bei denen in der Eigenschaft PrefixOrigin der Wert DHCP steht. In diesem Beispiel dient das dazu, nur eine einzelne IP-Adresse zurück zu bekommen. Wenn Ihre IP-Adresse manuell vergeben wurde, können Sie statt dhcp nach static filtern.
Powershell liefert die IP-Adresse als Text (String) zurück. Da aber ein Text auch ein Objekt ist, hat er eigene Eigenschaften (tatsächlich nur eine, nämlich Length, in der die Anzahl der Zeichen gespeichert ist), auf die man durch einen weiteren Punkt direkt zurückgreifen kann:
$IP.IPAddress.Length
> 15
Mit Objekten ist man also deutlich flexibler als mit einer reinen Text-Ausgabe – selbst, wenn man nur Text ausgibt.
Um den Datentyp (also die Vorlage) eines Objekts zu bestimmen, kann man die Methode GetType() verwenden. Methoden können wie Eigenschaften Teil eines Objekts sein und werden ebenfalls wie eine Eigenschaft über die Punkt-Schreibweise aufgerufen, allerdings mit runden Klammern hinter dem Namen. Im Unterschied zu Eigenschaften sind Methoden Programmcode, der Eigenschaften direkt aus dem Objekt auslesen und verändern kann. Eine ausführliche Einführung in Methoden finden Sie im gleichnamigen Abschnitt.
$Text.GetType()
> IsPublic IsSerial Name BaseType
> -------- -------- ---- --------
> True True String System.Object
$Text.GetType().Fullname
> System.String
Im ersten Beispiel sehen Sie die Ausgabe von GetType(). Die Rückgabe ist, wie immer in Powershell, aus in diesem Fall ein Objekt. Wenn Sie nur den Namen des Datentyps (also der Objektvorlage) haben wollen, können Sie hinter den Methodenraufruf wieder einen Punkt schreiben, gefolgt von der Objekteigentschaft, und Powershell gibt Ihnen nur den Wert der Eigenschaft Name zurück.