有没有办法在一张支票内缩短领事时间



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

让我提出一个稍微不同的方法。不需要所有的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答案的小优化。

这样执行得更快。

: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.

您还没有解释您的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个批处理文件,然后控制流在pause命令处停止。当所有6个批处理文件终止时,此程序将继续。

请注意,没有任何批次代码来检查过程是否结束;这是由操作系统自动完成的。通过这种方式,该程序的等待状态不会浪费任何CPU时间。如需进一步解释,请参阅以下答案

如果不能测试这一点,也许每个循环只运行一个tasklist命令会更快:

@Echo Off
SetLocal EnableExtensions
:Loop
For /F Tokens^=17^ Delims^=^" %%G In (
'%SystemRoot%System32tasklist.exe /Fi "ImageName Eq cmd.exe" /Fo CSV /NH /V 2^>NUL'
) Do Set /P "=%%G" 0<NUL | %SystemRoot%System32findstr.exe /I ^
"<%server1%> <%server2%> <%server3%> <%server4%> <%server5%> <%server6%>" 1>NUL && GoTo Loop
:Backup

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

最新更新