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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:08