You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:55:30