Проверьте, работает ли дочерний процесс; если нет, запустите программу.

Вопрос или проблема

У меня есть программа, которая может аварийно завершиться, и мне нужно запланировать задачу, которая будет перезапускать ее, когда программа больше не работает.

Проблема в том, что есть дублирующиеся имена процессов, поэтому я не могу просто на этом полагаться (вне моего целевого процесса могут быть запущены другие).

Я выяснил, что рассматриваемый процесс является дочерним процессом родителя 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

Объяснение кода:

  1. Переменные: Мы задаем имена процессов и путь к исполняемому файлу вашего дочернего процесса.

  2. Получение идентификаторов процессов: Мы используем WMIC, чтобы получить все идентификаторы родительских процессов explorer.exe и сохраняем их для дальнейшего использования.

  3. Сборка условия: Создаем строку условий на основе идентификаторов процессов, чтобы затем использовать её для выбора дочернего процесса.

  4. Проверка состояния дочернего процесса: Выполняем запрос с использованием WMIC, чтобы проверить, запущен ли дочерний процесс. Если результат не пустой, это означает, что процесс запущен.

  5. Запуск процесса: Если дочерний процесс не запущен, мы запускаем его с помощью команды start.

  6. Вывод информации: Скрипт выводит соответствующие сообщения, чтобы информировать пользователя о том, работает процесс или нет.

Запуск скрипта:

Сохраните этот код в файл с расширением .bat и запускайте его по расписанию с помощью планировщика задач Windows, чтобы гарантировать, что программа всегда будет работать.

Убедитесь, что вы указали правильный путь к вашему исполняемому файлу, чтобы скрипт мог правильно его запустить.

Оцените материал
Добавить комментарий

Капча загружается...