HOWTO · Batch

Esperar a que un comando o programa termine en un archivo por lotes de Windows

CALL para otro archivo, START "" /WAIT para un programa iniciado y TIMEOUT solo para una demora.

Los comandos y ejecutables ejecutados directamente terminan antes de que cmd.exe lea la línea siguiente. Solo necesita una forma especial al llamar otro archivo por lotes o al iniciar un programa con START.

Situación Use
Comando o ejecutable normal Ejecútelo directamente
Otro archivo .bat o .cmd call child.cmd
Programa iniciado con START start "" /wait program.exe
Espera fija o confirmación timeout o pause

Ejecute comandos directamente

Guarde %ERRORLEVEL% inmediatamente si el resultado importa.

@echo off
echo [1] inicio de ping
ping 127.0.0.1 -n 2 >nul
set "rc=%ERRORLEVEL%"
echo [2] fin de ping: código de salida=%rc%
exit /b %rc%

El orden de salida es:

[1] inicio de ping
[2] fin de ping: código de salida=0

La línea posterior se ejecuta después de ping. TIMEOUT no comprueba esa finalización: solo añade un tiempo fijo. exit /b %rc% devuelve el resultado guardado a un archivo por lotes que llama o al símbolo del sistema.

Llame otro archivo por lotes con CALL

Sin CALL, ejecutar un archivo por lotes transfiere el control y las líneas posteriores del padre no continúan. CALL devuelve el control al padre:

@echo off
echo [parent] antes de call
call child.cmd input.txt
set "rc=%ERRORLEVEL%"
echo [parent] después de call: código de salida=%rc%
exit /b %rc%

child.cmd:

@echo off
echo [child] inicio
ping 127.0.0.1 -n 2 >nul
echo [child] fin
exit /b 7

El padre recibe el control solo después de que el hijo termine:

[parent] antes de call
[child] inicio
[child] fin
[parent] después de call: código de salida=7

Los argumentos siguen al nombre y los que tienen espacios se entrecomillan. Consulte la referencia de call de Microsoft.

Espere un programa iniciado con START

Use /WAIT solo cuando elige iniciar el programa mediante START:

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

Para un programa de prueba que termina con el código 9, la salida esperada, después de que termine, es:

worker terminó: 9

El primer "" es el título de ventana y es necesario antes de una ruta entrecomillada: START interpreta su primer argumento entre comillas como título. /B conserva la consola actual; /WAIT es la opción que espera. Espera el proceso iniciado, no necesariamente un proceso independiente que ese programa pueda crear. La referencia de start documenta sus opciones y otros patrones de START.

Use TIMEOUT o PAUSE solo para pausar

timeout /t 30 espera 30 segundos; pause espera una tecla. Ninguno demuestra que un programa acabó. /NOBREAK evita que teclas normales omitan la cuenta atrás y timeout /t -1 espera una tecla. Para la finalización use CALL o START "" /WAIT; para una demora vea usar TIMEOUT.

Solución de problemas

  • No use un bucle que sondea nombres de proceso como sustituto general de START /WAIT. Varios procesos pueden compartir un nombre y un iniciador puede volver antes de que termine un hijo separado.
  • Lea %ERRORLEVEL% inmediatamente después del comando que le interesa. echo, set y comandos posteriores pueden cambiarlo.
  • No agregue cmd /k a ejemplos de automatización: deja el símbolo del sistema abierto deliberadamente en lugar de informar si el script acabó.
  • Si un programa necesita privilegios de administrador, entrada del usuario, acceso de red o una señal de finalización propia, su documentación determina si basta con esperar el proceso de comando.

Resumen

Ejecute los comandos normales directamente. Use CALL para otro archivo por lotes que debe volver a quien lo llama y use START "" /WAIT solo si inicia un programa mediante START. TIMEOUT y PAUSE detienen el archivo por lotes, pero no indican que un programa haya terminado.