首页 > 解决方案 > 有没有办法在一次检查中减少咨询时间?

问题描述

我有这个批处理代码,它工作得很好,但是:每行需要大约 60 秒才能执行,我想知道,如果我能更快地做到这一点......

还有 if 语句。我想检查是否每个窗口都关闭了,如果是,我想执行一些操作。但是如果至少有一个窗口仍然打开,那么它应该再次检查它。

:loop
for /f %%i in ('tasklist /v /fi "WINDOWTITLE eq %server1%" /FO Table') do set #1=%%i
for /f %%i in ('tasklist /v /fi "WINDOWTITLE eq %server2%" /FO Table') do set #2=%%i
for /f %%i in ('tasklist /v /fi "WINDOWTITLE eq %server3%" /FO Table') do set #3=%%i
for /f %%i in ('tasklist /v /fi "WINDOWTITLE eq %server4%" /FO Table') do set #4=%%i
for /f %%i in ('tasklist /v /fi "WINDOWTITLE eq %server5%" /FO Table') do set #5=%%i
for /f %%i in ('tasklist /v /fi "WINDOWTITLE eq %server6%" /FO Table') do set #6=%%i
if not %#1%==cmd.exe (
    if not %#2%==cmd.exe (
        if not %#3%==cmd.exe (
            if not %#4%==cmd.exe (
                if not %#5%==cmd.exe (
                    if not %#6%==cmd.exe (
                        goto backup
                    )
                )
            )
        )
    )
) else (
    echo back to loop
    goto openWindow
)

标签: batch-file

解决方案


让我提出一个稍微不同的方法。if只要存在其中一项任务,您就可以循环而不是所有这些语句:

:wait
timeout 1 >nul
for %%a in (%server1% %server2% %server3% %server4% %server5% %server6%) do (
  tasklist /nh /fi "windowtitle eq %%a" |find "  " >nul && goto :wait
)
echo all closed.

或者

setlocal enabledelayedexpansion
:wait
timeout 1 >nul
for /l %%a in (1,1,6) do (
  tasklist /nh /fi "windowtitle eq !server%%a!" |find "  " >nul && goto :wait
)
echo all closed.

注意:find " "查找两个连续的空格,而不是 TAB)

如果您明智地选择窗口标题,您甚至不需要for循环:

:wait
timeout 1 >nul
tasklist /nh /fi "windowtitle eq MySubWindow*" |find "  " >nul && goto :wait
echo all closed.

其中窗口标题都以固定字符串(MySubWindow此处)开头,例如MySubWindow-1MySubWindow-2(是的,tasklist可以使用通配符 - 但只能在字符串的末尾)。这基本上是“如果存在标题以 MySubWindow 开头的任何窗口,则循环”


推荐阅读