如何在C#控制台中调用多个批处理脚本并等待其全部执行完成
批量并行执行批处理脚本并等待全部完成的实现方案
你的需求是同时启动多个批处理脚本,等待所有脚本执行完毕后再执行下一组,现有代码存在逻辑冗余(重复启动进程)且未实现并行执行的问题,以下是优化后的实现方案:
核心思路
- 为每个批处理脚本单独创建
Process实例,并行启动 - 收集所有进程的等待句柄,统一等待全部进程执行完成
- 完成第一组后,重复上述逻辑执行第二组脚本
完整代码实现
using System; using System.Collections.Generic; using System.Diagnostics; class BatchRunner { static void Main() { // 第一组需要执行的批处理脚本路径 string[] firstBatchScripts = { @"C:\test\script1.bat", @"C:\test\script2.bat", @"C:\test\script3.bat", @"C:\test\script4.bat" }; // 执行第一组并等待完成 RunBatchScriptsParallel(firstBatchScripts); Console.WriteLine("第一组脚本全部执行完成"); // 第二组需要执行的批处理脚本路径 string[] secondBatchScripts = { @"C:\test\another1.bat", @"C:\test\another2.bat" }; // 执行第二组并等待完成 RunBatchScriptsParallel(secondBatchScripts); Console.WriteLine("第二组脚本全部执行完成"); } static void RunBatchScriptsParallel(string[] scriptPaths) { List<Process> processes = new List<Process>(); List<WaitHandle> waitHandles = new List<WaitHandle>(); foreach (string scriptPath in scriptPaths) { Process process = new Process(); process.StartInfo.FileName = scriptPath; process.StartInfo.CreateNoWindow = true; process.StartInfo.UseShellExecute = false; // 如果需要捕获输出,可以开启重定向(根据需求选择) // process.StartInfo.RedirectStandardOutput = true; // process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data); process.Start(); processes.Add(process); waitHandles.Add(process.Handle); } // 等待所有进程执行完成 WaitHandle.WaitAll(waitHandles.ToArray()); // 清理资源 foreach (Process p in processes) { p.Close(); } } }
关键细节说明
- 并行启动:通过循环为每个脚本创建独立的
Process实例并启动,实现多脚本同时运行 - 等待全部完成:使用
WaitHandle.WaitAll一次性等待所有进程的句柄,比逐个调用WaitForExit()更高效 - 无窗口执行:设置
CreateNoWindow = true和UseShellExecute = false避免弹出命令行窗口 - 输出捕获(可选):如果需要查看脚本输出,可以开启标准输出重定向并绑定
OutputDataReceived事件
如果你需要调整脚本路径、添加错误处理(比如检查脚本是否存在),可以在启动进程前增加对应的判断逻辑。
内容的提问来源于stack exchange,提问作者MattDmc
相关产品推荐
相关产品推荐

