Como você espera que um exe seja concluído no arquivo em lotes?

43

Estou tentando criar um script para executar um exe no desligamento para instalar o sp1. meu script é algo como (não é um script real).

If installed GOTO END
    Install.exe
END:

Meu problema é que, quando executado, ele inicia o instalador e termina o script porque o instalador é um processo diferente e segue encerrando o processo de instalação porque o computador está desligando e desligando o sistema (pelo menos, é o que eu acho está fazendo.)

Existe alguma maneira de esperar que o processo iniciado seja concluído e depois desligá-lo?

Kravlin
fonte

Respostas:

81

Tente correr

START /WAIT Install.exe
Bart De Vos
fonte
ótimo trabalho com esta resposta!
l
Você pode cadeia? like start /wait install; exit?
Serj Sagan
você sempre pode fazercmd /C start /wait install
graywolf
E se você precisar esperar por um processo em que o arquivo em lotes não foi iniciado?
Kyle Delaney
23

Uma maneira mais curta:

Install.exe|more

Além disso

install|rem

pode ser usado, embora com mais eventualmente você consiga capturar alguma saída do console. E é por isso que funciona - o comando canalizado aguarda a entrada até que o .exe seja concluído

npocmaka
fonte
e por que o downlvote?
Npocmaka 22/10/2015
Isto e excelente! Eu voto em você.
Changwang Zhang 25/11
2
este claramente ganha
Fnord
e se o exe aceita parâmetros? como isso funcionaria?
m4l490n 04/02
@ m4l490n - funcionará ok. Os operadores de redirecionamento e execução condicional tem a prioridade mais elevada nos scripts de comandos ( <, >, >>, &, &&, ||, |)
npocmaka
13

Chamar o exe diretamente do arquivo em lotes ou usar start /waitfuncionará, mas há uma ressalva.

Se o exe que você chama criar outro processo, como chamar outro exe e sair do arquivo em lotes, o processamento continuará após o término do exe chamado, pois não tem conhecimento de outros processos iniciados por ele.

No seu caso, esse é um problema real, porque os instaladores normalmente extraem arquivos de alguma forma de contêiner compactado, que pode ser incorporado no próprio exe, dispara um dos arquivos extraídos e sai. Alguns instaladores fornecem parâmetros de linha de comando que informam ao exe original para não sair até que toda a instalação esteja concluída, então é algo que você pode querer investigar. Fora isso, não há uma maneira real de contornar isso apenas com arquivos em lotes e seria necessário uma solução programática para resolver.

John Gardeniers
fonte
Você sempre pode adicionar um loop à rotina de desligamento para verificar se o msiexec.exe (ou o que diabos é) está sendo executado e, em seguida, aguarde e faça o loop novamente.
M11
@mfinni, apenas para complicar ainda mais, msiexecmuitas vezes também dispara outros processos. :(
John Gardeniers 10/03
1
Na verdade, por que você precisa start /wait? Eu mesmo acreditava que é necessário para usar start /waita arquivo de bloco lote até GUI (como oposto a um console) de aplicação acabamentos. Mas testando-o agora, vejo que os arquivos em lote realmente esperam até pelos aplicativos da GUI. Eu postei a pergunta correspondente: Por que o aplicativo GUI bloqueia um arquivo em lotes?
Martin Prikryl 15/10
Eu tive esse problema, adicionei minha solução como resposta.
FreeSoftwareServers
5

Aqui está um exemplo usando o MATLAB! Eu assumi que a configuração do caminho para o MATLAB está concluída e a saída do MATLAB está sendo assegurada pelo arquivo FileName.m (ou o usuário a especificou 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
fonte
2
Supondo que o Matlab me pareça um pouco estranho, especialmente aqui em serverfault.
Erik
Isso pode funcionar para outras coisas além do MATLAB. Basta alterar "MATLAB.exe" para outra coisa. E talvez conserte esse segundo 'achado' para procurar o exe novamente na saída filtrada.
Oliver Bock
1

Eu tive o problema que John Gardeniers tinha ou descreveu, onde meu exe chamou outro exe e terminou, portanto o início / espera não funcionou. Eu criei um "loop while" para verificar se está em execução e depois seguir em frente quando terminar. Os horários podem ser ajustados para atender às suas necessidades.

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
fonte
0

Você pode usar o comando start / wait. Isso inicia um aplicativo e aguarda o término.

Ou, se você souber quanto tempo leva para executar, consulte o comando de suspensão, fornecido pelas Ferramentas do Windows Server 2003 Resource Kit . Sleep.exe pode ser usado para pausar seu lote por qualquer número de segundos para permitir que o programa seja instalado completamente antes que o arquivo em lote continue instalando qualquer outra coisa. Existem alguns programas que ignoram a sintaxe "iniciar / esperar", devido ao próprio programa iniciar outro processo, o sleep.exe é muito útil.

Guido van Brakel
fonte