Лучшим решением было бы связаться с автором a.exe
и попросить опцию автоматического выхода из a.exe
после запуска приложения b.exe
как отдельного и отдельного процесса.
Вторым лучшим решением было бы выяснить, какая среда b.exe
должна успешно работать, и создать с помощью пакетного файла эту среду и запустить b.exe
.
Однако, если два лучших решения по какой-либо причине не возможны, будет полезен следующий код пакетного файла.
@echo off
start "" /D"C:\Program Files\a.exe folder" "a.exe"
set "LoopCount=0"
:Loop
%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul
%SystemRoot%\System32\tasklist.exe /NH | %SystemRoot%\System32\findstr.exe /B /C:"b.exe" /C:"c.exe" /C:"d.exe" >nul
if not errorlevel 1 (
%SystemRoot%\System32\taskkill.exe /IM "a.exe"
goto EndBatch
)
%SystemRoot%\System32\tasklist.exe /NH | %SystemRoot%\System32\findstr.exe /B /C:"a.exe"
if errorlevel 1 goto EndBatch
set /A LoopCount+=1
if not %LoopCount% == 60 goto Loop
:EndBatch
set "LoopCount="
Пакетный файл сначала запускается a.exe
с каталогом программных файлов, установленным в качестве текущего каталога, а затем запускается как отдельный процесс.
Командный процессор Windows немедленно продолжает выполнение командного файла после запуска a.exe
и определяет следующую переменную среды LoopCount
со значением 0
.
Внутри цикла внешняя команда TIMEOUT доступна, поскольку Windows Vista по умолчанию используется для ожидания одной секунды.
Затем выполняется внешняя команда TASKLIST для вывода всех запущенных процессов без заголовка. Эти выходные данные перенаправляются с помощью |
на внешнюю команду FINDSTR , которая ищет с учетом регистра в начале всех строк, выведенных с помощью TASKLIST для одной из строк, указанных с помощью опция /C:
. Для поиска без учета регистра дополнительно используйте FINDSTR параметр /I
, если вы не знаете, как исполняемые файлы, запускаемые с a.exe
, находятся в списке вывода с помощью TASKLIST .
FINDSTR завершается со значением 0
, обнаружив хотя бы одну строку, начинающуюся с одной из найденных строк и со значением 1
, если ничего не найдено. Вывод FINDSTR не представляет интереса и поэтому перенаправляется на устройство NUL .
Сигнал завершения отправляется внешней командой TASKKILL исполняемому файлу a.exe
при обнаружении одного из процессов в списке. a.exe
должен завершиться при получении и обработке этого сигнала. В случае, если a.exe
игнорирует этот сигнал или он завершается, но перед завершением также запускается приложение, необходимо дополнительно использовать опцию TASKKILL /F
, чтобы вызвать реальное уничтожение a.exe
процесс в операционной системе Windows. Как правило, параметр /F
не следует использовать, поскольку он может привести к повреждению файлов в случае, если приложение, убитое операционной системой, имеет один или несколько файлов, открытых для операций записи.
Но если через одну секунду ни один из процессов, запущенных с помощью a.exe
, не будет запущен, пакетный файл проверяет, если все еще работает a.exe
. Пакетный файл завершается, если это не так. В противном случае он увеличивает переменную среды LoopCount
и сравнивает ее значение с 60
для выхода из пакетного файла после ожидания уже 60 секунд с проверками, чтобы избежать почти бесконечного запуска пакетного файла.
Чтобы понять используемые команды и то, как они работают, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки, отображаемые для каждой команды.
echo /?
findstr /?
goto /?
if /?
set /?
start /?
taskkill /?
tasklist /?
timeout /?
См. Также статью Microsoft о Использование операторов перенаправления команд .