Batch start no espera a que termine la instalación

Resuelto
adgm1 Mensajes publicados 306 Estado Miembro -  
brucine Mensajes publicados 24647 Fecha de registro   Estado Miembro Última intervención   -
Bonjour
tengo órdenes que lanzar en batch, la primera es el lanzamiento de un ejecutable para instalar un software y luego otras órdenes sirven para bloquear el firewall y copiar archivos.
Mi problema es que tengo que poner un timeout, de lo contrario el batch ejecuta inmediatamente las otras órdenes sin esperar el final de la instalación del software. Sin embargo, dependiendo del PC, el timeout puede ser más o menos preciso, a veces el PC es más lento de lo esperado para instalar, así que las órdenes siguientes se inician demasiado pronto. ¿Cómo forzar la espera después del comando start?

start V:\softwares\Prog.exe
timeout /t 260
netsh advfirewall firewall add rule name="Prog" program="C:\Program Files\Prog.exe" dir=out action=block profile=any
xcopy /s "\\serv\wpkg\softwares\Xx.ini" "%programfiles%\Prog\" /Y

8 respuestas

barnabe0057 Mensajes publicados 14431 Fecha de registro   Estado Colaborador Última intervención   4 930
 
Hola,

Intenta reemplazar el comando START por el comando CALL

O bien puedes añadir el conmutador /WAIT al comando START.

“La inteligencia artificial se define como lo contrario de la estupidez natural.”
0
adgm1 Mensajes publicados 306 Estado Miembro 10
 
la llamada ha funcionado bien
¡gracias!
0
adgm1 Mensajes publicados 306 Estado Miembro 10
 
Bonjour. Regreso a mi publicación porque veo un nuevo problema cuando desinstalo un programa con el comando wmic product where name="<NOMBRE DEL PROGRAMA AQUÍ>" call uninstall /nointeractive

el llamado funciona bien si quiero ejecutar un programa .exe por ejemplo y luego ejecutar otros comandos, espera bien el final del primero para desencadenar el siguiente.

Pero con wmic no hay forma, tengo que poner un retraso con timeout /t antes de la llamada, de lo contrario lanza inmediatamente el siguiente .bat. No hay problema entre dos comandos wmic, eso espera bien.

Aquí está mi batch;

wmic product where "name like 'application1'" call uninstall /nointeractive

wmic product where "name like 'application2'" call uninstall /nointeractive

timeout /t 300

call C:\install_app3.bat

¿Alguna idea?
0
brucine Mensajes publicados 24647 Fecha de registro   Estado Miembro Última intervención   4 141
 
Hola,

mientras espero que Barnabé, que es más competente que yo en este tema, pase por aquí, algunos comentarios.

Si el comando call no funciona como se desea dentro de wmic, se puede como se sugirió usar
START /WAIT, pero el comportamiento deseado se basa en CMD /C, es decir, al llamar a un archivo batch secundario para cada comando wmic:

https://ss64.com/nt/start.html

También podemos intentar canalizar la salida de wmic, basándonos en la lectura de sus códigos de salida, no creo que funcione, con algo así, pero bueno:


wmic product where "name like 'application1'" call uninstall /nointeractive && wmic product where "name like 'application2'" call uninstall /nointeractive && call :INSTALL

:INSTALL
C:\install_app3.bat


Después, y fuera de PowerShell que es más tolerante en este aspecto, se vuelve más complicado.

Aquí tenemos la solución con START /WAIT, otra en un bucle con una prueba SLEEP en función de ERRORLEVEL del nombre del proceso de desinstalación (que se debe identificar en el administrador de tareas) correspondiente al comando a terminar (es decir, para que lo esté, debe valer 1):

https://superuser.com/questions/1152521/how-do-i-make-a-batch-file-that-started-a-process-to-wait-for-the-process-to-ter

Lo mismo se puede obtener probando después de los 2 comandos wmic reales 2 otros que prueben la existencia del ProcessID del proceso de desinstalación; no es muy simple ya que este PID numérico debe obtenerse a partir del nombre del proceso:
https://www.developpez.net/forums/d1669516/general-developpement/programmation-systeme/windows/scripts-batch/recuperer-pid-d-processus-variable/
y luego verificar si este proceso sigue activo:
https://stackoverflow.com/questions/34590331/how-to-get-process-id-of-a-specific-process-using-wmic-and-check-on-error

Las otras soluciones también pasan por probar si la tarea o el proceso lanzado por el comando wmic sigue activo:

