2013-05-09 2 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(); 

Можете ли вы дать мне альтернативу этому? Например, подождите, пока не появится последнее выходное сообщение или что-то в этом роде?

EDIT

Я считаю, что то, как это помогло бы (если он есть) .. я могу сказать, консоль не перенаправить вывод или не писать ничего в определенной точке, а затем позволить ему написать еще раз в коде? Как:

Console.CloseBuffer(); 

Console.OpenBuffer(); 
+0

Что вы можете сделать, это перенаправить вывод в поток, а затем прекратить чтение («захват») из этого потока, когда у вас есть то, что вам нужно. – redtuna

ответ

0

Вы должны попробовать использовать asychronous переадресацию вывода, и включать и выключать «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(); 
Смежные вопросы