HOWTO · Batch

Auf das Ende eines Befehls oder Programms in einer Windows-Batchdatei warten

Befehle in einer Windows-Batchdatei der Reihe nach ausführen: Mit CALL eine andere Batchdatei aufrufen, mit START "" /WAIT auf ein gestartetes Programm warten und TIMEOUT nur für eine Verzögerung verwenden.

Auf dieser Seite

Befehle und direkt gestartete Programme werden beendet, bevor cmd.exe die nächste Zeile liest. Einen besonderen Befehl brauchen Sie nur, wenn Sie eine andere Batchdatei aufrufen oder ein Programm gezielt mit START starten.

Situation Verwendung
Ein gewöhnlicher Befehl oder eine ausführbare Datei Direkt ausführen; die nächste Zeile läuft, sobald der Befehl zurückkehrt.
Eine andere .bat- oder .cmd-Datei call child.cmd, damit die Steuerung nach dem Ende der Kinddatei zum Aufrufer zurückkehrt.
Ein mit START gestartetes Programm start "" /wait program.exe, um auf den von START gestarteten Prozess zu warten.
Eine feste Verzögerung oder Bestätigung durch den Benutzer timeout oder pause; keines von beiden erkennt, ob ein Prozess beendet ist.

Dieser Artikel zeigt die einzelnen Fälle und erklärt, wie Sie den Rückgabecode eines Befehls sichern, bevor ein späterer Befehl ihn überschreibt.

Befehle direkt ausführen

Fügen Sie START nicht nur deshalb hinzu, damit das Skript wartet, wenn ein Befehl oder Programm in einer eigenen Zeile steht. Die nächste Anweisung wird ausgeführt, sobald der vorherige Befehl zurückkehrt. Diese kleine Batchdatei veranschaulicht den Ablauf mit den integrierten echo-Befehlen:

@echo off
echo [1] command start
echo [2] command returned
[1] command start
[2] command returned

Dieselbe Reihenfolge gilt, wenn Sie eine ausführbare Datei direkt aufrufen. Wenn spätere Schritte ihren Rückgabecode benötigen, speichern Sie %ERRORLEVEL% unmittelbar nach dem Befehl; ein späterer Befehl kann den Wert ändern. Mit exit /b %rc% geben Sie einen zuvor gespeicherten Rückgabecode aus einer Batchdatei zurück.

Eine Batchdatei mit CALL aufrufen

Beim Aufruf einer Batchdatei anhand ihres Namens wird die Steuerung an diese Datei übergeben. Verwenden Sie CALL, wenn die übergeordnete Datei anschließend fortfahren soll. Die übergeordnete Datei kann zum Beispiel den Rückgabecode der Kinddatei sofort speichern:

parent.cmd:

@echo off
echo [parent] before call
call child.cmd input.txt
set "rc=%ERRORLEVEL%"
echo [parent] after call: exit code=%rc%
exit /b %rc%

child.cmd:

@echo off
echo [child] start
echo Processing "%~1"
exit /b

Dies sind Beispiele für getrennte Dateien und kein ausgeführter Testfall. In Windows-Batchdateien gibt CALL die Steuerung nach dem Ende der Kinddatei an die übergeordnete Datei zurück. Dort ist dann auch der resultierende %ERRORLEVEL%-Wert der Kinddatei verfügbar. Ohne CALL überträgt der Aufruf einer anderen .bat- oder .cmd-Datei die Ausführung an diese Datei; die folgenden Zeilen der übergeordneten Datei laufen nicht. Übergeben Sie Argumente nach dem Namen der Kinddatei. Argumente mit Leerzeichen müssen in Anführungszeichen stehen. Microsoft beschreibt die Befehlsformen und das Rückgabeverhalten in der call-Referenz.

Auf ein mit START gestartetes Programm warten

Verwenden Sie START, wenn Sie ein separates Programm gezielt starten. Fügen Sie /WAIT hinzu, wenn der Befehl auf den gestarteten Prozess warten soll:

start "" /wait "C:\Tools\My Program\worker.exe" --task import
set "rc=%ERRORLEVEL%"
echo worker exit code: %rc%
exit /b %rc%

Dieser Windows-spezifische Befehl veranschaulicht die Syntax. Die externe ausführbare Datei ist hier nicht enthalten; deshalb wird kein Ausführungsergebnis behauptet. Das leere "" ist der Fenstertitel. Es muss vor einem in Anführungszeichen gesetzten Programmpfad stehen, weil START sein erstes Argument in Anführungszeichen als Titel behandelt. /B ist optional und führt ein Konsolenprogramm im aktuellen Eingabeaufforderungsfenster aus; dadurch wartet der Befehl nicht. Zum Warten und Fortfahren nach dem Ende des gestarteten Prozesses dient /WAIT.

START /WAIT wartet auf den Prozess, den es startet. Es garantiert nicht, dass ein Starter, der einen getrennten Kindprozess startet, auch dessen gesamte Arbeit abwartet. Wenn dieser Unterschied eine Rolle spielt, lesen Sie die Dokumentation des gestarteten Programms. Die vollständige Liste der Optionen finden Sie in der Microsoft-start-Referenz; weitere Startmuster zeigt So verwenden Sie den Befehl START in einer Batchdatei.

TIMEOUT und PAUSE sind keine Abschlussprüfung

Verwenden Sie TIMEOUT, wenn Sie bewusst eine bestimmte Zeit verstreichen lassen möchten, und nicht als Nachweis dafür, dass ein anderer Prozess beendet wurde. Microsoft beschreibt /NOBREAK für einen Countdown, den gewöhnliche Tastendrücke nicht überspringen können, sowie TIMEOUT /T -1 als Warten auf einen Tastendruck. PAUSE ist eine weitere interaktive Eingabeaufforderung. Der Windows-Befehl TIMEOUT akzeptiert Sekundenwerte von -1 bis 99999. Eine Verzögerung kann zu kurz oder unnötig lang sein. Wenn der Prozessabschluss die Bedingung ist, auf die Sie warten müssen, verwenden Sie CALL oder START "" /WAIT.

Optionen und Beispiele für zeitgesteuerte Verzögerungen finden Sie unter So verwenden Sie TIMEOUT in einer Batchdatei.

Problembehandlung

  • Verwenden Sie eine Schleife, die Prozessnamen abfragt, nicht als allgemeinen Ersatz für START /WAIT. Mehrere Prozesse können denselben Namen haben, und ein Starter kann zurückkehren, bevor ein losgelöster Kindprozess beendet ist.
  • Lesen Sie %ERRORLEVEL% unmittelbar nach dem Befehl aus, dessen Ergebnis Sie benötigen. echo, set und spätere Befehle können den Wert ändern.
  • Fügen Sie cmd /k nicht in Automatisierungsbeispiele ein: Damit bleibt eine Eingabeaufforderung absichtlich geöffnet, statt zu melden, ob das Skript beendet wurde.
  • Wenn ein Programm Administratorrechte, Benutzereingaben, Netzwerkzugriff oder ein anwendungsspezifisches Abschlusssignal benötigt, müssen Sie anhand seiner Dokumentation feststellen, ob das Warten auf den Befehlsprozess ausreicht.

Zusammenfassung

Führen Sie gewöhnliche Befehle direkt aus. Verwenden Sie CALL für eine andere Batchdatei, die zum Aufrufer zurückkehren muss, und START "" /WAIT nur, wenn Sie ein Programm mit START starten. TIMEOUT und PAUSE unterbrechen die Batchdatei, zeigen aber nicht an, ob ein Programm beendet ist.