2013-03-16 4 views
24

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

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

еще пакетная программа будет закрывать себя.

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

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

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

+1

Почему вы не вызываете 'taskkill', не проверяя, существует ли задача? –

+2

'taskkill' не меняет errorlevel для меня ... – user2033427

+0

@Andriy M Я хочу проверить, существует ли процесс. затем завершите процесс или закройте себя. – user2176930

ответ

41

TASKLIST не устанавливает errorlevel.

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

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

Тем не менее,

Taskkill/ж/им «notepad.exe»

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

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

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

+4

Вместо проверки 'if errorlevel' это может быть еще более упрощено с [условным исполнением] (http://www.robvanderwoude.com/condexec.php). – rojo

+2

Возможно, лучше «найти» notepad.exe «', поскольку вывод переведен, и мы не можем быть уверены, что ':' отображается на всех языках. –

8

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 
+0

Я нашел, если имя изображения включает расширение файла, более 25 символов, столбец «Название изображения» в выводе списка задач будет усечен, что делает команду «find» с именем изображения не работает. Однако обнаружение только символом «:» кажется слишком свободным, я боюсь, что это может произойти в позитивном выпуске будущих версий. Есть ли другой лучший способ сделать это? – Elliott

+1

@Elliott: Если вы сохраняете имя исполняемого файла в переменной, вы можете использовать все значение в 'tasklist' и только первые 25 символов в' find': 'tasklist/fi 'imagename eq% imgname%" | find/i "% imgname: ~ 0,25%"> nul' –

+0

Большое спасибо! :) – Elliott

-3

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

@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 
11

Это решение одна линия.

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

не работает для меня –

+1

для меня это работает в Windows 10, я использую его в нескольких сценариях. – nicovota

+0

Возможно, я пропустил что-то –

-1

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

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 
0
QPROCESS "myprocess.exe">NUL 
IF %ERRORLEVEL% EQU 0 ECHO "Process running" 

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

Смежные вопросы