2011-08-04 193 views
5

我有一個Windows批處理文件啓動其他批處理文件。在第一批執行任何操作之前,如何等待所有其他批處理文件完成?我不能使用/等待,因爲我需要其他命令並行運行。等待命令完成

+0

你能發佈一些代碼?我不清楚你的問題是什麼。 – steenhulthin

+0

您是否使用'call ...'來啓動其他批次? – woohoo

回答

1

我的建議是使用CALL命令。從Batch Files一個例子:

Batch1.bat上市:

REM Batch1.bat 
SET ABC=1 
CALL BATCH2.BAT %ABC% 
ECHO ABC = %ABC% 
BATCH2.BAT %ABC% 
ECHO ABC = %ABC% 

其中Batch2.bat列表:

REM Batch2.bat 
SET ABC=%ABC%%1 


編輯:根據反饋@Andriy男,在這裏是兩個批次的改進版本:

批次1:

@ECHO OFF 
REM Batch1.bat 
SET ABC=1 
CALL batch2.bat %ABC% 
ECHO 1. ABC = %ABC% 
CALL batch2.bat %ABC% REM test this line with CALL and without 
ECHO 2. ABC = %ABC% 

第2批:

@ECHO OFF 
REM Batch2.bat 
SET tmout=5 
echo sleeping %tmout% seconds... 
REM this introduces a timeout by using a nonexistent ip address 
PING 1.2.1.2 -n 1 -w %tmout%000 > NUL 
echo done sleeping 
SET ABC=%ABC%%1 

見BATCH1行,我寫的評論測試此行CALL和無。運行該批次兩次,該行有CALL且沒有CALL

從控制檯輸出而不CALL

C:\temp>batch1.bat 
sleeping 5 seconds... 
done sleeping 
1. ABC = 11 
sleeping 5 seconds... 
done sleeping 

而且現在從控制檯的輸出與CALL

C:\temp>batch1.bat 
sleeping 5 seconds... 
done sleeping 
1. ABC = 11 
sleeping 5 seconds... 
done sleeping 
2. ABC = 1111 

請注意區別:我們得到的第二回聲,證明完畢

+1

也就是說,如果沒有CALL,它就和CALL一樣好,但只能......終止。 :) –

+0

@Andriy M:根據我迄今爲止所經歷的情況,這是**不是**所以,如果沒有調用 - 執行立即返回到下一行,而不等待調用的批處理/命令完成(也許你應該用長時間的操作來嘗試)。 – woohoo

+0

這太奇怪了,我不得不使用您的示例腳本驗證我的期望。我在Windows 7 SP1的命令提示符下運行了第一批,這兩個腳本正如我所想的那樣爲我工作,即當第二次調用'batch2.bat'時終止執行。也就是說,'batch1.bat'的最後一行沒有執行。你有什麼測試他們,你說沒有CALL的執行返回到第一批,並沒有等待呢? –

7

您可以使用多個標誌文件,每個運行的批處理文件一個。例如:

第一個批處理文件創建Flagfile.1進入時,並結束之前將其刪除,並以同樣的方式同時批處理文件的剩餘部分(Flagfile.2,...)

主文件只必須等待所有的國旗消失。例如,在主文件:

start Batch1 
start Batch2 
..... 
:wait 
if exist flagfile.* goto wait 

在任何批處理文件,例如BATCH1:

echo %time% > flagfile.1 
echo Do my process... 
del flagfile.1 
exit 
+1

@woohoo:不好意思,我想這裏有一個問題。問題在於如何在繼續父項之前等待所有的孩子平行批次結束。沒有辦法通過CALL解決這個問題,但是通過START。 正如提問者所說,他不能使用/ WAIT,這是START命令的一個選項。解決方案是實現一個信號量系統,允許父級批處理文件知道其所有子級別何時結束。我提出了一個基於文件存在的非常簡單的信號量系統,然而,它應該是完美的。 那麼,爲什麼我的回答收到downvote? :-( – Aacini

+1

+1,爲什麼選擇倒票,尤其是因爲這是實際解決問題的唯一答案,最好是讓主文件創建flagfile,主腳本可能在子進程完成初始化之前開始測試。 – dbenham

+0

LOVE this!在VS中,我們在每個服務項目的構建後事件中都使用了'CALL'來下載每個* .cs引用文件,以存儲在另一個包含所有簡單程序集引用的項目中, START/b/i',發現我可以在同一個窗口同時運行它們,而不會互相影響,所以很甜蜜,然後我就像是在完成構建之後我可以使用'MSBuild'服務項目,以便引用它的程序集的項目自動更新。BOOM! –