Vergleichsoperatoren in PowerShell: -eq, -lt, gt, -contains, -like, -match


    Tags: ,

    Für bedingte Anweisungen oder Schleifen muss man in der Lage sein, Werte zu vergleichen, um abhängig davon den weiteren Fortgang eines Scripts zu bestimmen. PowerShell bietet wie alle anderen fortgeschrittenen Script-Sprachen sowohl if/else und switch als auch die dazugehörigen Vergleichsoperatoren. Allerdings orientiert sich Microsoft damit nicht an populären Sprachen aus dem Web- und Windows-Umfeld.

    Wer sich für Vergleiche an Zeichen wie > oder < oder = gewöhnt hat, der muss bei PowerShell umdenken. Sie verwendet als Operatoren ähnlich wie Batch-Dateien die Abkürzungen der englischen Begriffe, angeführt durch einen Bindestrich:

    -eq gleich
    -ne ungleich
    -lt kleiner
    -le kleiner oder gleich
    -gt größer
    -ge größer oder gleich

    Um das Ergebnis eines Vergleichs auszuprobieren, benötigt man nicht unbedingt eine if-Anweisung. Verzichtet man darauf, dann gibt die Vergleichsoperation einfach TRUE oder FALSE aus:

    "Vergleichsoperator".length -gt 10

    ergibt TRUE, weil das Wort Vergleichsoperator mehr als 10 Zeichen hat.

    Vergleiche für verschiedene Datentypen

    Wie in den meisten Script-Sprachen lassen sich auch in PowerShell die Vergleichsoperatoren auf verschiedene Datentypen anwenden. Sinnvoll ist das aber primär für numerische Werte, auch wenn der Vergleich von Zeichenketten möglich ist. Bei ihnen ist in der Praxis nur -eq und -ne von Nutzen, um die Gleichheit oder Ungleichheit festzustellen. Der Größenvergleich von Strings liefert Informationen, die eher selten benötigt werden:

    "Peter" -gt "Paul"

    ergibt TRUE, aber nicht, weil "Peter" eine längere Zeichenkette ist als "Paul". Vielmehr werden die Strings Zeichen für Zeichen verglichen, bis zwei verschiedene Zeichen aufeinandertreffen. Jenes mit dem höheren ASCII-Wert bestimmt, dass seine Zeichenkette als die größere gilt. Im obigen Beispiel ist 'e' größer als 'a' und deswegen gilt auch "Peter" als größer.

    Verwechslungsgefahr mit Zuweisungsoperator

    Als Stolperfalle kann sich wie in anderen Programmiersprachen die Verwechslung von -eq und '=' erweisen. Das Gleichheitszeichen dient in PowerShell als Zuweisungsoperator. Verwendet man ihn falsch in einer if-Anweisung, dann führt dies zu unerwünschten Ergebnissen, wenn auf der linken Seite eine Variable steht:

    if($a = "Peter"){

    }

    In solchen Fällen ist das Ergebnis des if-Ausdrucks immer richtig, die davon abhängige Anweisung wird grundsätzlich ausgeführt und der Wert der Variable $a zerstört.

    Zeichenketten vergleichen

    Auch wenn die oben beschriebenen Operatoren auch auf Zeichenketten angewandt werden können, sind für String-Vergleiche eigene Mittel vorgesehen. Im Prinzip handelt es sich dabei um Substring-Suche und Pattern-Matching.

    -like und Wildcards

    Erstere lässt sich recht einfach über den Operator -like realisieren. Mit seiner Hilfe kann man ermitteln, ob eine bestimmte Zeichenkette in einer anderen enthalten ist. Wenn die beiden Strings nicht identisch sind, dann benötigt man dafür Wildcards:

    "PowerShell" -like "Pow*"

    Dieser Ausdruck ergibt den Wert TRUE, wogegen er ohne Wildcard FALSE wäre. Möchte man einen String innerhalb eines anderen finden, verwendet man Wildcards am Anfang und am Ende, also im obigen Beispiel etwa *she*. Alternativ zu '*' kann man als Platzhalter für ein einzelnes Zeichen '?' nutzen. Der Vergleich mit -like ignoriert genauso wie -eq Groß- und Kleinschreibung. Wie bei -eq gibt auch bei -like einen Gegenspieler namens -notlike.

    Suche in Collections mit -contains

    Ein weiterer Operator, der aufgrund seines Namens fälschlich als zuständig für die Substring-Suche angesehen werden könnte, ist -contains. Er dient jedoch dazu, Arrays darauf zu prüfen, ob sie ein bestimmtes Element enthalten:

    $w = "Dezember","Januar","Februar"

    $w -contains "Februar"

    Das Ergebnis ist hier TRUE. Möchte man jedoch nach dem Vorbild von -like Wildcards verwenden, dann schlägt der Vergleich fehl, sie werden nicht unterstützt. Auch Substrings ohne Wildcards führen zu einem FALSE, erforderlich ist eine exakte Übereinstimmung mit einem Element der Collection. Um zu überprüfen, ob ein bestimmtes Element nicht in einem Array enthalten ist, gibt es den Operator -notcontains.

    Substrings finden mit -match

    Ein dritter Operator namens -match eignet sich einerseits für einfache Substring-Suche, andererseits dient er dem Mustervergleich mit regulären Ausdrücken. Verzichtet man auf RegEx, dann kann man damit ganz einfach prüfen, ob eine Zeichenkette in einer anderen enthalten ist:

    "PowerShell" -match "ower"

    ergibt TRUE. Die Überprüfung bedarf im Gegensatz zu -like keiner Wildcards, auch wenn die gesuchte Zeichenkette innerhalb einer anderen liegt. Auch zu -match gibt es einen Gegenspieler namens -notmatch.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut

    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links