Пакетная программа для проверки того, существует ли процесс

Мне нужна пакетная программа, которая проверит, существует ли процесс notepad.exe.

, если notepad.exe существует, он завершит процесс,

else пакетная программа закроется.

Вот что я сделал:

@echo off
tasklist /fi "imagename eq notepad.exe" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"
exit

Но это не сработает. Что случилось в моем коде?

Ответ 1

TASKLIST не устанавливает уровень ошибок.

echo off
tasklist /fi "imagename eq notepad.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"
exit

должен выполнить задание, так как ":" должен появиться в выводе TASKLIST только в том случае, если задача НЕ найдена, поэтому FIND установит для уровня ошибок 0 для not found и 1 для found

Тем не менее,

taskkill/f/im "notepad.exe"

убьет задачу блокнота, если она существует - она ​​ничего не может сделать, если не существует задачи с записью, поэтому вам не нужно тестировать - если только что-то еще вы не хотите делать... например,

echo off
tasklist /fi "imagename eq notepad.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"&exit

который будет выглядеть так, как вы просите, - убить процесс блокнота, если он существует, а затем выйти - в противном случае продолжить с пакетом

Ответ 2

Это однострочное решение.

Он запустит taskkill только в том случае, если процесс действительно запущен, иначе он просто проинформирует, что он не работает.

tasklist | find /i "notepad.exe" && taskkill /im notepad.exe /F || echo process "notepad.exe" not running.

Это результат в том случае, если процесс выполнялся:

notepad.exe           1960 Console                   0    112,260 K
SUCCESS: The process "notepad.exe" with PID 1960 has been terminated.

Это результат в случае отсутствия:

process "notepad.exe" not running.

Ответ 3

TASKLIST не устанавливает код выхода, который вы можете проверить в пакетном файле. Одним из способов обхода кода выхода может быть анализ его стандартного вывода (который вы в настоящее время перенаправляете на NUL). По-видимому, если процесс найден, TASKLIST отобразит его данные, в том числе и имя изображения. Поэтому вы можете просто использовать FIND или FINDSTR, чтобы проверить, содержит ли вывод TASKLIST имя, указанное вами в запросе. Оба FIND и FINDSTR устанавливают ненулевой код выхода, если поиск не увенчался успехом. Итак, это сработает:

@echo off
tasklist /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul
if not errorlevel 1 (taskkill /f /im "notepad.exe") else (
  specific commands to perform if the process was not found
)
exit

Существует также альтернатива, которая вообще не включает TASKLIST. В отличие от TASKLIST, TASKKILL устанавливает код выхода. В частности, если он не может завершить процесс, потому что он просто не существует, он установит код выхода из 128. Вы можете проверить, что этот код выполняет ваши конкретные действия, которые могут потребоваться для выполнения в случае, если указанный процесс не существует:

@echo off
taskkill /f /im "notepad.exe" > nul
if errorlevel 128 (
  specific commands to perform if the process
  was not terminated because it was not found
)
exit

Ответ 4

QPROCESS "myprocess.exe">NUL
IF %ERRORLEVEL% EQU 0 ECHO "Process running"

Приведенный выше код был протестирован в Windows 7 с пользователем с настройками администратора.

Ответ 5

Вот почему он не работает, потому что вы кодируете что-то неправильное, поэтому он всегда выходит и script executer будет читать его как нерабочий пакетный файл, который не позволяет ему выйти и остановить поэтому он должен быть

tasklist /fi "IMAGENAME eq Notepad.exe" 2>NUL | find /I /N "Notepad.exe">NUL
if "%ERRORLEVEL%"=="0" (
msg * Program is running
goto Exit
)
else if "%ERRORLEVEL%"=="1" (
msg * Program is not running
goto Exit
)

а не

@echo off
tasklist /fi "imagename eq notepad.exe" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"
exit

Ответ 6

Попробуйте следующее:

@echo off
set run=
tasklist /fi "imagename eq notepad.exe" | find ":" > nul
if errorlevel 1 set run=yes
if "%run%"=="yes" echo notepad is running
if "%run%"=="" echo notepad is not running
pause