如何检查命名程序是否正在批处理脚本中运行?

时间:2020-05-25 16:19:27

标签: windows batch-file cmd tasklist

由于某种原因,即使程序未打开,即使我输入了诸如“ asdfsd”之类的窗口名或一些随机名称,它的显示也很棒。有人可以帮忙吗?

@echo off
:start
tasklist | find /I "WINDOWNAME"
if errorlevel 1 (
    echo awesome
)
goto :start

1 个答案:

答案 0 :(得分:0)

首先,让我建议不要使用find只是为了在tasklist的整个输出中找到某个窗口标题,因为搜索字符串可能会出现在其他位置,例如图像名称,例如,这可能导致错误的匹配。

无论如何,当过滤器/FI未找到匹配项时,tasklist command不会设置exit code (ErrorLevel),但是您可以检查输出是否以INFO:开头,没有遇到匹配的情况是什么

:start
timeout /T 1
tasklist /FI "WindowTitle eq WindowName" | findstr /B "INFO:" > nul && (echo goto :start) || (echo awesome)`.

这取决于在没有匹配项的情况下返回的单行:

INFO: No tasks are running which match the specified criteria.

此文本取决于系统的区域设置/区域/语言设置。要使它甚至与语言环境无关,可以使用一个技巧:使用默认输出格式(tasklist)的/FO TABLE在遇到至少一个匹配项时返回多个行,因为存在两行标题,后跟实际匹配项;如果没有匹配项,则上述行是唯一返回的行。因此,使用选项tasklist通过for /F loop捕获skip=1的输出。然后,for /F循环将在未迭代时将退出代码设置为1(但不是ErrorLevel),并在至少迭代一次时将退出代码设置为0。可以使用conditional execution operators && and ||检查该退出代码:

:start
timeout /T 1
(for /F "skip=1" %%I in ('tasklist /FI "WindowTitle eq WindowName"') do rem/) && (echo awesome) || (goto :start)

我插入timeout command是为了避免goto :start循环给CPU带来沉重负担。

相关问题