我如何检查批处理脚本中的命名程序是否为 运行?

How would I check if a named program is running in a batch script?

出于某种原因,即使程序未打开,即使我输入 window 名称(如 "asdfsd" 或其他随机名称),它也会说很棒。有人可以帮忙吗?

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

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

无论如何,当过滤器/FI没有找到匹配时,tasklist command does not set the 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.

此文本取决于系统的 locale/region/language 设置。为了使这甚至 locale-independent,你可以使用一个技巧:tasklist,默认输出格式(/FO TABLE),returns 至少一个匹配时多于一行是遇到了,因为后面有一个two-line header跟实际匹配项;如果没有匹配项,则上述行是唯一返回的行。所以通过 for /F loop, using the option skip=1. The for /F loop will then set the exit code to 1 (not the ErrorLevel though) when it does not iterate, and to 0 when it iterates at least once. This exit code can be checked using the conditional execution operators && and ||:

捕获 tasklist 的输出
: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 负载。