Batch file 如何并行运行三个批处理文件,并在完成第一组后运行另外三个批处理文件?

Batch file 如何并行运行三个批处理文件,并在完成第一组后运行另外三个批处理文件?,batch-file,Batch File,我有大约24个批处理文件,我必须一次运行3个,在完成前3个之后,我必须运行下3个文件,以此类推 假设我有像1.bat、2.bat、3.bat这样的文件,我需要它们在完成前3个文件后运行前3个文件,我需要下3个文件运行,依此类推,直到所有24个文件 start 1.bat start 2.bat start /wait 3.bat start 4.bat start 5.bat start /wait 6.bat 等等。这假设带有/wait开关的批处理文件是耗时最长的文件。如果不可能,您可以在此

我有大约24个批处理文件,我必须一次运行3个,在完成前3个之后,我必须运行下3个文件,以此类推

假设我有像1.bat、2.bat、3.bat这样的文件,我需要它们在完成前3个文件后运行前3个文件,我需要下3个文件运行,依此类推,直到所有24个文件

start 1.bat
start 2.bat
start /wait 3.bat
start 4.bat
start 5.bat
start /wait 6.bat
等等。这假设带有
/wait
开关的批处理文件是耗时最长的文件。如果不可能,您可以在此处使用此脚本:

@echo off

start bat1.bat
start bat2.bat
start bat3.bat
call waitForFinish
start bat4.bat
start bat5.bat
start bat6.bat
call waitForFinish
Goto:eof

:waitForFinish
set counter=0
for /f %%i in ('tasklist /NH /FI "Imagename eq cmd.exe') do set /a counter=counter+1
if %counter% GEQ 2 Goto waitForFinish
启动3个批处理文件后,调用“函数”
waitForFinish
。这将检查是否找到多个正在运行的命令行进程(一个用于正在运行的批处理文件,因此它将始终存在,另外一行位于输出上方),并对找到的每个窗口进行计数。

如果该计数器大于2,它将一次又一次地执行相同的操作,直到只有正在运行的批处理文件窗口是找到的唯一cmd.exe进程。如果是这种情况,脚本将返回到脚本的顶部以开始接下来的三个批处理文件。

下面的脚本如何并行执行三个批处理文件并等待它们完成?基本上,它允许每个批处理文件将其STDERR输出重定向到一个临时文件,只要批处理文件仍在运行,该临时文件就会被写锁定。一旦批处理文件终止,就可以访问临时文件进行写入,因此它可以也将被删除。下面是代码:

@echo关闭
rem/*并行执行三个批处理文件,重定向它们的STDERR输出
rem到单个临时文件:*/
启动“cmd/c2^>”1.tmp“1.bat”
启动“cmd/c2^>”2.tmp“2.bat”
启动“cmd/c2^>“3.tmp”3.bat
rem//包含轮询循环的调用子程序:
调用:轮询“1.tmp”“2.tmp”“3.tmp”
退出/B
:POLL{val_temp_file}*
rem/*建立轮询循环,尝试删除临时文件;
rem如果批处理文件仍在运行,则相应的临时文件
rem尚未访问,因此删除失败:*/
:循环
rem//延迟执行以给处理器一些时间:
>nul超时/T 1/NOBREAK
rem/*`for/F`循环,用于捕获`del`命令的STDERR输出;
rem请记住,'del'没有设置'ErrorLevel',不幸的是:*/
对于/F“delims=”%%E in('
rem/丢弃标准输出并适当重定向标准输出:^&^
2^>^&1^>nul^(^
rem/`if exist`甚至适用于已打开/访问的文件:^&^
对于^(%%*^)中的%%F,如果存在,则执行“%%~F”del“%%~F”^
^)
""做"(
rem//循环迭代,因此有STDERR输出,因此循环返回:
转到:循环
)
退出/B

此解决方案使用以下所述的方法:


在这个方法中,第一个线程进入等待状态,在三个启动的批处理文件结束之前不消耗CPU。它也很容易编写(而且看起来不错)

已经有了解决方案。你只需要用谷歌搜索一下就可以了。你可能对此感兴趣:…依我看,这个问题应该以“太宽”或“必须包含MCVE”来结束。我试着运行了你给出的相同代码。结果是:前三个批处理文件运行并关闭,但计数器值仍然大于1,循环不断重复。接下来的三个批处理文件未运行。请建议我,不要使用
findstr
进行过滤,而应该使用
tasklist
的过滤功能(请参阅其
/FI
选项)…@umamaheswareddymbati似乎还有一行导致了问题。。。根据aschipfl的建议,我也稍微更改了命令,并将不正确的0更改为2。
如果计数器GTR 2
错误,则必须是
如果%counter%GEQ 2
@谢谢你的来信;花了一段时间去理解我在那里写的东西;我同意Aacini的版本更干净。修正了密码。
@echo off
setlocal EnableDelayedExpansion

for /L %%i in (1,3,22) do (
   set /A N1=%%i, N2=%%i+1, N3=%%i+2
   ( start "" !N1!.bat & start "" !N2!.bat & start "" !N3!.bat ) | set /P "="
)