C# WPF应用调用CMD命令行并获取输出的技术问询
在WPF中用C#调用CMD并捕获输出
嘿,我看你已经搭了个调用CMD的基础架子了,这就帮你把剩下的部分补全,确保能稳稳捕获命令行的输出~
下面是完整可运行的代码示例:
private Process process; private void RunCmdCommand(string command) { process = new Process(); process.StartInfo.FileName = @"cmd.exe"; // 用程序当前运行目录替代".", 路径更可靠 process.StartInfo.WorkingDirectory = Environment.CurrentDirectory; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardOutput = true; // 别忘了捕获错误输出,不然命令执行出错的信息会找不到 process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; // 绑定输出和错误输出的处理事件 process.OutputDataReceived += OutputHandler; process.ErrorDataReceived += ErrorHandler; process.Start(); // 必须调用这两个方法,才会触发对应的DataReceived事件 process.BeginOutputReadLine(); process.BeginErrorReadLine(); // 向CMD输入要执行的命令,最后加exit让CMD执行完自动退出 process.StandardInput.WriteLine(command); process.StandardInput.WriteLine("exit"); // 等待进程结束(如果不需要阻塞当前线程,可以去掉这行) process.WaitForExit(); process.Close(); } // 处理CMD的标准输出 private void OutputHandler(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { // 划重点:WPF控件只能在UI线程更新,这里要切换线程 Application.Current.Dispatcher.Invoke(() => { // 你可以把输出显示到TextBox这类控件里,比如: // txtOutput.AppendText(e.Data + Environment.NewLine); Console.WriteLine($"输出:{e.Data}"); }); } } // 处理CMD的错误输出(比如命令输错时的提示) private void ErrorHandler(object sender, DataReceivedEventArgs e) { if (!string.IsNullOrEmpty(e.Data)) { Application.Current.Dispatcher.Invoke(() => { // 可以用不同样式区分错误信息,比如红色字体 // txtOutput.AppendText($"[错误] {e.Data}" + Environment.NewLine); Console.WriteLine($"错误:{e.Data}"); }); } }
几个关键注意点:
- 异步读取必须开启:一定要调用
BeginOutputReadLine()和BeginErrorReadLine(),否则OutputDataReceived事件根本不会触发,你拿不到任何输出。 - 错误输出不能丢:开启
RedirectStandardError并绑定ErrorDataReceived,不然命令执行出错的信息会直接被忽略掉。 - UI线程切换:输出处理事件是在后台线程跑的,WPF的控件只能在UI线程操作,所以必须用
Dispatcher.Invoke()切回UI线程更新界面。 - 让CMD自动退出:输入命令后加
exit,不然CMD进程会一直挂在后台不关闭,浪费资源。
调用示例:
比如你想执行dir命令查看当前目录的文件,直接调用:
RunCmdCommand("dir");
内容的提问来源于stack exchange,提问作者Nicky
相关产品推荐
相关产品推荐

