首页 > 解决方案 > 在 C# 应用程序中获取实时 CMD 命令输出

问题描述

我想创建一个桌面应用程序,如命令提示符。在该应用程序中,我从文本框获取输入并将实时输出放在富文本框中。

但是某些命令需要等待完成执行,例如“composer install”(这将下载所需的资源,这就是为什么需要很长时间,并且它还以百分比显示下载的过程状态)

所以我的主要问题是,如果任何其他语言而不是 c# 可以做到这一点,那么我怎么能做类似命令提示符的东西,它可以提供轻量级的动态输出而不会挂起,然后建议我。

我的桌面应用程序看起来像这样。

在此处输入图像描述

点击事件方法上的c#“运行”按钮如下。

private void button1_Click(object sender, EventArgs e)
{
    richTextBox1.Text = "";
    if (textBox1.Text != null)
    {

        ProcessStartInfo info = new ProcessStartInfo("cmd", "/c " + textBox1.Text);

        info.UseShellExecute = false;
        info.RedirectStandardInput = true;
        info.RedirectStandardOutput = true;
        info.RedirectStandardError = true;
        info.CreateNoWindow = true;

        StringBuilder outputBuilder = new StringBuilder();
        StringBuilder errorBuilder = new StringBuilder();

        Process process = new Process();
        process.StartInfo = info;
        process.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
        process.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);

        process.Start();
        process.BeginErrorReadLine(); // do this after process.Start()
        process.BeginOutputReadLine();

        process.WaitForExit();
    }
}

private void SortOutputHandler(object sendingProcess,DataReceivedEventArgs outLine)
{
    StringBuilder sortOutput = new StringBuilder("");
    if (richTextBox1.InvokeRequired) { richTextBox1.BeginInvoke(new DataReceivedEventHandler(SortOutputHandler), new[] { sendingProcess, outLine }); }
    else
    {
        sortOutput.Append(Environment.NewLine + outLine.Data);
        richTextBox1.AppendText(sortOutput.ToString());
        richTextBox1.ScrollToCaret();
    }
}

我的代码完全有效,但应用程序一直挂起,直到命令完全执行,同时运行“composer install”等动态命令

标签: c#desktop-application

解决方案


推荐阅读