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

本文关键字:Batch Multiple 文件 调用 控制台 | 更新日期: 2023-09-27 18:12:27

在那里,我有两个批处理文件:BatchA.batBatchB.batBatchA.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完成之前不会启动。换句话说,在启动BatchB.bat 之前,我需要确保所有B1.batB2.batB3.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在三个小批量文件全部完成之前不完整?

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

一种简单的方法是通过管道传输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已经发布了处理不等待从内部批处理文件启动的进程的代码。

您可以使用WAITFOR。在批次A中,使用以下内容:

@echo off
waitfor done
waitfor done
waitfor done
echo done

然后在B1、B2、B3中,当批处理完成运行时使用WAITFOR /SI done

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

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

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

我看不到用批处理文件实现这一点的方法。"start"命令启动一个进程,并为您提供no句柄,用于检查进程是否完成,或等待进程完成。

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

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

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

例如,

  Task<int> getBatchAData = GetBatchDataAsync();
    if (batchAData != 0)
    {
       GetBatchB();
    }
   var yourData = await getBatchAData;

此处提供附加信息:https://msdn.microsoft.com/en-us/library/mt674882.aspx