Как вы ждете, пока исполняемый файл завершится в командном файле?
Я пытаюсь создать скрипт для выполнения exe при завершении работы для установки sp1. Мой сценарий выглядит примерно так (не настоящий сценарий летучей мыши).
If installed GOTO END
Install.exe
END:
Моя проблема в том, что когда он запускается, он запускает установщик, а затем завершает сценарий, потому что установщик - это другой процесс, а затем завершает процесс установки, потому что компьютер выключается и выключает систему (по крайней мере, я так думаю это делает.)
Есть ли способ сказать ему, чтобы он дождался завершения процесса, а затем завершил работу?
6 ответов
Один короткий путь:
Install.exe|more
Также
install|rem
может быть использован, хотя с большим количеством в конечном итоге вы сможете поймать некоторый вывод консоли. И это причина того, что это работает - команда piped ожидает ввода, пока не завершится.exe
Либо вызов exe-файла непосредственно из командного файла, либо с помощью start /wait
будет работать, но есть оговорка.
Если exe-файл, который вы вызываете, создает другой процесс, например, вызывает другой exe-файл, а затем завершает работу, пакетный файл продолжит обработку после завершения вызываемого exe-файла, так как он не знает о других процессах, запущенных им.
В вашем случае это реальная проблема, потому что установщики обычно извлекают файлы из какой-либо формы сжатого контейнера, который может быть встроен в сам exe-файл, затем запускают один из извлеченных файлов и завершают работу. Некоторые установщики предоставляют параметры командной строки, которые говорят исходному файлу exe не выходить до тех пор, пока не будет завершена вся установка, так что вы, возможно, захотите это изучить. Кроме этого, нет никакого реального способа обойти это с помощью только пакетных файлов, и для его решения потребуется программное решение.
Вот пример использования 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
У меня была проблема @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, мне нужно было дождаться запуска программы, которая не была запущена командным файлом. Затем подождите несколько секунд, чтобы запустить программу, которая подключается к программе, которую я проверяю. Если вы хотите, чтобы время ожидания файла истекло после определенного количества проверок, вы можете использовать счетчик в цикле, чтобы ограничить количество циклов.
SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
TIMEOUT /T 3
goto LOOPSTART
:FOUND
TIMEOUT /T 15
START HOOKINGPROGRAM.exe
Первый TIMEOUT определяет, как часто цикл будет повторяться в поисках программы. Его можно изменить в соответствии с вашими потребностями.
Вы можете использовать команду start /wait. Это запускает приложение и ожидает его завершения.
Или, если вы знаете, сколько времени занимает выполнение, вы можете взглянуть на команду sleep, предоставляемую средствами Windows Server 2003 Resource Kit Tools. Sleep.exe может использоваться для приостановки пакета на любое количество секунд, чтобы позволить программе полностью установить программу, прежде чем пакетный файл продолжит установку чего-либо еще. Есть некоторые программы, которые игнорируют синтаксис "запуск / ожидание", так как сама программа запускает другой процесс, тогда sleep.exe очень полезен.