C#控制台调用Batch Multiple Batch文件

时间:2016-10-11 15:11:27

标签: c# batch-file

有, 我有两个批处理文件:BatchA.batBatchB.bat BatchA.bat正在调用B1.batB2.batB3.bat并同时运行三个批处理文件(三个批处理文件的运行顺序无关紧要)。 这是BatchA.bat

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.batBatchA.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不完整?

5 个答案:

答案 0 :(得分: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以处理不等待从内部批处理文件启动的进程。

答案 1 :(得分:1)

这将在他们自己的窗口中并行启动所有三个批处理文件,并等待所有三个批处理文件在启动批处理之前完成。

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

答案 2 :(得分:1)

您可以使用WAITFOR。在批处理A中,使用此:

@echo off
waitfor done
waitfor done
waitfor done
echo done

然后在B1,B2,B3中,当批次运行完毕时使用WAITFOR /SI done

或者,您可以在B1,B2和B3的每一个中创建一个0字节的标记文件作为监视器,检查是否存在任何在结束批处理A之前,但可能更复杂。

答案 3 :(得分:0)

我没有看到使用批处理文件执行此操作的方法。 "开始"命令启动一个进程,并为您提供 no 句柄,以检查进程是否完成,或等到它完成。

可以通过powershell命令执行此操作。

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

答案 4 :(得分:0)

尝试使用await和async。通过使用await关键字,您可以继续其他工作,直到BatchA完成。

例如,

higher Position

此处添加个人信息:https://msdn.microsoft.com/en-us/library/mt674882.aspx