Vergleichsoperatoren und if/else in Batch-Dateien

    Während der Batch-Prozessor früher mit Hilfe von syntaktischen Tricks gerade einmal die Gleichheit eines Kommandozeilenarguments mit einem bestimmten Wert feststellen konnte, ist er heute immerhin zu allen Vergleichsoperationen fähig. Auch wenn er damit insgesamt noch weit von den Möglichkeiten einer Unix- oder Powershell entfernt ist, erschließen die Operatoren doch einige Einsatzgebiete für Batch-Dateien.

    Damit die gemessen an der command.com neuen Fähigkeiten der cmd.exe verfügbar sind, müssen die so genannten command extensions aktiviert sein. Standardmäßig ist dies unter neueren Windows-Versionen der Fall. Im Zweifel kann man dies über

    echo %CMDEXTVERSION%

    herausfinden, Werte größer 0 bedeuten, dass die Extensionen verfügbar sind. Der Aufruf von cmd.exe mit dem Schalter /x erzwingt den erweiterten Befehlssatz.

    gleich/ungleich, größer, größer gleich, kleiner, kleiner gleich

    Neben dem alten Gleichheitsoperator "==" und der Negation durch das unäre NOT, die beide noch vorhanden sind, bietet cmd.exe nun ein vollständiges Set an Vergleichsoperatoren:

    EQU => Gleichheit (synonym mit "==")

    NEQ => Ungleichheit

    LSS => kleiner als

    LEQ => kleiner oder gleich

    GTR => größer

    GEQ => größer oder gleich

    Vergleich von Zeichenketten

    Wie man unschwer feststellen kann, hat Microsoft für cmd.exe einzigartige Operatoren erfunden, die jede Ähnlichkeit mit anderen Script-Sprachen vermeiden. Sie erlauben nicht nur den Vergleich von numerischen Werten, sondern auch von Zeichenketten. Dabei ignoriert der Interpreter sogar Groß- und Kleinschreibung, wenn man if mit dem Schalter /i verwendet, so dass im folgenden Beispiel das Ergebnis falsch ist:

    if /i "NAME" GTR "name" echo NAME

    Der Vergleich von Zeichenketten betrachtet in den meisten Programmiersprachen jene als größer, deren erstes nicht übereinstimmendes Zeichen einen größeren Wert im verwendeten Zeichensatz hat. Microsoft geht mit cmd.exe hier andere Wege und wertet Großbuchstaben größer als Kleinbuchstaben.

    else-Anweisung

    Der Nutzen der Vergleichoperatoren wird dadurch erhöht, dass cmd.exe in if-Anweisungen auch einen else-Zweig zulässt. Will man etwa die if/else-Abfrage in einer Zeile formulieren, dann muss der von if abhängige Befehl in Klammern gesetzt werden:

    if 5 GTR 4 (echo 4) else (echo 5)

    2 Kommentare

    Bild von Micha
    Micha sagt:
    29. Januar 2013 - 17:27

    Danke für die tolle Zusammenfassung. Ich habe etwas länger gesucht um alle Vergleichsoperatoren zu finden. Super Auflistung.

    Bild von Wolfgang
    Wolfgang sagt:
    28. September 2013 - 15:12

    Hallo,

    ich habe folgendes Problem und hoffe, Sie können mir mit einem CMD Batchprogramm helfen. Ich habe 100e Dateien des Typs *.cc6 auf meinem PC in verschiedenen Verzeichnissen und Unterverzeichnissen ("Verzeichnisdateien") und davon die mit dem neuesten Datum per xcopy /D in den Ordner G:\CC6 kopiert ("Neue Dateien"). Nun möchte ich alle "Verzeichnisdateien" *.cc6 löschen, aber ich möchte vorher sicher sein, dass keine "Verzeichnisdatei" jünger ist als die gleichnamige im Ordner G:\cc6. Deshalb soll das Löschen einer "Verzeichnisdatei" *.cc6 nur dann ausgeführt werden, wenn es diese Datei in C:\cc6 gibt und letztere nicht älter ist.

    Für eine Antwort wäre ich sehr dankbar.

    Lieben Gruß
    Wolfgang