Heute musste ich wieder einmal länger überlegen, warum mein Batch-Skript nicht funktionierte. Dies ist der super intuitiven Syntax geschuldet, die ich ab und an wieder vergesse wenn ich länger nichts größeres damit machen musste. Grundsätzlich sind komplexere Sachen in Batch eher „schwierig“ umzusetzen und werden leicht zu Spaghetti-Code. Das hindert aber die meisten Softwarehersteller auch im Jahr 2019 nicht daran einige Teile ihrer Softwarelösung mit Hilfe eines ganzen Haufens von Batch-Skripten zu realisieren, die sich dann auch noch gegenseitig mit irgendwelchen Parametern aufrufen. Dann braucht man sich als Admin auch nicht schlecht fühlen so etwas zu machen 😀
Zum Glück kann man in Batch-Dateien if- und else-Verzweigungen nutzen. Lediglich die Syntax bzw. die Eigenart in Batch-Dateien, die man penibel einhalten muss, vergesse ich dabei desöfteren.
if und else als Einzeiler
Grundsätzlich funktioniert es schon mal, wenn man einen solchen Einzeiler nutzt:
1 |
if %test%==1 (echo something) else (echo something else) |
Wichtig ist, dass man die Leerzeichen hinter der if-Bedingung wie auch vor und hinter dem else setzt, ansonsten funktioniert es schon nicht! Die Ausführung der Batch-Datei wird dann auch sofort ohne Rückmeldung abgebrochen, selbst wenn in der Datei ein pause-Befehl folgt.
Wenn kein else-Zweig benötigt wird kann man sogar komplett auf Klammern verzichten, z. B. so:
1 |
if %test%==1 echo something |
Würde man hier noch „else echo something else anhängen“, dann würde die CMD „something else echo something else“ ausgeben wenn die Bedingung zutrifft. Dies liegt daran, dass in diesem Beispiel der echo-Befehl nicht ahnen kann, dass da noch ein else-Zweig folgt.
if und else als Mehrzeiler
Wenn etwas mehr passieren soll, dann benötigt man natürlich mehrere Zeilen. Dabei muss der Aufbau wie folgt sein:
1 2 3 4 5 |
if %test%==1 ( echo something ) else ( echo something else ) |
Das else muss auf jeden Fall hinter der geschlossenen Klammer des if-Zweigs und vor der offenen Klammer des else-Zweigs stehen. Um das ganze nicht zu verwirrend zu gestalten, sollte man das else am besten mit den beiden Klammern immer in eine eigene Zeile setzen. Die schließende Klammer des else-zweigs kann man auch hinter den letzten Befehl des else-Zweigs schreiben. Das sieht meistens aber auch eher bescheiden aus.
Verschachtelung von if-Abfragen
If-Abfragen zu verschachteln ist möglich, wird aber relativ schnell ekelig. Je nach Formatierung zerhaut man sich die Batch-Datei und sie wird nicht mehr ausgeführt. Eine zweite oder auch eine dritte if-Ebene ist aber möglich.
So lässt sich folgende Batch-Datei ohne Probleme ausführen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
set test=1 set test2=2 set test3=3 if %test%==1 ( if %test2%==2 ( if %test3%==3 ( echo something ) else ( echo something else ) ) else ( echo something else ) ) else ( echo something else ) |
Es ist allerdings beispielsweise nicht möglich innerhalb einer verschachtelten if-Abfrage vernünftig den Error-Level zu bestimmen. Hier bietet sich leider eher eine Nutzung der bei Programmierern eigentlich verhassten Sprungmarken mittels goto-Befehl an. Auch wenn dies eher Spaghetti-Code wird lassen sich dadurch Syntax-Probleme umgehen.
Goto in C#, Python, PHP, Excel VBA, Bash, PowerShell nutzen?
Batch: if und else - Syntax verstehen
While- und Until-Schleifen in PowerShell und Batch
Wie lange läuft mein PC schon? – PC Laufzeit auslesen unter Windows 10
Wochentag in einer Batch-Datei ermitteln
CMD/Powershell: Ping-Ergebnis mit Errorlevel auswerten
Skript um Zeit-basiert Dateien zu tauschen
Die Gefahr durch mit Adminrechten ausgeführte Skripte
Powershell und CMD: Clear um Konsole zu leeren?
Java-Anwendungen über CMD oder Powershell starten
Kommandozeile aus Explorer in geöffnetem Ordner
Umlaute in Batch-Dateien – immer wieder schön