2013-05-09 51 views
2

我有一个应用程序启动并读取控制台进程的标准输出。在该控制台进程中,我调用了一些写入控制台的DLL文件..但我不想捕获这些消息,我只想捕获它们发送的输出字符串。如何从控制台进程只捕获一行?

我试图做:

verboseMethod(); //method writting things into the console 

output = dllMethod(); //method returning what I want 

Console.Clear(); 
Console.Out.Write(output) 

我这样做,所以我相信我读的一切之前Console.Clear()执行:

exeProcess.BeginOutputReadLine(); 
       string errString = exeProcess.StandardError.ReadToEnd(); 

你能给我这个选择吗?等到最后输出消息给出或类似的东西?

编辑

我相信这样的事情会帮助(如果存在的话)。我可以告诉控制台不输出重定向或不以某一点写什么,然后允许它来写再次在代码中的其他地方?像:

Console.CloseBuffer(); 

Console.OpenBuffer(); 
+0

你可以做的是将输出重定向到一个流,然后停止阅读从流(“捕获”),一旦你有你需要的东西。 – redtuna 2013-05-09 21:00:26

回答

0

你应该尝试使用输出重定向台异步,以及打开和关闭“EnableRaisingEvents”,所以你只想要执行之间捕捉。使用BeginOutputReadLine()和CancelOutputRead()来启动/停止控制台读取。

 var myOutput = new StringBuilder(); 
     var myProcess = new Process(); 
     myProcess.StartInfo = new ProcessStartInfo(path, command); 
     myProcess.StartInfo.UseShellExecute = false; 
     myProcess.StartInfo.RedirectStandardOutput = true; 
     myProcess.StartInfo.RedirectStandardError = true; 
     myProcess.EnableRaisingEvents = true; 

     myProcess.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) => 
     { 
      if (e.Data != null) 
      { 
       myOutput.AppendLine(e.Data); 
      } 
     }; 

     myProcess.ErrorDataReceived += (object sendingProcess, DataReceivedEventArgs e) => 
     { 
      if (e.Data != null) 
      { 
       myOutput.AppendLine(e.Data); 
      } 
     }; 
     myProcess.Start(); 

     verboseMethod(); 

     //Start Capture here! 
     myProcess.BeginErrorReadLine(); 
     myProcess.BeginOutputReadLine(); 

     dllMethod(); 
相关问题