HOWTO · Batch
Esperar a que un comando o programa termine en un archivo por lotes de Windows
Ejecute comandos en orden: use CALL para otro archivo por lotes, START "" /WAIT para un programa iniciado con START y TIMEOUT solo para una demora.
En esta página
Los comandos y ejecutables que se ejecutan directamente en un archivo por lotes terminan antes de que cmd.exe lea la línea siguiente. Use un comando especial solo si llama a otro archivo por lotes o inicia deliberadamente un programa con START.
| Situación | Qué usar |
|---|---|
| Un comando o ejecutable normal | Ejecútelo directamente; la línea siguiente se ejecutará cuando termine. |
Otro archivo .bat o .cmd |
call child.cmd para volver al archivo padre cuando termine el hijo. |
Un programa iniciado con START |
start "" /wait program.exe para esperar al proceso iniciado con START. |
| Una demora fija o la confirmación del usuario | timeout o pause; ninguno detecta que un proceso haya terminado. |
En este artículo se explica cada caso y cómo guardar el código de salida de un comando antes de que otro comando lo reemplace.
Ejecute comandos directamente
Si un comando o ejecutable ocupa su propia línea, no agregue START solo para que el script espere. El comando siguiente se ejecuta cuando el primero termina. Este pequeño archivo por lotes ilustra la secuencia con los comandos integrados echo:
@echo off
echo [1] command start
echo [2] command returned
[1] command start
[2] command returned
La misma secuencia se aplica al ejecutar un programa directamente. Si los pasos siguientes necesitan su código de salida, guarde %ERRORLEVEL% inmediatamente después del comando; otro comando puede cambiarlo. Use exit /b %rc% para devolver desde un archivo por lotes un resultado guardado previamente.
Llame a otro archivo por lotes y vuelva al padre
Al invocar un archivo por lotes por su nombre, el control pasa a ese archivo. Use CALL si el archivo padre debe continuar después. Por ejemplo, el padre puede guardar de inmediato el código devuelto por el hijo:
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
Son ejemplos de archivos separados, no una prueba ejecutada. En Windows Batch, CALL devuelve el control al padre cuando termina el hijo, y el padre puede leer el %ERRORLEVEL% resultante. Sin CALL, invocar otro archivo .bat o .cmd transfiere la ejecución a ese archivo y las líneas posteriores del padre no se ejecutan. Los argumentos se escriben después del nombre del archivo hijo; ponga entre comillas cualquier argumento que contenga espacios. Microsoft documenta la sintaxis y el comportamiento de retorno en su referencia de call.
Espere a que termine un programa iniciado con START
Use START cuando quiera iniciar un programa aparte. Agregue /WAIT para esperar al proceso que inicia START:
start "" /wait "C:\Tools\My Program\worker.exe" --task import
set "rc=%ERRORLEVEL%"
echo worker exit code: %rc%
exit /b %rc%
Este comando específico de Windows ilustra la sintaxis; el ejecutable externo no se incluye aquí, por lo que no se afirma ningún resultado de ejecución. El "" vacío es el título de la ventana. Debe ir antes de una ruta de ejecutable entre comillas, porque START interpreta como título su primer argumento entre comillas. /B es opcional y mantiene un programa de consola en la ventana actual del símbolo del sistema; no hace que el comando espere. La opción para esperar y volver cuando termina el proceso iniciado es /WAIT.
START /WAIT espera al proceso que inicia. No garantiza que un iniciador que a su vez arranca un proceso hijo separado y desconectado haya terminado todo su trabajo. Si esa diferencia importa, consulte la documentación del programa iniciado. Consulte la referencia de start de Microsoft para ver todas las opciones y Cómo usar el comando START en un archivo por lotes para conocer otros patrones de inicio.
Use TIMEOUT o PAUSE solo para pausar el script
Use TIMEOUT si necesita deliberadamente esperar un intervalo, no como prueba de que otro proceso haya terminado. Microsoft documenta /NOBREAK para que las pulsaciones normales no omitan una cuenta atrás, y TIMEOUT /T -1 para esperar a que se pulse una tecla; PAUSE también muestra una solicitud interactiva. El comando TIMEOUT de Windows acepta valores entre -1 y 99999 segundos. Una demora podría ser demasiado corta o innecesariamente larga; si lo que necesita es que termine un proceso, use CALL o START "" /WAIT.
Para consultar opciones y ejemplos dedicados a las demoras, vea Cómo usar TIMEOUT en un archivo por lotes.
Solución de problemas
- No use un bucle que consulte repetidamente los nombres de procesos como sustituto general de
START /WAIT. Puede haber varios procesos con el mismo nombre y un iniciador puede terminar antes que un hijo desconectado. - Lea
%ERRORLEVEL%inmediatamente después del comando cuyo resultado le interesa.echo,sety otros comandos posteriores pueden cambiar su valor. - No agregue
cmd /ka ejemplos de automatización: deja deliberadamente abierto un símbolo del sistema en vez de indicar si el script terminó. - Si un programa requiere privilegios de administrador, entrada del usuario, acceso a la red o una señal de finalización específica de la aplicación, consulte su documentación para determinar si basta con esperar a que termine el proceso del comando.
Resumen
Ejecute directamente los comandos normales. Use CALL para invocar otro archivo por lotes cuando deba volver al archivo que lo llamó y START "" /WAIT solo cuando inicie un programa mediante START. TIMEOUT y PAUSE pausan el archivo por lotes, pero no indican si un programa terminó.