HOWTO · Batch
Auf das Ende eines Befehls oder Programms in einer Windows-Batchdatei warten
Befehle der Reihe nach ausführen: CALL für eine andere Batchdatei, START "" /WAIT für ein damit gestartetes Programm und TIMEOUT nur für eine Verzögerung.
Auf dieser Seite
Direkt ausgeführte Befehle und Programme enden, 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. Speichern Sie %ERRORLEVEL% direkt danach, wenn der nächste Schritt vom Ergebnis abhängt.
| 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, zum Beispiel call child.cmd input.txt; Argumente mit Leerzeichen werden in Anführungszeichen gesetzt. Für die Rückkehr zur Eltern-Datei muss CALL am Anfang des Aufrufs stehen. START ändert das Startmodell und ist kein Ersatz dafür. 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%
Ein Test mit einer EXE in einem temporären Pfad mit Leerzeichen gab Code 9 zurück; die folgende Ausgabe erscheint erst nach dem Ende dieses Programms:
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. Microsoft erlaubt bei TIMEOUT Sekundenwerte von -1 bis 99999: /NOBREAK verhindert das Überspringen durch normale Tasten, und 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.