【问题标题】:Batch program to to check if process exists检查进程是否存在的批处理程序
【发布时间】:2013-03-05 03:34:41
【问题描述】:

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

如果notepad.exe存在,则结束进程,

否则批处理程序将自行关闭。

这是我所做的:

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

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

【问题讨论】:

  • 为什么不验证任务是否存在就直接调用taskkill
  • taskkill 不会改变我的错误级别...
  • @Andriy M 我想检查进程是否存在。然后结束进程或关闭自身。
  • 无论是否找到并杀死图像,您的脚本似乎都会自行关闭。

标签: windows batch-file command cmd


【解决方案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 found1 用于 @987654329 @

尽管如此,

taskkill /f /im "notepad.exe"

如果存在记事本任务,它将杀死它 - 如果不存在记事本任务,它什么也做不了,所以你真的不需要测试 - 除非你想做其他事情......也许

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

这似乎按照您的要求进行 - 如果记事本进程存在,则终止它,然后退出 - 否则继续批处理

【讨论】:

  • 与其检查if errorlevel,还可以使用conditional execution进一步简化。
  • 也许find "notepad.exe" 更好,因为输出已翻译,我们无法确定: 是否出现在所有语言中。
【解决方案2】:

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

【讨论】:

  • 我发现如果图像名称,包括文件扩展名,超过25个字符,任务列表输出中的“图像名称”列将被截断,这使得带有图像名称的“查找”命令没有'不工作。但是,仅通过“:”字符来检测似乎过于松散,恐怕在未来版本的正输出中可能会发生。还有其他更好的方法吗?
  • @Elliott:如果将可执行文件的名称存储在变量中,则可以使用 tasklist 中的整个值,并且仅使用 find 中的前 25 个字符:tasklist /fi "imagename eq %imgname%" | find /i "%imgname:~0,25%" > nul
  • taskkill 仅在使用 /F 时才更改其退出代码,我只是使用暂停的进程进行测试,然后在没有 /f 的情况下运行 taskkill,我得到了SUCCESS: Sent termination signal to the process with PID 30564。退出代码始终为 0 。 win7 64
  • @BadrElmers:消息表明 taskkill 以退出代码 0 结束(因为它是成功的)。如果向进程发送终止信号时出现问题,则退出代码会有所不同。特别是,尝试在不存在的进程上使用不带 /f 的 taskkill 并检查退出代码。在我的情况下,退出代码仍然满足if errorlevel 128 条件(Win7 x64)。
【解决方案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

【讨论】:

    【解决方案4】:

    这是一个单线解决方案

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

    【讨论】:

    • 对我来说它适用于 Windows 10,我在多个脚本中使用它。
    • 也许我错过了什么
    • 如果进程没有运行,errorlevel 仍然为 0,这也很好。
    【解决方案5】:

    这就是为什么它不工作的原因,因为您编写了一些不正确的代码,这就是为什么它总是退出并且脚本执行器会将其读取为不可操作的批处理文件,从而阻止它退出和停止 所以应该是

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多