C#控制台调用Batch Multiple Batch文件
本文关键字:Batch Multiple 文件 调用 控制台 | 更新日期: 2023-09-27 18:12:27
在那里,我有两个批处理文件:BatchA.bat
、BatchB.bat
BatchA.bat
正在调用B1.bat
、B2.bat
、B3.bat
,并同时运行这三个批处理文件(这三个批次文件的运行顺序无关紧要(。这是BatchA.bat
:
start B1.bat
start B2.bat
start B3.bat
BatchB.bat
正在调用B4.bat
、B5.bat
、B6.bat
,并同时运行这三个批处理文件(这三个批次文件的运行顺序无关紧要(。这是BatchB.bat
:
start B4.bat
start B5.bat
start B6.bat
我正在使用C#控制台应用程序调用BatchA.bat
、BatchB.bat
,但我需要确保BatchB.bat
在BatchA.bat
完成之前不会启动。换句话说,在启动BatchB.bat
之前,我需要确保所有B1.bat
、B2.bat
和B3.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
在三个小批量文件全部完成之前不完整?
一种简单的方法是通过管道传输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