我有一個Windows批處理文件啓動其他批處理文件。在第一批執行任何操作之前,如何等待所有其他批處理文件完成?我不能使用/等待,因爲我需要其他命令並行運行。等待命令完成
等待命令完成
回答
我的建議是使用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
請注意區別:我們得到的第二回聲,證明完畢
也就是說,如果沒有CALL,它就和CALL一樣好,但只能......終止。 :) –
@Andriy M:根據我迄今爲止所經歷的情況,這是**不是**所以,如果沒有調用 - 執行立即返回到下一行,而不等待調用的批處理/命令完成(也許你應該用長時間的操作來嘗試)。 – woohoo
這太奇怪了,我不得不使用您的示例腳本驗證我的期望。我在Windows 7 SP1的命令提示符下運行了第一批,這兩個腳本正如我所想的那樣爲我工作,即當第二次調用'batch2.bat'時終止執行。也就是說,'batch1.bat'的最後一行沒有執行。你有什麼測試他們,你說沒有CALL的執行返回到第一批,並沒有等待呢? –
您可以使用多個標誌文件,每個運行的批處理文件一個。例如:
第一個批處理文件創建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
@woohoo:不好意思,我想這裏有一個問題。問題在於如何在繼續父項之前等待所有的孩子平行批次結束。沒有辦法通過CALL解決這個問題,但是通過START。 正如提問者所說,他不能使用/ WAIT,這是START命令的一個選項。解決方案是實現一個信號量系統,允許父級批處理文件知道其所有子級別何時結束。我提出了一個基於文件存在的非常簡單的信號量系統,然而,它應該是完美的。 那麼,爲什麼我的回答收到downvote? :-( – Aacini
+1,爲什麼選擇倒票,尤其是因爲這是實際解決問題的唯一答案,最好是讓主文件創建flagfile,主腳本可能在子進程完成初始化之前開始測試。 – dbenham
LOVE this!在VS中,我們在每個服務項目的構建後事件中都使用了'CALL'來下載每個* .cs引用文件,以存儲在另一個包含所有簡單程序集引用的項目中, START/b/i',發現我可以在同一個窗口同時運行它們,而不會互相影響,所以很甜蜜,然後我就像是在完成構建之後我可以使用'MSBuild'服務項目,以便引用它的程序集的項目自動更新。BOOM! –
- 1. 等待命令完成
- 2. Python popen命令。等待命令完成
- 3. 等待shell命令來完成
- 4. 等待終端命令完成python
- 5. CMD - 等待並行命令行完成?
- 6. CompositeCommand等待所有子命令完成
- 7. 從Java執行命令,等待命令完成
- 8. 等待完成
- 9. 等待完成
- 10. 等待webworker完成
- 11. 等待NSURLSessionTask完成
- 12. jquery,等待完成
- 13. 等待IDBCursor.onsuccess完成
- 14. 等待ExecWB完成
- 15. 等待GUI完成
- 16. WebRequest.GetResponse等待完成
- 17. 等待BackgroundWorker完成?
- 18. 等待webrequest完成
- 19. 等待AsyncTask完成
- 20. delayed_job等待完成
- 21. 等待UIView完成
- 22. 等待shutil.copyfile完成
- 23. 等待SwingWorker完成
- 24. 等待$ .post完成
- 25. 等待AFJSONRequestOperation完成
- 26. QNetworkReply等待完成
- 27. 如何通過命令行執行命令並等待它完成
- 28. 從命令行執行EXE命令行後應等待EXE完成
- 29. 命令行不會等待exe文件執行完成
- 30. Plink完成遠程命令執行後等待按鍵
你能發佈一些代碼?我不清楚你的問題是什麼。 – steenhulthin
您是否使用'call ...'來啓動其他批次? – woohoo