C# 调用批处理 (.bat) 文件:实现系统命令自动化执行

C++
在日常开发和运维工作中,我们经常需要通过批处理文件(.bat)执行一系列系统命令。如果能通过 C# 程序自动化调用这些批处理文件,就能实现流程自动化、任务批量处理,大幅提升工作效率。
本文将详细讲解C# 调用 .bat 文件直接执行 CMD 命令的两种核心实现方式,提供完整可运行的源码,并讲解进程管理、路径处理、输出捕获等关键知识点,帮助你快速实现系统命令自动化。

一、核心技术基础

C# 中调用外部程序(批处理、CMD 命令)的核心是 System.Diagnostics.Process,这个类可以创建、启动、管理系统进程,是实现外部程序交互的基础。
我们主要用到的核心功能:
  1. 启动外部进程(cmd.exe/bat 文件)
  2. 配置进程参数(隐藏窗口、管理员权限、工作目录)
  3. 捕获批处理 / 命令的执行输出和错误信息
  4. 等待进程执行完成并获取退出码

二、环境准备

  1. 开发工具:Visual Studio 2019 及以上版本
  2. 框架支持:.NET Framework /.NET 5+/.NET 6+ 全平台兼容
  3. 命名空间:必须引用 using System.Diagnostics;

三、C# 调用 .bat 批处理文件(完整源码)

这是最常用的场景:直接执行本地的 .bat 文件,支持等待执行完成捕获输出日志隐藏黑窗口

1. 通用调用方法(推荐)

csharp
运行
using System;
using System.Diagnostics;
using System.Text;

namespace BatAutomation
{
    class BatCaller
    {
        /// <summary>
        /// 调用批处理(.bat)文件
        /// </summary>
        /// <param name="batPath">bat文件完整路径</param>
        /// <param name="waitForExit">是否等待执行完成</param>
        /// <returns>执行输出日志</returns>
        public static string RunBatFile(string batPath, bool waitForExit = true)
        {
            // 校验文件是否存在
            if (!System.IO.File.Exists(batPath))
            {
                return $"错误:未找到批处理文件 - {batPath}";
            }

            // 构建进程启动信息
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                // 指定执行程序为CMD
                FileName = "cmd.exe",
                // 执行参数:/c 执行后关闭窗口 /k 执行后保留窗口
                Arguments = $"/c \"{batPath}\"",
                // 设置工作目录(批处理中相对路径以此为准)
                WorkingDirectory = System.IO.Path.GetDirectoryName(batPath),
                // 以下配置:隐藏CMD黑窗口,无界面执行
                UseShellExecute = false,
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden,
                // 重定向输出和错误,方便捕获日志
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                StandardOutputEncoding = Encoding.UTF8,
                StandardErrorEncoding = Encoding.UTF8
            };

            // 存储执行结果
            StringBuilder output = new StringBuilder();

            using (Process process = new Process())
            {
                process.StartInfo = startInfo;
                // 绑定输出事件
                process.OutputDataReceived += (sender, e) =>
                {
                    if (!string.IsNullOrEmpty(e.Data))
                        output.AppendLine(e.Data);
                };
                // 绑定错误事件
                process.ErrorDataReceived += (sender, e) =>
                {
                    if (!string.IsNullOrEmpty(e.Data))
                        output.AppendLine($"错误:{e.Data}");
                };

                // 启动进程
                process.Start();
                // 开始异步读取输出
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

                // 等待进程执行完成
                if (waitForExit)
                {
                    process.WaitForExit();
                    output.AppendLine($"执行完成,退出码:{process.ExitCode}");
                }
            }

            return output.ToString();
        }
    }
}

2. 调用示例

csharp
运行
class Program
{
    static void Main(string[] args)
    {
        // 你的批处理文件路径
        string batPath = @"D:\test\auto.bat";
        // 执行并获取结果
        string result = BatCaller.RunBatFile(batPath);
        // 打印输出日志
        Console.WriteLine("执行结果:");
        Console.WriteLine(result);
        Console.ReadKey();
    }
}

