Я пытаюсь создать сценарий для выполнения exe-файла при завершении работы, чтобы установить sp1. мой сценарий выглядит примерно так (не настоящий сценарий летучей мыши).
If installed GOTO END
Install.exe
END:
Моя проблема в том, что когда он запускается, он запускает установщик, затем завершает сценарий, потому что установщик - это другой процесс, а затем завершает процесс установки, потому что компьютер выключается и выключает систему (по крайней мере, я так думаю это делает.)
Есть ли способ сказать ему подождать, пока процесс, который он запустил, завершится, а затем завершиться?
Попробуйте бежать
START /WAIT Install.exe
Один более короткий путь:
Install.exe|more
Также
install|rem
можно было бы использовать, хотя со временем вы сможете поймать некоторый вывод консоли. И это причина, по которой он работает - команда по конвейеру ждет ввода, пока .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 и завершал работу, поэтому запуск / ожидание не работали. Я создал «цикл 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
Вы можете использовать команду start / wait. Это запускает приложение и ждет его завершения.
Или, если вы знаете, сколько времени требуется для выполнения, вы можете взглянуть на команду сна, предоставляемую Инструменты набора ресурсов Windows Server 2003 . Sleep.exe можно использовать для приостановки выполнения пакета на любое количество секунд, чтобы программа могла полностью установить, прежде чем пакетный файл продолжит установку чего-либо еще. Есть некоторые программы, которые игнорируют синтаксис "запуск / ожидание", поскольку программа сама запускает другой процесс, поэтому sleep.exe очень полезен.
Как и в случае с файлом @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 определяет, как часто цикл будет повторяться в поисках программы. Его можно изменить в соответствии с вашими потребностями.