¿Cómo esperas a que se complete un exe en un archivo por lotes?

43

Estoy tratando de crear un script para ejecutar un exe en el apagado para instalar sp1. mi guión es algo así como (no el guión de murciélago real)

If installed GOTO END
    Install.exe
END:

Mi problema es que cuando se ejecuta, inicia el instalador, luego finaliza el script porque el instalador es un proceso diferente y sigue cerrando el proceso de instalación porque la computadora está apagando y apagando el sistema (al menos, eso es lo que creo está haciendo)

¿Hay alguna manera de decirle que espere hasta que el proceso que inició se complete y luego se apague?

Kravlin
fuente

Respuestas:

81

Intenta correr

START /WAIT Install.exe
Bart De Vos
fuente
gran trabajo con esta respuesta!
l --''''''--------- '' '' '' '' '' ''
¿Puedes encadenar? like start /wait install; exit?
Serj Sagan
siempre puedes hacercmd /C start /wait install
graywolf
¿Qué sucede si necesita esperar un proceso en el que el archivo por lotes no se inició?
Kyle Delaney
23

Una forma más corta:

Install.exe|more

también

install|rem

podría usarse, aunque con más tiempo eventualmente podrás capturar algo de salida de la consola. Y esta es la razón por la que funciona: el comando canalizado espera la entrada hasta que finalice el .exe

npocmaka
fuente
y porque es el downlvote?
npocmaka
¡Esto es excelente! Yo te voto.
Changwang Zhang el
2
esto claramente gana
Fnord
¿Qué pasa si el exe toma parámetros? ¿Cómo funcionaría eso?
m4l490n
@ m4l490n: funcionará bien. Los operadores de redirección y la ejecución condicional tienen la más alta prioridad en las secuencias de comandos por lotes ( <, >, >>, &, &&, ||, |)
npocmaka
13

Llamar al exe directamente desde el archivo por lotes o usarlo start /waitfuncionará, pero hay una advertencia.

Si el exe al que llama crea otro proceso, como llamar a otro exe, y luego sale, el archivo por lotes continuará procesándose después de que el exe llamado haya terminado, ya que no tiene conocimiento de otros procesos iniciados por él.

En su caso, este es un problema real porque los instaladores normalmente extraen archivos de alguna forma de contenedor comprimido, que puede estar incrustado en el propio exe, luego disparan uno de los archivos extraídos y salen. Algunos instaladores proporcionan parámetros de línea de comandos que le dicen al exe original que no salga hasta que se complete toda la instalación, por lo que es algo que quizás desee investigar. Aparte de eso, no hay una forma real de evitar esto con archivos por lotes solos y tomaría una solución programática para resolver.

John Gardeniers
fuente
Siempre puede agregar un bucle a la rutina de apagado para verificar si msiexec.exe (o lo que sea) se está ejecutando y luego esperar y repetir nuevamente.
mfinni
@mfinni, solo para complicar aún más las cosas, a msiexecmenudo también dispara otros procesos. :(
John Gardeniers
1
En realidad, ¿por qué lo necesitas start /wait? Yo mismo creía que era necesario usarlo start /waitpara bloquear el archivo por lotes hasta que finalice la aplicación GUI (como opuesta a una consola). Pero al probarlo ahora, veo que los archivos por lotes realmente esperan incluso las aplicaciones GUI. He publicado la pregunta correspondiente: ¿Por qué la aplicación GUI bloquea un archivo por lotes?
Martin Prikryl
Tuve este problema, agregué mi solución como respuesta.
FreeSoftwareServers
5

Aquí hay un ejemplo usando MATLAB! He asumido que la configuración de ruta para MATLAB está hecha y que el archivo FileName.m asegura la salida de MATLAB (o el usuario lo ha especificado internamente).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit
Rachit Kumar
fuente
2
Asumir que Matlab me parece un poco extraño, especialmente aquí en serverfault.
Erik
Esto puede funcionar para otras cosas que no sean MATLAB. Simplemente cambie "MATLAB.exe" a otra cosa. Y tal vez arregle ese segundo 'buscar' para buscar el exe nuevamente en la salida filtrada.
Oliver Bock
1

Tuve el problema que @John Gardeniers tenía o describió, donde mi exe llamó a otro exe y terminó, por lo tanto, start / wait no funcionó. Creé un "ciclo while" para verificar si se está ejecutando y luego seguir adelante una vez hecho. Los tiempos se pueden ajustar para satisfacer sus necesidades.

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN
FreeSoftwareServers
fuente
0

Puede usar el comando de inicio / espera. Esto inicia una aplicación y espera a que termine.

O si sabe cuánto tiempo lleva ejecutar, puede echar un vistazo al comando de suspensión, proporcionado por las herramientas del Kit de recursos de Windows Server 2003 . Sleep.exe se puede usar para pausar su lote por cualquier número de segundos para permitir que el programa se instale completamente antes de que el archivo por lotes continúe instalando cualquier otra cosa. Hay algunos programas que ignoran la sintaxis de "inicio / espera", debido a que el programa mismo está iniciando otro proceso, entonces el sleep.exe es muy útil.

Guido van Brakel
fuente