Приведу пример на основе калькулятора (WIN10) управление потоком исполнения происходит спомощью конструкции if-else
а так же комманды goto
с указанием метки для перехода (что-то типа аналога функций) каждая комманда которая предваряется @
не будет выводиться на экран
В данном случае название процесса и программы для запуска немного отличаются, поэтому пришлось захардкодить calc.exe
в start_app
.
А в первой строке set app=Calculator.exe
я задал имя процесса.
Если в %ERRORLEVEL%
будет не 0
то значит произошла ошибка и процесс не был найден среди запущенных.
set app=Calculator.exe
@tasklist /fi "ImageName eq %app%" /fo csv 2>NUL | find /I "%app%">NUL
@if "%ERRORLEVEL%"=="0" (goto restart_app) else (goto start_app)
:restart_app
@taskkill /f /im "%app%"
@timeout /t 1 /nobreak
@goto start_app
:start_app
@start "" "calc.exe"
@goto exit
:exit
Еще можно сделать универсальный скрипт, при условии что имена процесса и программы будут совпадать:
@tasklist /fi "ImageName eq %1" /fo csv 2>NUL | find /I "%1">NUL
@if "%ERRORLEVEL%"=="0" (goto restart_app) else (goto start_app)
:restart_app
@taskkill /f /im "%1"
@timeout /t 1 /nobreak
@goto start_app
:start_app
@start "" "%1"
@goto exit
:exit
Использовать его очень просто, можно дать подходящее имя скрипту (restarter.bat) и поместить в папку System32
или любой путь где система найдет. При запуске вторым параметром указываем программу например: restarter notepad.exe