![](/img/trans.png)
[英]How can I run multiple batch files concurrently in different locations from a single 'master' batch file?
[英]Can't run multiple batch files sequentially from master batch file in Win7
我有一堆批處理文件,每個文件都啟動一堆可執行文件來同時運行。 每個批處理文件啟動30個可執行文件 當這30個完成后,我希望下一批可執行文件再次運行30次。 .exe是使用批處理文件中的“start”命令調用的,它們工作得很好 - 我可以為30個exe的每個組運行單獨的批處理文件,它們可以同時運行。
我創建了一個“主”批處理文件,它調用每個子批處理文件,但我無法弄清楚如何讓它按順序運行子批處理文件,等待一個完成,然后再開始下一個。
如果主批處理文件是這樣的:
Batch1.bat
Batch2.bat
Batch3.bat
然后只調用第一個批處理文件 - 其他文件永遠不會被調用。
如果主批處理文件是這樣的:
call Batch1.bat
call Batch2.bat
call Batch3.bat
然后所有子批處理文件同時開始運行,我得到數百個可執行文件同時嘗試啟動。
如何讓主批處理文件調用第一個批處理文件,等待它完成,然后調用下一個,等待它完成,然后調用下一個等等?
提前致謝,
rgames
當啟動另一個批處理時,CALL將在同一窗口中啟動它,並且被調用的批處理可以訪問相同的變量上下文。 因此它也可以更改影響調用者的變量。
在批處理文件中使用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
命令。
我不得不為幾個文件運行數據導出程序。 我的解決方案
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
它可能適用於運行程序其他問題。
您將不得不創建一個信令機制來識別EXE completation。
我會創建一個第三級批處理來運行每個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
最后,第3級批處理,Batch_3rd.BAT:
%*
Del %Temp%\RUNNING_EXE.%Index%.TMP
%*
是從子批處理(exe +參數)傳遞的參數, %Index%
在創建時從子批處理start
復制環境是正確的,子批處理不會更改此副本。 最后一點:您可以將所有批次合並到一個批處理文件中,遞歸調用它。
我的解決方案
1)我有四個批處理文件:Parent.bat和Batch1.bat,Batch2.bat,Batch3.bat
2)Parent.bat包含以下行(請仔細注意):
調用Batch1.bat> result1.log
調用Batch2.bat> result2.log
調用Batch3.bat> result3.log
3)確保“在每個子批處理文件的末尾”,你有一個echo語句。 在這個echo語句之后,不應該有任何代碼......
說Batch1.bat文件的內容是:
回聲開始
robocopy“C:\\ Users \\ DD \\ Documents \\ A”“C:\\ Users \\ DD \\ Documents \\ B”
回聲結束
echo this_is_the_last_line
只是為了測試,我將使用簡單的子批次(所有這些都是相同的)
@echo off
for /l %%a in (1 1 5) do start "" notepad.exe
和一個主批處理文件
@echo off
setlocal enableextensions disabledelayedexpansion
set "flagFile=%temp%\%random%%random%%random%.tmp"
for %%a in ( "batch1.cmd" "batch2.cmd" "batch3.cmd" ) do (
call :startBatch %%a "%flagFile%"
)
:retryClean
echo %time% waiting for last batch to end
2>nul ( 9>"%flagFile%" break ) || ( >nul timeout 5 & goto :retryClean )
del /q "%flagFile%"
echo DONE
pause
goto :eof
:startBatch batchFile flagFile
echo %time% waiting to start "%~1"
2>nul ( 9>"%~2" call "%~1" ) || ( >nul timeout 5 & goto :startBatch )
echo %time% [ "%~1" ] STARTED
goto :eof
此代碼使用活動重定向(使用用戶可用流9)啟動每個子批次到臨時標志文件。 這將鎖定標志文件,直到從子批處理開始的所有進程都已結束,因為在創建進程期間繼承了重定向。
我們所要做的就是繼續嘗試使用相同的重定向啟動下一個批處理文件:
如果文件仍處於鎖定狀態(進程正在運行),則無法啟動批處理文件,等待5秒鍾並再次重試
如果文件未鎖定,則可以創建重定向並啟動下一個批處理文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.