2016-10-11 236 views
5

那裏, 我有兩個批處理文件:BatchA.batBatchB.bat BatchA.bat呼籲B1.batB2.batB3.bat並運行在同一時間三個批處理文件(三批文件的運行順序會沒關係)。 這是BatchA.batC#控制檯調用批處理多個批處理文件

start B1.bat 
start B2.bat 
start B3.bat 

BatchB.bat呼籲B4.batB5.batB6.bat並運行在同一時間三個批處理文件(這三個批處理文件的運行順序並不重要)。 這是BatchB.bat

start B4.bat 
start B5.bat 
start B6.bat 

我使用C#控制檯應用程序調用BatchA.batBatchB.bat,但我需要確保BatchB.bat纔會開始BatchA.bat如果完成。換句話說,我需要確保所有B1.batB2.batB3.bat完整的我開始之前BatchB.bat

這是C#代碼:

proc.StartInfo.FileName = BatchA.bat; 
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
proc.Start(); 
proc.WaitForExit(); 
int exitCode = proc.ExitCode; 
proc.Close(); 
Console.WriteLine("Process Complete! exitCode: " + exitCode.ToString()); 

proc.StartInfo.FileName = BatchB.bat; 
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
proc.Start(); 
proc.WaitForExit(); 
exitCode = proc.ExitCode; 
proc.Close(); 
Console.WriteLine("Process Complete! exitCode: " + exitCode.ToString()); 

當我運行此,所有6個批處理文件同時開始時間。在完成所有三個小批處理文件之前,我如何確保BatchA.bat不完整?

+0

呼叫BatchB。 – Squashman

回答

1

這將在其自己的窗口中並行啓動所有三個批處理文件,並在啓動batchb之前等待所有三個文件完成。

@echo off 
start "" /wait cmd /c batch1.bat |start "" /wait cmd /c batch2.bat |start "" /wait cmd /c batch3.bat 
batchb.bat 
+1

這不能確保B1或B2已經結束。 –

+1

@MCND,更新了我的代碼。雖然不像你的那麼幹淨。 – Squashman

+0

其實你已經發布了我要包含的代碼來處理指向我的答案的行爲。用這種方式編碼管道不會等待從'b1' ...'b3'開始的進程。 –

3

一個簡單的方法可能是管道start命令。當子進程結束後,管的左側部分將被關閉,關閉滿管和批量將繼續執行

所以,batchA.cmd可以被編碼爲

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    echo starting BatchA 
    (
     start "b1" cmd /c b1.cmd 
     start "b2" cmd /c b2.cmd 
     start "b3" cmd /c b3.cmd 
    ) | more 

    echo BatchA has ended 

:這種方法,雖然簡單,可以有一個缺點(或不是,這取決於需求)。由b1 ... b3啓動的流程可以使管道保持活動狀態。

@Squashman已經發布了code來處理不等待從內部批處理文件啓動的進程。

+0

這是一個聰明的做法。 – soja

0

我沒有看到用批處理文件做到這一點的方法。 「開始」命令啓動一個進程,並給你句柄,通過它來檢查進程是否完成,或者等到完成。

通過powershell命令可以做到這一點。

PS > $x = Start-Process notepad -PassThru 
PS > Wait-Process -Id $x.Id 
1

您可以使用WAITFOR。在批料A中,使用這樣的:

@echo off 
waitfor done 
waitfor done 
waitfor done 
echo done 

如果是B1,B2,B3,使用WAITFOR /SI done當批量完成運行。

或者,您可以在B1,B2和B3中的每一箇中創建一個0字節的標記文件作爲監視器,在結束批處理A之前檢查是否存在任何標記文件,但可能更復雜。

+0

我不得不用它來使它工作。 'WAITFOR/S%computername%/ SI完成' – Squashman

+0

呵呵,我不知道有什麼區別。在同一臺計算機上運行時,我不需要它。 – soja

0

嘗試使用await和異步。通過使用await關鍵字,您可以繼續其他工作,直到BatchA完成。

例如,

Task<int> getBatchAData = GetBatchDataAsync(); 

    if (batchAData != 0) 
    { 
     GetBatchB(); 
    } 

    var yourData = await getBatchAData; 

產生額外的信息在這裏:從BatchA https://msdn.microsoft.com/en-us/library/mt674882.aspx

相關問題