四、C# 直接执行 CMD 命令(无需 bat 文件)

如果不想创建 .bat 文件,可以直接通过 C# 执行 CMD 系统命令,适合简单的命令自动化场景。
csharp
运行
/// <summary>
/// 直接执行CMD命令
/// </summary>
/// <param name="cmd">命令内容</param>
/// <returns>执行结果</returns>
public static string RunCmdCommand(string cmd)
{
    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        // 直接传入命令
        Arguments = $"/c {cmd}",
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        StandardOutputEncoding = Encoding.UTF8
    };

    using (Process process = Process.Start(startInfo))
    {
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
        process.WaitForExit();

        return $"{output}\n{error}";
    }
}
调用示例
csharp
运行
// 执行系统命令:查看IP配置
string ipResult = RunCmdCommand("ipconfig");
Console.WriteLine(ipResult);

五、高级功能:管理员权限执行

部分系统命令需要管理员权限才能执行,我们可以在 ProcessStartInfo 中添加配置:
csharp
运行
startInfo.Verb = "runas"; // 管理员权限启动
完整管理员权限调用代码:
csharp
运行
public static string RunBatAsAdmin(string batPath)
{
    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        Arguments = $"/c \"{batPath}\"",
        UseShellExecute = true, // 管理员模式必须为true
        Verb = "runas", // 核心:管理员权限
        CreateNoWindow = true
    };

    using (Process process = Process.Start(startInfo))
    {
        process.WaitForExit();
        return "管理员权限执行完成";
    }
}

六、关键注意事项

  1. 路径问题
    • 批处理路径包含空格时,必须用双引号包裹:Arguments = $"/c \"{batPath}\""
    • 建议使用绝对路径,避免相对路径报错
  2. 中文乱码解决
    • 设置编码:StandardOutputEncoding = Encoding.UTF8
    • 批处理文件保存为 UTF-8 格式
  3. 进程管理
    • 使用 using 释放 Process 资源,避免内存泄漏
    • WaitForExit() 会阻塞主线程,异步场景可使用 WaitForExitAsync()
  4. 执行判断
    • 退出码 ExitCode=0 代表执行成功,非 0 代表执行失败

七、应用场景

  1. 自动化部署:调用批处理备份文件、重启服务
  2. 系统运维:批量执行网络命令、清理系统垃圾
  3. 桌面工具:封装系统操作,提供可视化界面
  4. 定时任务:结合定时器实现自动化脚本执行

八、总结

本文通过 Process 类实现了 C# 调用批处理文件和直接执行 CMD 命令的完整方案,提供了通用、管理员权限、输出捕获等多种实用功能。
这套代码可以直接集成到你的项目中,快速实现系统命令自动化,无需手动操作批处理文件,大幅提升开发和运维效率。核心代码轻量高效,兼容所有 .NET 框架,是 Windows 平台自动化开发的实用技巧。

免责声明:
1.本站所有源码支持免费互换,所有资源来源于网络,分享目的仅供大家学习和交流!不得使用于非法商业用途,不得违反国家法律。否则后果自负!(下载即表示同意遵守此条例!) 所有资源,不能保证完全去除后门和源码的完整性!(建议先用D盾 等查杀软件先扫描一遍!)且都不包含技术服务请大家谅解!
2.根据二○○二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理, 通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可, 不向其支付报酬!鉴于此,也希望大家按此说明研究!
3.本站所有源码均收集来源于网络,若此源码资源等文章侵犯您的合法权益,请私信联系站长,并于24小时内删除下架。
4.本站所有源码仅限学习,交流使用,请勿上线或非法使用,一切法律责任均于此站无关。
5.侵权联系邮箱:188773464@qq.com
6.若您最终确认购买,则视为您100%认同并接受以上所述全部内容。

源码下载网 C++ C# 调用批处理 (.bat) 文件:实现系统命令自动化执行 https://svipm.com.cn/21991.html

相关文章

猜你喜欢