C# 调用 cmd.exe 执行命令的实现方法与 SvcUtil 生成 WCF 客户端示例
在 Windows 开发环境中,有时需要通过 C# 程序调用外部命令行工具(如 cmd.exe)来执行系统操作或第三方可执行文件。本文将详细解析如何通过 Process 类正确配置进程启动信息,以实现在后台静默执行命令并获取其标准输出结果。内容涵盖基础调用代码结构以及利用此方法生成 WCF 客户端代理类的实战示例。
核心目标与准备条件
使用 C# 调用 cmd.exe 的核心目的是在不打开黑框窗口的情况下,向命令行发送指令并读取返回结果。实现这一功能需要确保运行环境具备执行权限,并在代码中准确引用 System.Diagnostics 命名空间。
C# 调用 cmd.exe 的真实操作顺序
第1步:配置 ProcessStartInfo 关键属性
为了精确控制命令行进程的行为,必须对 ProcessStartInfo 对象进行严格配置。以下是实现“后台执行且捕获输出”所必需的设置项:
FileName:指定为 "cmd.exe"。UseShellExecute = false:至关重要,只有设为 false 才能启用重定向功能。RedirectStandardInput = true:允许程序向命令行发送输入流。RedirectStandardOutput = true:允许程序读取命令行的标准输出流。RedirectStandardError = true:允许程序读取报错信息。CreateNoWindow = true:禁止创建控制台窗口,保持界面纯净。
第2步:启动进程并向 stdin 写入命令
完成配置后,调用 p.Start() 启动进程。此时进程处于等待输入状态。你需要通过 p.StandardInput.WriteLine() 发送具体的命令字符串。为了保证命令执行完毕后进程正常退出,通常需要在命令末尾追加 &exit。
using System;
using System.Diagnostics;
namespace CmdDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入要执行的命令:");
string strInput = Console.ReadLine();
// 初始化进程对象
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
// 【关键配置】关闭 Shell 执行以支持重定向
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true; // 不显示黑框窗口
// 启动进程
p.Start();
// 向 cmd 窗口发送输入信息及退出指令
p.StandardInput.WriteLine(strInput + "&exit");
p.StandardInput.AutoFlush = true;
// 阻塞直到进程结束(注意:ReadToEnd 可能因缓冲区问题需配合 WaitForExit)
string strOuput = p.StandardOutput.ReadToEnd();
p.WaitForExit();
// 清理资源
p.Close();
Console.WriteLine(strOuput);
Console.ReadKey();
}
}
}
上述代码展示了基础的控制台交互模式。在实际项目中,我们通常需要更严谨的异常处理以及针对长耗时命令的缓冲读取策略。
应用案例:利用 cmd 调用 SvcUtil 生成 WCF 客户端
在某些遗留系统维护或自动化构建流程中,可能需要动态调用微软提供的 SvcUtil.exe 工具来根据 URL 生成本地 C# 代码格式的 WCF 客户端代理类。以下展示如何在 WinForms 应用中通过封装好的逻辑实现这一功能。
第3步:构建复杂的命令行参数
由于路径中包含空格(如 "Program Files (x86)"),必须对可执行文件路径和服务地址进行正确的转义和引号包裹。参数通常包含:
/r:"[ReferenceAssembliesPath]":引用必要的程序集(如 System.Data)。/syncOnly:同步调用模式。- 服务地址 URL。
第4步:完整封装与执行逻辑
在一个按钮点击事件中,复用上文所述的 Process 配置模式,并将拼接好的复杂 CMD 命令送入标准输入。执行完成后,可以将输出结果(生成的代码片段或错误日志)弹窗展示。
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace ExecuteCMD
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
private void btn_Create_Click(object sender, EventArgs e)
{
try
{
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
// 注意:路径中的引号和空格必须严格匹配,防止参数解析失败
string serviceUrl = this.txt_URL.Text.Trim();
string pathToSvcUtil = @"""C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\SvcUtil.exe""";
string referencePath = @"""C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.dll""";
string strCMD = pathToSvcUtil + " " + serviceUrl + " /r:" + referencePath + " /syncOnly";
// 发送带参数的执行命令
p.StandardInput.WriteLine(strCMD + "&exit");
p.StandardInput.AutoFlush = true;
// 读取输出并等待完成
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
p.Close();
MessageBox.Show(output);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n跟踪;" + ex.StackTrace);
}
}
}
}执行成功后,SvcUtil 会将生成的代码默认保存到当前工作目录(通常是项目的 bin\Debug 文件夹下),随后可将其直接加入项目中作为 WCF 客户端使用。
总结与注意事项
通过 C# 调用 cmd.exe 的本质在于正确使用 System.Diagnostics.Process 的重定向特性。务必牢记 UseShellExecute = false 是所有 IO 重定向的前提条件。在处理路径包含空格的命令行参数时,请使用原始字符串字面量(verbatim strings)配合外层的双引号来规避转义难题。此外,如果命令行执行时间极长,建议将 ReadToEnd 替换为异步读取或使用独立的线程监控输出流,以防止 UI 线程死锁或缓冲区溢出。
以上就是C#程序调用cmd.exe执行命令及生成WCF客户端的详细内容,更多关于C#系统进程控制与命令行调用的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













