У меня есть пакетный сценарий Windows, который запускает исполняемую программу в al oop, и в зависимости от кода выхода он должен подождать 10 секунд перед перезапуском исполняемого файла. Это отлично работает, если я завершаю исполняемый файл с помощью диспетчера задач, но не работает в других случаях.
Пакетный сценарий выглядит следующим образом:
@ECHO OFF
.\timeout.exe 1
SET myprogramcmdversion=3
SET MYPROGRAM_RUN_CMD=.\MyProgramExe.exe
ECHO %date% %time% myprogram.cmd Batch file start, version %myprogramcmdversion% >> Logs\myprogram_cmd.txt
:loop_start
ECHO %date% %time% myprogram.cmd Start program loop >> Logs\myprogram_cmd.txt
START /WAIT /B %MYPROGRAM_RUN_CMD%
ECHO %date% %time% myprogram.cmd Exit code: %errorlevel% >> Logs\myprogram_cmd.txt
:: MyProgramExe uses exit codes 20000 - 20999 or 0, anything else is a Windows exit code.
:: The 1 in front of each operand handles the case where %errorlevel% is undefined
IF /I 1%errorlevel% GEQ 120000 (
IF /I 1%errorlevel% LEQ 120999 (
GOTO loop_continue
)
)
IF /I "%errorlevel%" NEQ "0" (
ECHO %date% %time% myprogram.cmd Unhandled exit code, waiting 10 seconds before restarting MyProgramExe >> Logs\myprogram_cmd.txt
.\timeout.exe 10
)
:loop_continue
:: Exit code 20999 can be used by MyProgramExe to stop the launcher loop.
IF /I "%errorlevel%" NEQ "20999" GOTO loop_start
:loop_exit
ECHO %date% %time% myprogram.cmd Batch file stop >> Logs\myprogram_cmd.txt
Если код выхода MyProgramExe.exe
- это что угодно кроме 20000 - 20999 или 0, timeout.exe
должен задержать следующую итерацию на 10 секунд. Обратите внимание, что я скопировал системный timeout.exe
в локальный каталог после того, как прочитал, что иногда он может выйти из строя, если запустить его просто с помощью timeout
«команды». Но, по-видимому, иногда это все равно не удается.
При просмотре файлов журнала я заметил, что машина была перезапущена из-за обновления 14 мая, и в этот момент MyProgramExe.exe
был прерван с помощью «unhandled "код выхода, но все равно не было задержки до следующего запуска.
2020-05-14 0:33:01,56 myprogram.cmd Exit code: 1073807364
2020-05-14 0:33:01,58 myprogram.cmd Unhandled exit code, waiting 10 seconds before restarting MyProgramExe
2020-05-14 0:33:01,61 myprogram.cmd Start program loop
2020-05-14 0:33:01,90 myprogram.cmd Exit code: -1073741205
2020-05-14 0:33:01,92 myprogram.cmd Unhandled exit code, waiting 10 seconds before restarting MyProgramExe
2020-05-14 0:33:01,93 myprogram.cmd Start program loop
2020-05-14 0:33:01,95 myprogram.cmd Exit code: -1073741205
2020-05-14 0:33:01,95 myprogram.cmd Unhandled exit code, waiting 10 seconds before restarting MyProgramExe
2020-05-14 0:33:01,97 myprogram.cmd Start program loop
2020-05-14 0:33:01,98 myprogram.cmd Exit code: -1073741205
2020-05-14 0:34:28,14 myprogram.cmd Batch file start, version 3
2020-05-14 0:34:28,16 myprogram.cmd Start program loop
Глядя в системный журнал Windows, кажется, что User32
инициировал перезагрузку с 00:33:01
. В этот момент средство запуска пакетных файлов l oop перезапускает исполняемый файл 3 раза без задержки.
С другой стороны, если я использую диспетчер задач для завершения MyProgramExe.exe
, он работает, как ожидалось ( обратите внимание на разницу во времени, 14:25:16
- 14:25:26
):
2020-05-25 14:25:16,71 myprogram.cmd Exit code: 1
2020-05-25 14:25:16,72 myprogram.cmd Unhandled exit code, waiting 10 seconds before restarting MyProgramExe
2020-05-25 14:25:26,11 myprogram.cmd Start program loop
Моя теория состоит в том, что запуск timeout.exe
предотвращен системой, потому что она находится в процессе завершения работы и перезагрузки, может ли это быть так?