在将命令提示符输出重定向到winform时遇到Process类问题

我在市场上寻找一个“选项卡式”命令提示应用程序,因为当我想到创建自己的桌面屏幕时,我厌倦了多个命令提示窗口混乱我的桌面屏幕。 虽然我知道它不会像独立产品那样伟大,但我认为创建自己的只是为了更熟悉“System.Diagnostic”类(Process,ProcessStartInfo等)将是一个很好的练习。我以前从未真正玩过。

我刚刚创建了一个准系统winforms应用程序,它有2个选项卡(包含richtextfields),一个文本字段(输入命令)和一个按钮(实际运行命令)。

我找到了各种post,展示了如何运行命令,但我遇到了实际执行命令并将结果返回到richtextbox的问题。 这是我根据我现在知道的信息创建的方法:(根据以前的答案更新)

public void GetConsoleOuput(string command) { string outputString; ProcessStartInfo startupInfo = new ProcessStartInfo() startInfo.FileName = "cmd.exe"; startInfo.RedirectStandardOuput = true; startInfo.WindowStyle = ProcessWindowStyle.Hidden: startInfo.UseShellExecute = false; startInfo.Arguments("/C " + command); Process process = new Process() process.StartInfo = startInfo; process.OutputDataReceived += new DataReceivedEventHandler(AppendRichBoxText); process.Start() process.BeginOutputReadLine(); process.WaitForExit(); process.Close(); } public void AppendRichBoxTet(object sender, DataReceivedEventArgs args) { string outputString = args.Data; // need to have the richTextBox updated using it's own thread richTextBox.BeginInvoke( /* not sure what to put inside here */); } 

使用此方法将继续将输出文本附加到richtextbox。

在这一点上,我坚持如何执行BeginInvoke方法,以便这个richTextBox将在其自己的线程上更新它的文本。

是的你可以。 您可以使用事件驱动的输出重定向API,而不是使用ReadToEnd (它将在进程完成之前阻塞):

  • 正如您所做的那样设置RedirectStandardOutput
  • 开始这个过程
  • 调用BeginOutputReadLine
  • 订阅OutputDataReceived事件并使用Control.BeginInvoke送回UI线程以附加到RichTextBox

BeginOutputReadLine文档中有一个示例。

编辑:对于Control.BeginInvoke ,这可能是最简单的解决方案:

 public void AppendRichBoxTet(object sender, DataReceivedEventArgs args) { string outputString = args.Data; MethodInvoker append = () => richTextBox.AppendText(outputString); richTextBox.BeginInvoke(append); } 

这里几乎没有什么问题

1)你不是在等待进程完成。 在读取输出之前,您应该使用Wait方法等待它完成。

2)输出缓冲区有一定的大小,如果它溢出你就会遇到死锁。 确保添加事件处理程序以在可用时读取标准输出或启动另一个线程以定期检查它。

3)你为什么要使用cmd.exe?