Как вы ждете, пока исполняемый файл завершится в командном файле?

43

Я пытаюсь создать скрипт для выполнения exe при завершении работы для установки sp1. Мой сценарий выглядит примерно так (не настоящий сценарий летучей мыши).

If installed GOTO END
    Install.exe
END:

Моя проблема в том, что когда он запускается, он запускает установщик, а затем завершает сценарий, потому что установщик - это другой процесс, а затем завершает процесс установки, потому что компьютер выключается и выключает систему (по крайней мере, я так думаю это делает.)

Есть ли способ сказать ему, чтобы он дождался завершения процесса, а затем завершил работу?

Kravlin
источник

Ответы:

81

Попробуйте запустить

START /WAIT Install.exe
Барт Де Вос
источник
отличная работа с этим ответом!
l --''''''--------- '' '' '' '' '' ''
Можете ли вы цепи? like start /wait install; exit?
Серж Саган
Вы всегда можете сделатьcmd /C start /wait install
Graywolf
Что если вам нужно подождать, пока не запустится пакетный файл?
Кайл Делани
23

Один короткий путь:

Install.exe|more

Также

install|rem

может быть использован, хотя с большим количеством в конечном итоге вы сможете поймать некоторый вывод консоли. И это причина того, что это работает - команда piped ожидает ввода, пока не завершится .exe

npocmaka
источник
а почему это даунлвот?
npocmaka
Это отлично! Я голосую за тебя.
Чангванг Чжан
2
это явно выигрывает
Fnord
Что делать, если exe принимает параметры? как это будет работать?
m4l490n
@ m4l490n - все будет нормально. Перенаправление и условное выполнение операторы имеют более высокий приоритет в пакетных сценариев ( <, >, >>, &, &&, ||, |)
npocmaka
13

Либо вызов exe-файла непосредственно из командного файла, либо использование start /waitбудет работать, но есть предостережение.

Если exe-файл, который вы вызываете, создает другой процесс, например, вызывает другой exe-файл, а затем завершает работу, пакетный файл продолжит обработку после завершения вызываемого exe-файла, так как он не знает о других процессах, запущенных им.

В вашем случае это реальная проблема, потому что установщики обычно извлекают файлы из какой-либо формы сжатого контейнера, который может быть встроен в сам exe-файл, затем запускают один из извлеченных файлов и завершают работу. Некоторые установщики предоставляют параметры командной строки, которые говорят исходному файлу exe не выходить до тех пор, пока не будет завершена вся установка, так что это то, что вы, возможно, захотите исследовать. Кроме этого, нет никакого реального способа обойти это с помощью только пакетных файлов, и для его решения потребуется программное решение.

Джон Гарденье
источник
Вы всегда можете добавить цикл к процедуре завершения работы, чтобы проверить, запущен ли msiexec.exe (или что там еще), а затем подождать и снова выполнить цикл.
Мфинни
@mfinni, просто чтобы еще больше усложнить ситуацию, msiexecчасто запускает и другие процессы. :(
Джон Гарденье
1
Собственно, зачем тебе start /waitвообще? Я сам полагал, что это необходимо использовать start /waitдля блокировки пакетного файла, пока приложение GUI (в отличие от консоли) не завершит работу. Но тестируя его сейчас, я вижу, что пакетные файлы действительно ждут даже приложений с графическим интерфейсом. Я разместил соответствующий вопрос: почему приложение GUI блокирует пакетный файл?
Мартин Прикрыл
У меня была эта проблема, добавил свое решение в качестве ответа.
FreeSoftwareServers
5

Вот пример использования MATLAB! Я предположил, что настройка пути для MATLAB выполнена, и выход из MATLAB обеспечивается файлом FileName.m (или пользователь указал его внутренне).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit
Рачит Кумар
источник
2
Предположение, что Matlab кажется мне немного странным, особенно здесь, на сервере.
Эрик
Это может работать для других вещей, кроме MATLAB. Просто измените "MATLAB.exe" на что-то другое. И, возможно, исправьте это второе «find» для повторного поиска exe в отфильтрованном выводе.
Оливер Бок
1

У меня была проблема @John Gardeniers Если бы я описал, где мой exe вызвал другого exe и закончил, поэтому start / wait не сработало. Я создал «цикл while», чтобы проверить, работает ли он, а затем продолжил, как только закончил. Время может быть изменено в соответствии с вашими потребностями.

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
источник
0

Вы можете использовать команду start / wait. Это запускает приложение и ожидает его завершения.

Или, если вы знаете, сколько времени занимает выполнение, вы можете взглянуть на команду sleep, предоставляемую средствами Windows Server 2003 Resource Kit Tools . Sleep.exe может использоваться для приостановки пакета на любое количество секунд, чтобы позволить программе полностью установить программу, прежде чем пакетный файл продолжит установку чего-либо еще. Есть некоторые программы, которые игнорируют синтаксис «запуск / ожидание», так как сама программа запускает другой процесс, тогда sleep.exe очень полезен.

Гидо ван Бракель
источник