mehrere Batch Befehle in einer Zeile verknüpfen

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.
    Statt

    echo 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.

4 Kommentare

  1. 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

  2. Mal eine ganze andere Sache, die mir schon mehrfach bei deinen Scripten aufgefallen ist… nehmen wir mal als Beispiel das aus dem Artikel hier:

    :install
    msiexec /i test.msi
    if %errorlevel%==1 goto wait
    :wait
    ping 127.0.0.1 -n 300 >>nul
    echo retry >> %log%
    goto install

    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:

    IF %errorlevel%!=1 GOTO SomeError
    REM do something here
    REM and maybe here
    REM and here, too
    GOTO MainExit
    
    :SomeError
    REM handle the error here
    REM maybe echo something
    
    :MainExit

    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.

  3. 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

    if "%errorlevel%"="1"

    heißen müsste oder das undefinierte

    %log%

    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. 😉

Schreibe einen Kommentar