HOWTO · Batch
Auf das Ende eines Befehls oder Programms in einer Windows-Batchdatei warten
CALL für Batchdateien, START "" /WAIT für gestartete Programme und TIMEOUT nur für eine Verzögerung verwenden.
Direkt ausgeführte Befehle und Programme kehren normalerweise zurück, bevor cmd.exe die nächste Zeile liest. Eine besondere Anweisung brauchen Sie nur für eine andere Batchdatei oder wenn Sie ein Programm bewusst mit START starten.
| Situation | Richtige Form |
|---|---|
| Normaler Befehl oder EXE | Direkt ausführen |
Andere .bat- oder .cmd-Datei |
call child.cmd |
Mit START gestartetes Programm |
start "" /wait program.exe |
| Feste Wartezeit oder Bestätigung | timeout oder pause |
Befehle direkt ausführen
Speichern Sie den Rückgabecode sofort, wenn der nächste Schritt davon abhängt.
@echo off
echo [1] ping start
ping 127.0.0.1 -n 2 >nul
set "rc=%ERRORLEVEL%"
echo [2] ping ende: exit code=%rc%
exit /b %rc%
Die Ausgabe-Reihenfolge ist:
[1] ping start
[2] ping ende: exit code=0
Der zweite Befehl läuft erst nach ping. TIMEOUT ergänzt diese Reihenfolge nicht; es wartet nur eine festgelegte Zeit. exit /b %rc% gibt den gespeicherten Rückgabecode an eine aufrufende Batchdatei oder die Eingabeaufforderung weiter.
Eine Batchdatei mit CALL aufrufen
Ohne CALL übergibt der Aufruf einer Batchdatei die Steuerung an diese Datei; spätere Eltern-Zeilen werden nicht ausgeführt. Mit CALL kehrt die Steuerung zurück:
@echo off
echo [parent] vor call
call child.cmd input.txt
set "rc=%ERRORLEVEL%"
echo [parent] nach call: exit code=%rc%
exit /b %rc%
child.cmd:
@echo off
echo [child] start
ping 127.0.0.1 -n 2 >nul
echo [child] ende
exit /b 7
Die Eltern-Datei erhält die Steuerung erst nach dem Ende der Kinddatei:
[parent] vor call
[child] start
[child] ende
[parent] nach call: exit code=7
Argumente folgen dem Dateinamen und Argumente mit Leerzeichen werden zitiert. Details liefert die Microsoft-Dokumentation zu call.
Auf ein mit START gestartetes Programm warten
START erzeugt bewusst einen Startvorgang. Verwenden Sie /WAIT, wenn die nächste Zeile darauf warten soll:
start "" /b /wait "C:\Tools\My Program\worker.exe" --task import
set "rc=%ERRORLEVEL%"
echo worker beendet: %rc%
exit /b %rc%
Bei einem Testprogramm, das mit Code 9 endet, lautet die erwartete Ausgabe nach dessen Ende:
worker beendet: 9
Das leere "" ist der Fenstertitel und vor einem zitierten Programmpfad nötig, weil START das erste zitierte Argument als Titel behandelt. /B behält Konsolenprogramme im aktuellen Fenster; nur /WAIT wartet. START /WAIT wartet auf den gestarteten Prozess, nicht zwingend auf einen losgelösten Kindprozess. Siehe die Microsoft-Dokumentation zu start und weitere START-Muster.
TIMEOUT und PAUSE sind keine Abschlussprüfung
timeout /t 30 wartet 30 Sekunden und pause wartet auf eine Taste. Beides beweist nicht, dass ein Programm fertig ist. /NOBREAK verhindert das Überspringen durch normale Tasten; timeout /t -1 wartet auf eine Taste. Nutzen Sie für Prozessabschluss CALL oder START "" /WAIT; für eine absichtliche Verzögerung erklärt die TIMEOUT-Anleitung die Optionen.
Problembehandlung
- Verwenden Sie keine Schleife, die Prozessnamen abfragt, als allgemeinen Ersatz für
START /WAIT. Mehrere Prozesse können denselben Namen haben, und ein Launcher kann zurückkehren, bevor ein losgelöster Kindprozess endet. - Lesen Sie
%ERRORLEVEL%direkt nach dem relevanten Befehl.echo,setund spätere Befehle können den Wert ändern. - Fügen Sie in Automatisierungsbeispiele kein
cmd /kein: Es lässt die Eingabeaufforderung absichtlich offen, statt zu melden, ob das Skript fertig ist. - Benötigt ein Programm Administratorrechte, Eingaben, Netzwerkzugriff oder ein programmspezifisches Fertigstellungssignal, entscheidet dessen Dokumentation, ob das Warten auf den Befehlsprozess ausreicht.
Zusammenfassung
Führen Sie gewöhnliche Befehle direkt aus. Nutzen Sie CALL für eine andere Batchdatei, die zum Aufrufer zurückkehren muss, und START "" /WAIT nur, wenn Sie ein Programm über START ausführen. TIMEOUT und PAUSE halten die Batchdatei an, zeigen aber nicht an, ob ein Programm beendet ist.