Batch file Can';t在Win7中从主批处理文件顺序运行多个批处理文件

Batch file Can';t在Win7中从主批处理文件顺序运行多个批处理文件,batch-file,Batch File,我有一组批处理文件,每个批处理文件启动一组并发运行的可执行文件。每个批处理文件启动30个可执行文件。完成这30个后,我希望下一批可执行文件运行,每次运行30个。在批处理文件中使用“start”命令调用.exe,它们工作得很好-我可以为每组30个exe运行单独的批处理文件,它们可以像应该的那样并发运行 我创建了一个“主”批处理文件,它调用每个子批处理文件,但我不知道如何让它按顺序运行子批处理文件,等待一个文件完成后再开始下一个文件 如果主批次文件如下所示: Batch1.bat Batch2.ba

我有一组批处理文件,每个批处理文件启动一组并发运行的可执行文件。每个批处理文件启动30个可执行文件。完成这30个后,我希望下一批可执行文件运行,每次运行30个。在批处理文件中使用“start”命令调用.exe,它们工作得很好-我可以为每组30个exe运行单独的批处理文件,它们可以像应该的那样并发运行

我创建了一个“主”批处理文件,它调用每个子批处理文件,但我不知道如何让它按顺序运行子批处理文件,等待一个文件完成后再开始下一个文件

如果主批次文件如下所示:

Batch1.bat
Batch2.bat
Batch3.bat
call Batch1.bat
call Batch2.bat
call Batch3.bat
然后只调用第一个批处理文件,而不会调用其他批处理文件

如果主批次文件如下所示:

Batch1.bat
Batch2.bat
Batch3.bat
call Batch1.bat
call Batch2.bat
call Batch3.bat
然后所有的子批处理文件开始同时运行,我得到了数百个试图同时启动的可执行文件

如何使主批处理文件调用第一个批处理文件,等待它完成,然后调用下一个,等待它完成,然后调用下一个,等等

提前感谢,


rgames

当启动另一个批处理调用时,它将在同一窗口中启动,并且被调用的批处理可以访问相同的变量上下文。因此,它还可以更改影响调用者的变量

在批处理文件中使用wait调用可执行文件将等待它们退出

START /WAIT  batch1.bat
START /WAIT batch2.bat

希望这能帮上忙。对不起。我认为这是一个误解。如果您的主批处理文件为:

call Batch1.bat
call Batch2.bat
call Batch3.bat

然后在Batch1.bat结束后调用Batch2.bat,依此类推。您可以做一个小测试来确认这一点。另一方面,每个BatchN.bat程序是否可能使用相同的变量?如果是,则Batch1.bat留下的最后一个值可能会干扰Batch2.bat,依此类推。在这种情况下,您必须在每个批处理文件的开头添加一个
Setlocal
命令。

您必须创建一个信号机制来感知EXE完成

我会创建一个第三级批处理来运行每个EXE,在执行EXE之前创建一个临时文件,然后删除它

在子批处理中,我将等待,直到没有更多的临时文件

因此,第一批:

call Batch1.bat
call Batch2.bat
call Batch3.bat
子批次:

Set Index=0
Call :Exec exefile1 args ...
Call :Exec exefile2 args ...
...
:WaitAll
If Exist %Temp%\RUNNING_EXE.*.TMP GoTo :WaitAll
GoTo :EOF

:Exec
Set /A Index+=1
Echo %Index% > %Temp%\RUNNING_EXE.%Index%.TMP
Start Batch_3rd.BAT %*
GoTo :EOF
最后,第三级批次,批次_3rd.BAT:

%*
Del %Temp%\RUNNING_EXE.%Index%.TMP
%*
是从子批次(exe+参数)传递的参数,
%Index%
是正确的,因为
开始
在创建时从子批次复制环境,子批次不更改此副本。
最后一点注意:您可能可以将所有批合并到单个批处理文件中,递归调用它。

我必须为多个文件运行数据导出程序。我的解决方案:

MasterBatch.bat:

@echo off
start /w batch1.bat
start /w batch2.bat
Batch1.bat

@echo off
cmd /c "c: & cd Program Files (x86)/PATH & targetProgram.exe -parametersToExportVideo1"
EXIT
Batch2.bat

@echo off
cmd /c "c: & cd Program Files (x86)/PATH & targetProgram.exe -parametersToExportVideo2"
EXIT
它可能适用于运行程序或其他问题。

我的解决方案:

(一) 我有四个批处理文件: Parent.bat和Batch1.bat、Batch2.bat、Batch3.bat

(二) Parent.bat包含以下行(请密切注意):

调用Batch1.bat>result1.log

调用Batch2.bat>result2.log

调用Batch3.bat>result3.log

(三) 确保“在每个子批处理文件的末尾”,您有一个echo语句。 在这个echo语句之后不应该有任何代码

假设Batch1.bat文件的内容为:

回声开始

robocopy“C:\Users\DD\Documents\A”“C:\Users\DD\Documents\B”

回音端


echo this__是_最后一行

仅用于测试,我将使用简单的子批次,如(它们都是相同的)

@echo关闭
对于(1 1 5)中的/l%%a,请启动“notepad.exe”
和一个主批文件

@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“flagFile=%temp%\%random%%random%%random%%random%.tmp”
对于“%batch1.cmd”“batch2.cmd”“batch3.cmd”中的%%a,请执行以下操作(
呼叫:startBatch%%a“%flagFile%”
)
:重新清洁
回显%time%等待最后一批结束
2> nul(9>“%flagFile%”中断)| |(>nul超时5&goto:retryClean)
删除/q“%flagFile%”
回音完成
暂停
后藤:eof
:startBatch批处理文件flagFile
回显%time%等待启动“%~1”
2> nul(9>“%~2”调用“%~1”)| |(>nul超时5&转到:开始批次)
已启动回显%time%[“%~1”]
后藤:eof
此代码通过活动重定向(使用用户可用流9)将每个子批启动到临时标志文件。这将锁定标志文件,直到从子批开始的所有进程都结束,因为在进程创建过程中继承了重定向

我们所要做的就是继续尝试使用相同的重定向启动下一个批处理文件:

  • 如果文件仍处于锁定状态(进程正在运行),则无法启动批处理文件,请等待5秒钟,然后重试

  • 如果文件未锁定,则可以创建重定向并启动下一个批处理文件


谢谢,但这似乎不起作用。Batch1.bat之后仍会停止。但是,还有两个cmd.exe窗口正在打开。一个命令行带有“START/WAIT Batch1.bat”,另一个似乎显示了Batch1.bat中的所有命令。我是否需要从子批处理文件中添加某种“return”语句?exit命令不起作用。它的工作原理是等待batch1.bat退出,然后按照您的要求运行batch2.bat。batch1.bat没有退出的原因是您必须找到的。您还可以使用
start”“/w/b batch1.bat
,它将在同一cmd窗口中等待并运行它。
用于防止命令中带引号的路径引起问题。如果在主批处理文件中使用“start”“/w/b batch1.bat”等,则它会同时运行所有批处理文件,并且所有批处理中的所有可执行文件都会同时运行。事实上,batch1.bat似乎永远不会退出,该批处理文件的窗口就在那里,有一个命令提示符,等待着什么