c# - 在 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”等动态命令
解决方案
推荐阅读
- go - How to get enum variable name by value in golang?
- jquery - 使用 codeigniter 创建 jQuery 自动完成
- javascript - 在画布上放置一个图像元素
- php - 使用传递给函数映射的数组变量而不是在数组中推送新项目
- tensorflow - 我可以训练 RNN 的初始隐藏状态来表示模型的初始条件吗?
- javascript - vue 道具显示为未定义
- c++ - QNetworkReply::finished() 信号是顺序调用还是同时调用?
- php - 如何在codeigniter中从主模板加载选定的函数
- tcp - 为什么我的 tcp 服务器发送数据两次,我的 tcp 服务器是基于 lwip raw api
- python - 如何使用 pandas 获取特定值?