簡體   English   中英

無法從Win7中的主批處理文件順序運行多個批處理文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM