【问题标题】:Is there a way to do this less time consuling within one check?有没有办法在一次检查中减少耗时?
【发布时间】:2021-04-25 19:25:00
【问题描述】:

我有这个批处理代码,它工作得很好,但是: 每行需要大约 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
)

【问题讨论】:

  • 您需要添加一些其他信息。不清楚你想做什么......
  • 我打开了 6 个不同的命名批处理文件。然后我用 setkey 关闭窗口......但我无法确定关闭所有窗口需要多长时间。如果每个窗口都关闭,它应该转到备份。如果现在它应该再次检查它
  • 为什么需要详细模式?

标签: batch-file


【解决方案1】:

让我提出一个稍微不同的方法。除了所有那些 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 开头的任何窗口,则循环”

【讨论】:

  • Stephan,我看到有问题,如果你想要你可以在这里添加我的版本,我删除我的答案。
  • 无需删除您的答案。没错,这不是抄袭(正如您正确声明了来源),它有一个有用的补充,它不可避免地会为您产生声誉(尤其是当您添加一些解释时,如何以及为什么更快)
【解决方案2】:

Stephan 回答的小优化。

这执行得更快。

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

【讨论】:

  • 你能解释一下你的优化吗?我根本看不到任何逻辑或时间优势。
  • 更正:在某些情况下,这确实比我的要快(~150ms vs. ~750ms per pass inextreme)(这并不重要,因为 OP 满足于 timeout 5 在循环)
  • 对不起,斯蒂芬,我今天不舒服,我会尽快解释清楚。请问您使用什么工具来测量时间?
  • 别担心。我的第一条评论是基于“在我的脑海中运行代码”。在真机上运行后,我意识到,你的修改实际上是有用的。为了测量,我只使用了一些echo %time% 命令。不是很准确,但足以大致了解速度。
【解决方案3】:

您还没有解释您的 6 个批处理文件是如何“打开”的,但是如果它们是通过 START 命令打开的,那么还有一种更简单的方法可以做到这一点:

(
    start call batch1.bat
    start call batch2.bat
    start call batch3.bat
    start call batch4.bat
    start call batch5.bat
    start call batch6.bat
) | pause

echo All 6 Batch files are closed

前面的代码并行运行 6 个 Batch 文件,然后控制流在 pause 命令处停止。当所有 6 个 Batch 文件都终止时,此程序继续。

请注意,没有任何批处理代码检查进程是否结束;这是由操作系统自动完成的。这样,这个程序的等待状态就不会浪费任何CPU时间。更多解释见this answer

【讨论】:

  • 你好安东尼奥,我们好久没见面了,热烈的问候,感谢这个答案它真的很有用,在参考文献中还有很多其他的选择。一个问题:是否有任何技术细节为什么您使用 pause 而不是 set /p?
  • 嗨@Einstein1969,感谢您的问候。 ;) 在这种情况下,任何获得输入的命令都可以工作,但我认为pause 更好地反映了该命令的目的。
【解决方案4】:

如果无法对此进行测试,也许每个循环只运行一个tasklist 命令会更快:

@Echo Off
SetLocal EnableExtensions

:Loop
For /F Tokens^=17^ Delims^=^" %%G In (
    '%SystemRoot%\System32\tasklist.exe /Fi "ImageName Eq cmd.exe" /Fo CSV /NH /V 2^>NUL'
) Do Set /P "=%%G" 0<NUL | %SystemRoot%\System32\findstr.exe /I ^
 "\<%server1%\> \<%server2%\> \<%server3%\> \<%server4%\> \<%server5%\> \<%server6%\>" 1>NUL && GoTo Loop

:Backup

findstr.exe 选项可能需要根据这些变量的内容进行调整。

【讨论】:

  • 比爱因斯坦还快?
  • 这是@AwesomeSounds 的问题还是陈述?
  • 一个问题^^因为爱因斯坦的执行就像即时..我删除了“超时1”,因为我想:“谁需要超时进行即时检查”......然后我测试它...... . 我的 i7-8700k 仍然为此哭泣:P 再次添加超时...并将其增加到 5
  • @AwesomeSounds:程序员的第一条规则:永远不要在没有等待周期的情况下构建无限循环。你已经明白为什么了。
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2018-03-04
  • 2020-02-08
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多