Я согласен с Mofi, что решение реальной проблемы всегда лучше, чем обходить ее, но иногда это невозможно или требуется более быстрое решение.
Вместо пассивного ожидания до второго процессазаканчивается, просто активно смотришь.Если он больше не жив, перезапустите его.Таким образом, не имеет значения, как завершается / завершается / завершается второй процесс:
test1.bat
@echo off
:main
if exist MyCommand.flag goto :eof
start test2.bat
:wait
timeout 1 >nul
tasklist /fi "Windowtitle eq MyCommand"|find "cmd.exe" >nul || @goto :main
goto :wait
test2.bat
@echo off
title MyCommand
echo Hello World!
@pause
break>MyCommand.flag
Вам не нужно start cmd /c
, потому что только start
уже запускает новый процесс cmd.Присвойте процессу уникальный заголовок, чтобы вы могли проверить, работает ли он по-прежнему.
||
работает так: «если предыдущая команда (find
) завершается неудачно, то«
find
является необходимой,потому что tasklist
не предоставляет полезный уровень ошибки.
Примечание: вам также нужен метод для остановки, когда второй процесс завершает свою задачу.
Test2.bat
записывает пустой файл по завершении.Очевидно, что файл не будет создан, когда процесс завершится сбоем раньше (или будет принудительно завершен).
test1.bat
просто проверяет наличие файла перед перезапуском второго процесса.