2013-07-27 71 views
2

我有一堆批處理文件,每個批處理文件都會啓動一組可執行文件並行運行。每個批處理文件啓動30個可執行文件當這30個完成時,我希望下一批可執行文件再次運行30次。使用批處理文件中的「start」命令調用.exe文件,它們工作得很好 - 我可以爲每個30個exe文件組運行單個批處理文件,並且它們可以像他們應該那樣同時運行。無法在Win7中的主批處理文件中順序運行多個批處理文件

我已經創建了一個調用每個子批處理文件的「主」批處理文件,但我無法弄清楚如何讓它按順序運行子批處理文件,等待一個完成後再開始下一個。

如果主批處理文件是這樣的:

Batch1.bat 
Batch2.bat 
Batch3.bat 

那麼只有第一個批處理文件叫做 - 別人永遠不會被調用。

如果主批處理文件是這樣的:

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

那麼所有的子批處理文件開始在同一時間運行,我得到數百可執行文件試圖在同一時間來啓動的。

如何讓主批處理文件調用第一批文件,等待它完成,然後調用下一個,等待它完成,然後調用下一個等?

由於提前,

rgames

+0

的問題並不在於捕捉文件並行運行。這是你使用「開始」來運行exes。 「開始」不等待程序退出。刪除「開始」關鍵字。 –

+0

我想同時在每個批處理文件中運行所有30個exe文件,所以我需要使用「啓動」。如果我不使用「開始」,那麼30個exe不會同時運行。我希望批處理文件能夠連續運行,但我希望每個批處理文件中的exe能夠同時運行。 –

+0

怎麼樣用'start「啓動你的exes Myexe一個」one.exe''啓動「Myexe兩個」two.exe'等等。然後你可以檢查它們中的一些是否仍在運行'tasklist | find「Myexe」' – Stephan

回答

2

當啓動另一批電話將在同一窗口中啓動它和被叫一批具有訪問相同的變量上下文。所以它也可以改變影響調用者的變量。

在批處理文件中使用等待來調用可執行文件將等待它們退出之前。

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

希望這有助於

+0

謝謝,但那似乎不起作用。它在Batch1.bat後仍然停止。但是,還有兩個cmd.exe窗口只是坐在那裏打開。一個命令行帶有「START/WAIT Batch1.bat」,另一個似乎顯示來自Batch1.bat的所有命令。我是否需要從子批處理文件中添加某種「返回」語句?退出命令不起作用。 –

+0

它的工作原理是等待batch1.bat退出,然後batch2.bat將按照您的要求運行。爲什麼你的batch1.bat不能退出是你必須找到的。您也可以使用'start「」/ w/b batch1.bat「,它將在同一個cmd窗口中等待並運行它。 ''「'用於防止命令中的引用路徑導致問題。 – foxidrive

+0

如果我在主批處理文件中使用'start'「/ w/b batch1.bat'等,那麼它會立即運行所有批處理文件,並且所有批處理中的所有可執行文件都會同時運行。事實上 - 看起來batch1.bat永遠不會退出 - 該批處理文件的窗口只是在那裏使用命令提示符,等待發生某些事情。我如何告訴batch1.bat關閉它的窗口?我想這就是爲什麼第二個窗口在那裏 - 這是主批處理文件等待batch1.bat窗口關閉的窗口。我的問題沒有解決,但我正在學習somthing ...!任何其他想法? –

2

對不起。我認爲這裏有一個誤解。如果你的主批處理文件是這樣的:

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

然後Batch1.bat結束後Batch2.bat被調用,等等。你可以做一個小測試來證實這一點。另一方面,有可能每個BatchN.bat程序使用相同的變量?如果是這樣,那麼從Batch1.bat剩下的最後值可能會干擾Batch2.bat,等等。在這種情況下,您必須在每個批處理文件的開頭添加一個Setlocal命令。

+0

每個子批處理文件(batch1.bat,batch2.dat等)都有'set tempDir =%CD%'作爲第一行。它這樣做是因爲它將目錄從當前根目錄切換下來,在該目錄中啓動.exe,然後切換回根目錄,以便它可以切換到下一個目錄並啓動下一個.exe。我已經嘗試過,沒有setlocal也沒有區別。我不希望它 - 被設置的變量應該始終是相同的。 –

0

您將不得不創建一個信號機制來了解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 

最後,第三級批,Batch_3rd.BAT:從子通過

%* 
Del %Temp%\RUNNING_EXE.%Index%.TMP 

%*有觀點-batch(exe +參數),%Index%正確爲start copies envi創建時從子批次創建子批次,並且子批次不會更改此副本。 最後一個注意事項:您可以將所有批次合併到一個批處理文件中,並遞歸調用它。

2

我不得不爲幾個文件運行數據導出程序。我的解決辦法:

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 

它可以適用於運行程序等問題。

0

我的解決辦法:

1) 我有四個批處理文件: Parent.bat和Batch1.bat,Batch2.bat,Batch3.bat

2) Parent.bat包含以下行(需要密切注意):

呼叫Batch1.bat> result1.log

呼叫Batch2.bat> result2.log

call Batch3.bat> result3.log

3) 請確保「到每個子批處理文件的末尾」,您都有一個echo語句。 在此回聲聲明之後,不應該有任何代碼...

說出Batch1的內容。bat文件是:

回聲開始

ROBOCOPY 「C:\用戶\ DD \文件\ A」, 「C:\用戶\ DD \文件\ B」

回波端

回波this_is_the_last_line

0

只是用於測試,我會用簡單的分批次樣(所有的人都是一樣的)

@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秒鐘,然後重新嘗試

  • 如果文件沒有鎖定,可以創建重定向和下一個批處理文件啓動。