Ver aquí en 26, 2 y 1: https://stackoverflow.com/questions/8177695/how-to-wait-for-a-process-to-terminate-to-execute-another-process-in-batch-file

Debemos a Dave Benham, un mago indiscutible en este caso, un batch complejo que prueba en bucle la existencia de un archivo de bloqueo que desaparece cuando el programa ha terminado:

https://www.dostips.com/forum/viewtopic.php?p=18477
0
barnabe0057 Mensajes publicados 14431 Fecha de registro   Estado Colaborador Última intervención   4 930
 
Hola adgm1, hola brucine,

brucine (que es tan competente como yo :-p) ha explorado el tema y ha dado pistas muy interesantes.

Habiendo realizado yo mismo una prueba con el comando wmic product call uninstall para desinstalar LibreOffice, me parece extraño que tu script continúe como si nada, mientras que en mi caso el comando espera (varias minutos) que la desinstalación esté completamente terminada para devolverme el control.

Si realmente quieres asegurarte de que el comando esté terminado antes de pasar a la siguiente parte, podrías agregar algunas líneas como estas:

wmic product where "name like 'application1'" call uninstall /nointeractive wmic product where "name like 'application2'" call uninstall /nointeractive :temporizacion timeout /t 1 /nobreak tasklist | findstr /i "wmic.exe" >nul && goto :temporizacion call C:\install_app3.bat 


--

“La inteligencia artificial se define como lo contrario de la estupidez natural.”
0
adgm1 Mensajes publicados 306 Estado Miembro 10
 
Gracias por sus respuestas. Es un programa de Office que quiero desinstalar previamente y luego instalar una versión de Office x64. Sin desinstalar la x32 me dice "no podemos instalar la versión de 64 bits porque hemos detectado una versión de 32 bits..."

No ha funcionado con la línea de temporización, supongo que el wmic.exe busca en la "tasklist" el programa de desinstalación, ¿verdad? Porque lo que aparece en el administrador de tareas es microsoft setup bootstrapper (32 bits). Presumo que hay que reemplazar wmic por esto en el script para indicarle que temporice mientras este bootstrapper esté activo para terminar la desinstalación.

La versión del script con el && call :INSTALL tampoco ha funcionado.
0
adgm1 Mensajes publicados 306 Estado Miembro 10
 
BINGO !! ¡Funcionó modificando la parte de temporización de la siguiente manera:

:temporización
timeout /t 3 /nobreak
tasklist | findstr /i "Microsoft Setup Bootstrapper (32bits)" >nul && goto :temporización

Puse 3 segundos de retraso para limitar todas las líneas que se superponen. De hecho, ¿hay alguna forma de evitar que las líneas se agreguen a medida que la temporización avanza? Por ejemplo, haciendo algo como "clear screen" para que no se acumulen líneas en la ventana de MSDOS, ya que la desinstalación es bastante larga.
0
barnabe0057 Mensajes publicados 14431 Fecha de registro   Estado Colaborador Última intervención   4 930
 
¡Bien hecho!

Con respecto a las líneas que se añaden, puedes redirigir la salida del comando TIMEOUT:
timeout /t 3 /nobreak >nul
0
adgm1 Mensajes publicados 306 Estado Miembro 10
 
hablé demasiado rápido, en realidad no funcionó, es extraño, el batch sigue en un bucle buscando el programa en el administrador de tareas pero no logra encontrarlo ni cerrarlo para continuar. La única vez que funcionó, tuve que hacer algo manualmente, pero ahora ya no funciona
¿Alguna idea?
0
barnabe0057 Mensajes publicados 14431 Fecha de registro   Estado Colaborador Última intervención   4 930
 
¿De qué versión de Office se trata? ¿2013, 2016, 2019, 2021?
0
adgm1 Mensajes publicados 306 Estado Miembro 10
 
es Office 2007. También he notado que durante la desinstalación se ejecuta una tarea msiexec.exe. Intenté reemplazar el bootstrapper por msiexec, pero ahora tengo un problema de reinicio de la computadora al final de la desinstalación de Office 2007.
0
brucine Mensajes publicados 24647 Fecha de registro   Estado Miembro Última intervención   4 141
 
Hola,

Bootstrapper solo verifica que msi.exec existe para continuar la desinstalación; en estas condiciones, probablemente no sea Bootstrapper lo que haya que temporizar, sino el siguiente proceso correspondiente a msi.exec.

No he hecho esto desde hace un tiempo, no veo razón para ello, pero nunca se sabe, no recuerdo (probar fuera del script) si la desinstalación de Office 2007 sugiere (o impone) el reinicio.
0