在日常开发和运维工作中,我们经常需要通过批处理文件(.bat)执行一系列系统命令。如果能通过 C# 程序自动化调用这些批处理文件,就能实现流程自动化、任务批量处理,大幅提升工作效率。
本文将详细讲解C# 调用 .bat 文件、直接执行 CMD 命令的两种核心实现方式,提供完整可运行的源码,并讲解进程管理、路径处理、输出捕获等关键知识点,帮助你快速实现系统命令自动化。
一、核心技术基础
C# 中调用外部程序(批处理、CMD 命令)的核心是
System.Diagnostics.Process 类,这个类可以创建、启动、管理系统进程,是实现外部程序交互的基础。我们主要用到的核心功能:
- 启动外部进程(cmd.exe/bat 文件)
- 配置进程参数(隐藏窗口、管理员权限、工作目录)
- 捕获批处理 / 命令的执行输出和错误信息
- 等待进程执行完成并获取退出码
二、环境准备
- 开发工具:Visual Studio 2019 及以上版本
- 框架支持:.NET Framework /.NET 5+/.NET 6+ 全平台兼容
- 命名空间:必须引用
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 "管理员权限执行完成";
}
}
六、关键注意事项
-
路径问题
- 批处理路径包含空格时,必须用双引号包裹:
Arguments = $"/c \"{batPath}\"" - 建议使用绝对路径,避免相对路径报错
- 批处理路径包含空格时,必须用双引号包裹:
-
中文乱码解决
- 设置编码:
StandardOutputEncoding = Encoding.UTF8 - 批处理文件保存为 UTF-8 格式
- 设置编码:
-
进程管理
- 使用
using释放Process资源,避免内存泄漏 WaitForExit()会阻塞主线程,异步场景可使用WaitForExitAsync()
- 使用
-
执行判断
- 退出码
ExitCode=0代表执行成功,非 0 代表执行失败
- 退出码
七、应用场景
- 自动化部署:调用批处理备份文件、重启服务
- 系统运维:批量执行网络命令、清理系统垃圾
- 桌面工具:封装系统操作,提供可视化界面
- 定时任务:结合定时器实现自动化脚本执行
八、总结
本文通过
Process 类实现了 C# 调用批处理文件和直接执行 CMD 命令的完整方案,提供了通用、管理员权限、输出捕获等多种实用功能。这套代码可以直接集成到你的项目中,快速实现系统命令自动化,无需手动操作批处理文件,大幅提升开发和运维效率。核心代码轻量高效,兼容所有 .NET 框架,是 Windows 平台自动化开发的实用技巧。