Одним из решений является использование пакетного файла с бесконечным for
циклом для автоматического перезапуска приложения, если оно закрывается. Здесь есть две возможности, в зависимости от того, как разработано приложение.
Если приложение запускается и выполняется в том же процессе, вы можете использовать очень простой командный файл:
@echo off :Start C:\path\to\application.exe :: Wait 30 seconds before restarting. TIMEOUT /T 30 GOTO:Start
Это будет работать бесконечно. Каждый раз, когда application.exe
закрывается или падает, пакетный файл перезапустит его.
Это не будет работать, если application.exe
запускается, subapp.exe
а затем application.exe
закрывается. В этом случае вам нужно что-то более сложное.
@ECHO off SET _PollingInterval=30 :BatchStart C:\path\to\application.exe :Start :: Uncomment the following line on versions of Windows prior to Windows 7 and comment out the TIMEOUT line. The PING solution will not be 100% accurate with _PolingInterval. :: PING 127.0.0.1 -n %_PollingInterval% >nul TIMEOUT /T %_PollingInterval% SET PID= FOR /F "tokens=2 delims= " %%i IN ('TASKLIST ^| FIND /i "subapp.exe"') DO SET PID=%%i IF [%PID%]==[] ( ECHO Application was not running. Restarting script. GOTO BatchStart ) GOTO Start GOTO:EOF
Если ваше приложение может иметь различные процессы, то вы, вероятно, можете использовать что-то вроде FINDSTR /i "subapp.exe application.exe"
вместо FIND /i "subapp.exe"
, но это не будет работать для процессов с пробелами в их имени, так как FINDSTR
использует пространство в качестве разделителя.
Чтобы остановить эти командные файлы после их запуска, оставьте приложение открытым и переключитесь в командную строку. Затем используйте Ctrl+ Cи подтвердите, что вы хотите завершить скрипт. После завершения сценария закройте приложение.
Дальнейшее чтение:
- Тайм-аут - добавить задержку, также упоминает
PING
- Найти - поиск текста
- FindStr - поиск текста (более сложный, чем
FIND
) - Список задач - Показать все запущенные приложения и службы
- Escape-символы, разделители и кавычки -
^
символ в цикле for является escape-символом