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

Я хочу пакетную программу, которая будет проверять, если процесс notepad.exe существует.

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

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

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

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

Но это не работает. Что не так в моем коде?

5 ответов

Решение

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

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

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

Он запустит 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.

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

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

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

Попробуй это:

@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
Другие вопросы по тегам