我如何检查批处理脚本中的命名程序是否为 运行?
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 负载。
出于某种原因,即使程序未打开,即使我输入 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 负载。