Vorsicht mit den Klammern

Fangen wir mit einer kleinen, minimalen Batchdatei an:
@ECHO OFF
IF 1==1 (
        ECHO blah (blubb) schubidu
) ELSE (
        ECHO blubber
 )
Lassen wir das laufen, können wir uns über folgende Fehlermeldung freuen: schubidu was unexpected at this time.

Was ist hier passiert?

Nun, schauen wir den folgenden Code an:
IF 1==1 (ECHO blah)
Wo würde man erwarten, daß der ECHO-Befehl aufhört? Richtig, gerade vor der schließenden Klammer. Umgeschrieben auf mehrere Zeilen:
IF 1==1 (
        ECHO blah
 )
Sieht immer noch hübsch aus. Aber was, wenn man in einem IF-Block eine schließende Klammer ausgeben möchte (vielleicht als Teil eines Smileys)?Eine relativ naheliegende Idee wäre folgende:
IF 1==1 (
        ECHO :-)
 )
Unsere Erfahrung mit ECHO sagt uns, dass es die ganze Zeile ausgibt, solange da nicht Kram wie & oder > dazwischenkommt. Und gebe ich auf der Kommandozeile ECHO :-) ein, funktioniert das auch problemlos. In diesem IF-Block gibt es allerdings einen Fehler:
IF 1==1 (ECHO :-))
) was unexpected at this time.
Und hier ist wahrscheinlich klar, was passiert ist. Die erste schließende Klammer beendet den Block, ähnlich wie das erste */ einen Kommentar in C beendet. Das Verhalten, was cmd hier an den Tag legt, ist sicherlich für einzeilige IFs sinnvoll, aber in meinen Augen eher nervig, wenn man das mehrzeilig macht.Nun, da wir wissen, wonach wir Ausschau halten müssen, wäre es nett zu wissen, wie man das in Zukunft vermeidet. Meine erste Idee wäre, das Innere des Blockes in ein Unterprogramm zu verlegen:
IF 1==1 CALL :SUB
GOTO :EOF
:SUB
ECHO :-)
GOTO :EOF
Das funktioniert zwar, aber ein Unterprogramm für eine einzelne Zeile ist schon mal nicht so hübsch (zugegeben, mag davon abhängen, wie lang die Zeile ist). Eine andere Variate wäre es, die schließende Klammer in eine Umgebungsvariable zu verlegen:
SET P=)
IF 1==1 (
        ECHO :-%P%
 )
Immer noch nicht schön, aber immerhin zerreißt es den Code nicht so sehr. Die einfachste Variante wäre allerdings, Escaping zu nutzen. Das Escapezeichen in cmd ist ^, also sähe der Code folgendermaßen aus:
IF 1==1 (
        ECHO :-^)
 )
Wir haben unserem Smiley gerade eine Hakennase verpaßt.

Wenn man hingegen eine Variable hat, die Klammern enthält (zum Beispiel das Programme-Verzeichnis für 32-bit-Anwendungen auf 64-bit-Systemen), dann muß man entweder verzögerte Variablenauswertung (delayed expansion) nutzen oder aber Unterprogramme.

Dinge, die man hieraus lernen kann: Das Escapezeichen funktioniert grundsätzlich überall in Batchdateien. Jedes Zeichen kann man damit an möglichen Syntaxfehlern vorbeikriegen.

Kommentare

Neuen Kommentar abgeben

The content of this field is kept private and will not be shown publicly.