用于检查进程是否存在的批处理程序

时间:2013-03-16 12:04:48

标签: windows batch-file command cmd

我想要一个批处理程序,它将检查进程notepad.exe是否存在。

如果 notepad.exe存在,它将结束该过程,

其他批处理程序将自行关闭。

以下是我所做的:

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

但它不起作用。我的代码有什么问题?

5 个答案:

答案 0 :(得分:50)

TASKLIST未设置errorlevel。

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

这似乎就像你要求的那样 - 如果它存在则杀死记事本进程,然后退出 - 否则继续批处理

答案 1 :(得分:14)

这是单行解决方案

只有在进程真正运行时它才会运行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.

答案 2 :(得分:8)

TASKLIST未设置您可以在批处理文件中检查的退出代码。检查退出代码的一种解决方法是解析其标准输出(您目前将其重定向到NUL)。显然,如果找到该过程,TASKLIST将显示其详细信息,其中也包括图像名称。因此,您可以使用FINDFINDSTR来检查TASKLIST的输出是否包含您在请求中指定的名称。如果搜索不成功,FINDFINDSTR都会设置非空退出代码。所以,这可行:

@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

答案 3 :(得分:2)

这就是为什么它不起作用,因为你编写了一些不正确的东西,这就是为什么它总是退出并且脚本执行器会把它读作不可操作的批处理文件,阻止它退出和停止 所以一定是

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

答案 4 :(得分:-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