2016-10-11 201 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

相关问题