Пакетная программа для проверки, если процесс существует
Я хочу пакетную программу, которая будет проверять, если процесс 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