Variablen in PowerShell: Namen, Werte, Datentypen

    Variablen in PowerShellDer Zweck von Variablen besteht bekanntlich darin, Werte zu speichern, um später im Code darauf zugreifen zu können. Auch hier bietet PowerShell weit mehr Möglichkeiten als der veraltete Batch-Interpreter und kann sich mit anderen modernen Script-Sprachen messen.

    Für die Vergabe von Variablennamen folgt PowerShell einer ähnlichen Konvention wie PHP oder Perl, indem es ihnen das Dollarzeichen '$' voranstellt. Darüber hinaus dürfen die Namen nur alphanumerische Zeichen oder den Unterstrich '_' enthalten. Will man unbedingt noch weitere Zeichen verwenden, dann muss man den Namen in geschweifte Klammern setzen.

    Hier einige Beispiele für gültige Namen von Variablen:

    • $myVariable
    • $MyVariable_1
    • ${my-variable}

    Ungültig sind dagegen:

    • myVariable
    • $my-variable
    • $my variable

    Genau genommen handelt es sich beim Namen einer Variablen um den Bestandteil hinter dem Dollarzeichen. Das ist deshalb wichtig zu wissen, weil man einem Cmdlet nur den Namen ohne '$' übergibt, wenn man dort eine Variable als Parameter spezifiziert. Dagegen teilt das Dollarzeichen der Shell mit, dass man am Inhalt der Variablen interessiert ist.

    Wie bei den meisten reservierten Schlüsselwörtern von PowerShell, beispielsweise bei Vergleichsoperatoren oder solchen für bedingte Anweisungen und Schleifen, spielt Groß- und Kleinschreibung auch bei Namen von Variablen keine Rolle. Entsprechend unterscheidet PowerShell zum Beispiel nicht zwischen $myVariable und $Myvariable.

    Werte an Variablen zuweisen

    Man kann einer Variablen einen Wert zuweisen, indem man ihren Namen, einen Zuweisungsoperator und einen Ausdruck kombiniert.

    $a = 1 + 1

    Das Gleichheitszeichen ist einer von insgesamt 8 Zuweisungsoperatoren in PowerShell. Als Ausdruck gilt alles, das einen Wert liefert. Gibt man einen Ausdruck am Prompt ein, dann zeigt PowerShell dessen Wert an. Im einfachsten Fall sind auch "Hallo Welt" und 1 Ausdrücke, nur dass die Berechnung ihres Werts wenig Aufwand erfordert.

    Möchte man mehreren Variablen gleichzeitig den gleichen Wert zuweisen, dann kann man dies nach folgendem Muster tun:

    $a = $b = $c = 1

    Es ist aber auch möglich, innerhalb einer einzigen Anweisung mehrere Variablen mit verschiedenen Werten zu versehen:

    $a, $b, $c = 1, 2, 3

    Eine solche Notation reduziert die Länge des Scripts, macht dieses allerdings auch schwerer lesbar.

    Um den Wert einer Variablen auszugeben, benötigt man keine besonderen Befehle wie in manch anderen Programmiersprachen. Es reicht, wenn man ihren Namen eingibt. Das gilt sowohl für Scripts als auch für die Kommandozeile.

    PowerShell expandiert Variablen in Strings, wenn diese in doppelten Anführungszeichen stehen.

    Eine Variable kann auch innerhalb einer Zeichenkette expandiert werden, wenn diese in doppelten Anführungszeichen steht:

    $a = "Test"
    "Doppelte Anführungszeichen: Das ist ein $a"

    Einfache Anführungszeichen verhindern dagegen die Auswertung einer Variablen, weil PowerShell diese nicht als solche erkennt, sondern einfach als Strings behandelt:

    'Einfache Anführungszeichen: Das ist ein $a'

    Datentypen

    Bis hierher haben wir nur mit zwei Typen von Variablen gearbeitet, mit 32-Bit-Integer und mit Strings. PowerShell unterstützt aber weitere Datentypen, darunter Fließkommazahlen oder Bool'sche Werte. Im Unterschied zu vielen kompilierten Sprachen muss man den Datentyp aber nicht explizit deklarieren. Vielmehr wählt ihn PowerShell automatisch, sobald die Variable mit einem Wert initialisiert wird.

    In einigen Fällen wird sie dabei aber nicht jenen verwenden, den man eigentlich haben möchte. Das zeigt dieses Beispiel:

    Wenn man nicht ganz schlecht in Kopfrechnen ist, dann wird einen 22 als Ergebnis einigermaßen überraschen. PowerShell hat nämlich unzutreffend angenommen, dass es sich bei der Variable $Number um einen String handelt. Dies führt zu einer Überladung des arithmetischen Operators *, dessen Implementierung von den beteiligten Argumenten abhängt.

    Die automatische Deklaration von $Number als String führt zu einem falschen Ergebnis.

    Nachdem der zweite Operand einer Multiplikation immer vom Typ Integer sein muss, wertet PowerShell den Ausdruck als "2" * 2 aus, was gleichbedeutend mit einer zweimaligen Wiederholung des Strings "2" ist. Entsprechend lautet das Ergebnis "22".

    PowerShell weist einer Variablen einen Datentyp nicht nur bei ihrer Initialisierung zu, sondern ändert diesen auch wieder automatisch, wenn der ursprünglich vergebene Typ nicht mehr zur Operation passt. Würde man etwa im obigen Beispiel statt der Multiplikation eine Division ausführen, dann wäre das Ergebnis korrekt, weil eine solche Operation mit einem String nicht sinnvoll ist und daher $Number in den Typ Integer konvertiert wird.

    Bei der Division interpretiert PowerShell $Number als Integer, entsprechend stimmt das Ergebnis.

    Wenn PowerShell jedoch keine plausible Möglichkeit zur Typumwandlung sieht, dann bricht sie die Ausführung der Anweisung mit einer Fehlermeldung ab. Die folgenden Zeilen bewirken etwa die Ausgabe der Meldung: Der Wert "b" kann nicht in den Typ "System.Int32" konvertiert werden. Fehler: "Die Eingabezeichenfolge hat das falsche Format."

    $a = "a"
    $b = "b"
    $a * $b

    Wenn die automatische Typumwandlung nicht funktioniert, dann scheitert die Operation mit einer Fehlermeldung.

    Dagegen läuft die folgende sehr ähnliche Operation fehlerfrei durch:

    $a = "a"
    $b = "2"
    $a * $b

    Bei der Typumwandlung von Variablen ist zu beachten, dass PowerShell diese nicht permanent in einen anderen Datentyp konvertiert. Auch wenn $b im obigen Beispiel für die Berechnung als Integer interpretiert wurde, bleibt der Datentyp bei String.

    Um den Datentyp einer Variablen zu bestimmen, kann man ihre Methode GetType() aufrufen:

    $b.GetType().Name

    Explizite Deklaration des Datentyps

    Aufgrund der Unwägbarkeiten, die eine automatische Konvertierung mit sich bringt, muss man sich nicht darauf verlassen, sondern kann den Datentyp explizit festlegen:

    Die explizite Deklaration von $Number als integer führt zu einem korrekten Ergebnis der Multiplikation.

    In diesem Beispiel deklarieren wir $Number explizit als Int32, indem wir den Typnamen in eckigen Klammern vor den Namen der Variable stellen.

    Eine Variable gilt als schwach typisiert, wenn man den Datentyp nur implizit durch die Zuweisung eines bestimmten Werts deklariert. Dagegen ist sie stark typisiert, wenn man ihren Datentyp explizit festlegt.

    Wie das obige Beispiel zeigt, kann die explizite Deklaration des Datentyps unerwünschte Ergebnisse verhindern und Script verlässlicher machen. Das ist jedoch nicht der einzige Grund, warum man eine starke Typisierung vorzieht. Die zulässigen Operationen mit einer Variablen hängen nämlich oft von ihrem Typ ab.

    Rechnen mit dem Typ DateTime

    Zum Beispiel kann man ein bestimmtes Datum in einer String-Variablen speichern, oder man nimmt dafür den Typ DateTime, der für diesen Zweck eigentlich vorgesehen ist. Solange man das Datum nur ausgeben will, spielt es keine Rolle, für welchen der beiden man sich entscheidet. Möchte man jedoch mit dem Datum rechnen, dann muss man die Variable als DateTime deklarieren.

    Importiert man etwa Datumswerte von einer Log-Datei und möchte wissen, wie viele Tage von einem bestimmten Datum bis heute vergangen sind, dann geht man so vor:

    Lässt man in diesem Beispiel die Deklaration des Datentyps DateTime weg, dann beschwert sich PowerShell mit der Meldung: Es wurden mehrere nicht eindeutige Überladungen gefunden für "op_Subtraction" und die Argument­anzahl: "2".

    Tabelle der gängigsten Datentypen

    Bezeichner

    Beschreibung

    [Array]

    Array

    [Bool]

    Wert ist TRUE oder FALSE

    [DateTime]

    Datum und Zeit

    [Guid]

    Global eindeutige 32-Byte ID

    [HashTable]

    Hash-Tabelle, Sammlung von Schlüssel-Wert-Paaren

    [Int32], [Int]

    32-bit Integer

    [PsObject]

    PowerShell-Objekt

    [Regex]

    Regular expression

    [ScriptBlock]

    PowerShell script block

    [Single], [Float]

    Fließkommazahlen

    [String]

    Zeichenkette

    [Switch]

    PowerShell Switch-Parameter

    [TimeSpan]

    Zeitintervall

    [XmlDocument]

    XML-Dokument

    Keine Kommentare