Вопрос или проблема
У меня есть программа, которая может аварийно завершиться, и мне нужно запланировать задачу, которая будет перезапускать ее, когда программа больше не работает.
Проблема в том, что есть дублирующиеся имена процессов, поэтому я не могу просто на этом полагаться (вне моего целевого процесса могут быть запущены другие).
Я выяснил, что рассматриваемый процесс является дочерним процессом родителя explorer.exe. У меня есть следующий код, который должен справляться с ситуацией и идентифицировать правильное имя процесса, однако я могу выполнять только базовые задачи, такие как завершение процесса и т. д.
Как мне использовать приведенное ниже, но вместо последней строки этого кода для завершения процесса мне нужно проверить, запущен ли дочерний процесс, и, если нет, запустить программу из указанного пути.
@echo off
setlocal enabledelayedexpansion
set "ParentProcessName=explorer.exe"
set "ChildProcessName=myprocessname.exe"
set ParentProcessIdCount=0
for /f "usebackq tokens=2 delims==" %%A in (`wmic process where "name="%ParentProcessName%"" get processid /format:list`) do (
if "%%A" neq "" (
set /a ParentProcessIdCount+=1
set ParentProcessId!ParentProcessIdCount!=%%A
)
)
echo DEBUG: Найдено %ParentProcessIdCount% возможных родительских процессов.
if %ParentProcessIdCount% == 0 goto :eof
set "conditions=parentprocessid=%ParentProcessId1%"
for /l %%A in (2,1,%ParentProcessIdCount%) do (
set "conditions=!conditions! or parentprocessid=!ParentProcessId%%A!"
)
set "conditions=(%conditions%) and name="%ChildProcessName%""
wmic process where "%conditions%" call terminate
Я думаю, что попробовал все, что мог, с моими ограниченными знаниями.
Ответ или решение
Для решения вашей задачи нам нужно изменить ваш существующий скрипт, чтобы он проверял, запущен ли дочерний процесс, и если он не запущен, то запускал его. Мы будем использовать WMIC
для проверки наличия дочернего процесса и встроенную команду start
для его запуска.
Вот обновленный код, который выполняет требуемую функцию:
@echo off
setlocal enabledelayedexpansion
set "ParentProcessName=explorer.exe"
set "ChildProcessName=myprocessname.exe"
set "ChildProcessPath=C:\Path\To\Your\Process\myprocessname.exe" REM Укажите полный путь к вашему исполняемому файлу
set ParentProcessIdCount=0
for /f "usebackq tokens=2 delims==" %%A in (`wmic process where "name="%ParentProcessName%"" get processid /format:list`) do (
if "%%A" neq "" (
set /a ParentProcessIdCount+=1
set ParentProcessId!ParentProcessIdCount!=%%A
)
)
echo DEBUG: Найдено %ParentProcessIdCount% возможных родительских процессов.
if %ParentProcessIdCount% == 0 goto :eof
set "conditions=parentprocessid=%ParentProcessId1%"
for /l %%A in (2,1,%ParentProcessIdCount%) do (
set "conditions=!conditions! or parentprocessid=!ParentProcessId%%A!"
)
set "conditions=(%conditions%) and name="%ChildProcessName%""
REM Проверка, запущен ли дочерний процесс
for /f "tokens=*" %%P in (`wmic process where "%conditions%" get processid ^| findstr /r /v "^$"`) do (
set "isRunning=1"
)
if !isRunning! neq 1 (
echo Дочерний процесс не запущен, запускаем...
start "" "%ChildProcessPath%"
) else (
echo Дочерний процесс уже работает.
)
:end
exit /b
Объяснение кода:
-
Переменные: Мы задаем имена процессов и путь к исполняемому файлу вашего дочернего процесса.
-
Получение идентификаторов процессов: Мы используем
WMIC
, чтобы получить все идентификаторы родительских процессовexplorer.exe
и сохраняем их для дальнейшего использования. -
Сборка условия: Создаем строку условий на основе идентификаторов процессов, чтобы затем использовать её для выбора дочернего процесса.
-
Проверка состояния дочернего процесса: Выполняем запрос с использованием
WMIC
, чтобы проверить, запущен ли дочерний процесс. Если результат не пустой, это означает, что процесс запущен. -
Запуск процесса: Если дочерний процесс не запущен, мы запускаем его с помощью команды
start
. - Вывод информации: Скрипт выводит соответствующие сообщения, чтобы информировать пользователя о том, работает процесс или нет.
Запуск скрипта:
Сохраните этот код в файл с расширением .bat
и запускайте его по расписанию с помощью планировщика задач Windows, чтобы гарантировать, что программа всегда будет работать.
Убедитесь, что вы указали правильный путь к вашему исполняемому файлу, чтобы скрипт мог правильно его запустить.