Ich fasse es nicht, seit langer Zeit nutze ich Batch und wusste nicht, dass man mehrere Befehle verknüpfen kann!
Solche Strukturen:
:install msiexec /i test.msi if %errorlevel%==1 goto wait :wait ping 127.0.0.1 -n 300 >>nul echo retry >> %log% goto install
lassen sich viel kürzer realisieren. Befehle lassen sich mit
&
verknüpfen! Statt für 2, 3 Befehle einen eigenen goto-Block zu erstellen könnte ich das auch so lösen:
:install msiexec /i test.msi if %errorlevel%==1 ping 127.0.0.1 -n 300 >>nul & echo retry >>%log% & goto install
In Batch Programmen mit mehreren hundert Zeilen entfallen dadurch dutzende kleinere Befehlsblöcke mit nur 2-5 Befehlen und der Code lässt sich viel leichter lesen!
Hinweise: (alles Vermutungen, die ich während meiner Tests bemerkt habe)
- Vor und nach dem
&
Zeichen ein Leerzeichen, reduziert mögliche Fehler.
- Vor Umleitungen (mit
>
oder
>>
) immer ein Leerzeichen, danach keins.
Stattecho test>> %log% &
unbedingt
echo test >>%log% &
, sonst wird die Befehlskombination nicht korrekt ausgeführt.
- Keine mathematischen Operationen mit set /a in einer Befehlskombi verwenden, wird ignoriert.
- Maximal 1 if-Abfrage möglich und diese muss ans Ende der Befehlskette! Nach einer if-Abfrage werden weitere Befehle nicht ausgeführt (logischerweise…).
echo install %loop% & if %loop%==3 echo fehler & echo %loop%
gibt also install x aus, prüft die if Abfrage und führt alle folgenden Verkettungen nur aus, wenn die if-Abfrage true ist. Siehe Screenshot:
Mit anderen Worten: Es können einige Probleme bei der Verkettung von komplexeren Strukturen auftreten. Besser vorher einzelne Befehlskombinationen testen. Bisher funktionierten alle einfacheren 2er und 3er Verknüpfungen auf Arbeit. Je komplexer und länger die kombinierten Befehle, desto wahrscheinlicher ist aber ein fehlerhaftes Abarbeiten der Befehle.
Als Entwickler würde ich bezweifeln, dass die Anweisungen durch das Reduzieren auf eine einzige Zeile besser lesbar werden – eher im Gegenteil.
Als Entwickler von ordentlichen Programmiersprachen würde ich das auch.
Aber das jumping bei Batch ist alles andere als hilfreich. Das verhält sich auch nicht so wie Funktionen schreiben in normalen Sprachen.
Wie gesagt, ab einer bestimmten Größe von Batch Dateien finde ich es sehr angenehm.
Zum Beispiel habe ich letztens eine Fehlerauswertung gebraucht.
Hab jetzt also einen einzigen Block zur Auswertung eines Fehlercodes. Würde ich mit goto’s und mehreren Blöcken arbeiten hätte ich jetzt 4 oder 5 Blöcke für nur 1 Fehlercode, quer über den Code verstreut oder so. Da finde ich das schon nicht schlecht. Und lesbar ist es immernoch:
Code
Mal eine ganze andere Sache, die mir schon mehrfach bei deinen Scripten aufgefallen ist… nehmen wir mal als Beispiel das aus dem Artikel hier:
Darin hast du die IF Anweisung. Wenn diese erfüllt ist (also Error-Level gleich 1 ist), soll er zur Sprungmarke „wait“ springen. Diese befindet sich jedoch direkt in der nächsten Zeile. Was hat das für einen Sinn?
Standardmäßig sollte es ja genau umgekehrt sein, nämlich, dass man abfragt, ob ein bestimmter Code übersprungen werden soll. Also eher soetwas in der Art:
Das Problem an der von der dir verwandten Variante ist doch, dass das IF im Grunde nutzlos ist. Ob die Bedingung nun erfüllt ist oder nicht, in beiden Fällen macht er bei dir mit der nächsten Zeile weiter.
Dieser Code macht in dieser Konstellation keinen Sinn, ist klar. Es sollte nur zeigen, dass statt eines Sprungblocks auch eine Schreibweise gewählt werden kann bei der kein Sprungblock verwendet wird.
Genauso wie die Abfrage, die eigentlich
heißen müsste oder das undefinierte
ist auch der restliche Code nur ein ausgedachtes, halb sinnvolles Beispiel, wie man einen Sprungblock auflösen kann.
Dass ich in meinen Produktivscripts keine Sprungbefehle ohne Zwischenbefehle habe ist klar; der eigentliche Verwendungsgrund von goto sollte Batch Nutzern klar sein. 😉