2015-02-08 1 views
6

Я построил Form приложение, которое я использую в течение некоторого времени, сейчас я хочу, чтобы поймать StandardError моего процесса, а также его standartOutputне могу получить вывод ошибок процесса с использованием process.ErrorDataReceived C#

Я смотрел ответы в SO и MSDN и еще и не могу получить это право

Мой код:

 public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true) 
     { 
     process = new Process(); 

          process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); 
     if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent); 

     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 

     process.StartInfo.CreateNoWindow = true; 

     process.StartInfo.UseShellExecute = false; 

     process.StartInfo.FileName = FileName; 
     process.StartInfo.Arguments = Arguments;  
     if (EventWhenExit) 
     { 
      process.EnableRaisingEvents = true; 
      process.Exited += new EventHandler(myprocess_Exited); 
     } 


     process.Start(); 
     process.BeginOutputReadLine(); 
     //run polling on stored logs to print them to screen 
     PollingService(); 
     } 

Я проверить его с Iperf и я вижу, что, когда я запускаю его с правильным аргументом я получаю правильный вывод но когда я просто отправить его с любым argumnet я вижу, что с ЦМДОМ я получаю

C:\>iperf.exe 
Usage: iperf [-s|-c host] [options] 
Try `iperf --help' for more information. 

И мое приложение я получаю Ничего !

Что мне здесь не хватает? Thanks

Вы можете прекратить читать здесь! Если вы хотите, чтобы увидеть детали внутреннего метода по-прежнему ниже:

private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e) 
    { 
     string ProcessOutput = e.Data; 
     ProcessLog.Add(e.Data); 
    } 

    private void PollingService() 
    { 
     var T = new Thread (()=> 
     { 
      while (true /* ProcessRunning*/) 
      { 
       if (ProcessLogIndex < ProcessLog.Count) 
       { 
        lock (this) 
        { 
         var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex); 
         ProcessLogIndex = ProcessLog.Count; 
         foreach (var ToSend in tempList) 
         { 
          onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString()); 
         } 

        } 

       } 
       Thread.Sleep(400); 
      } 
     }); 
     T.IsBackground = true; 
     T.Start(); 
    } 

ответ

7

Я не вижу вызов BeginErrorReadLine() в коде вы публикуемый. Если вы не вызываете этот метод, класс Process фактически не перенаправляет stderr на ваш обработчик событий.

Я считаю, что это проблема, но если вы на самом деле называете это где-то (и просто не показывали ее), то стоит подумать, что есть некоторые странные программы консоли, которые фактически не используются stderr (или stdout) для вывода ошибок. Вместо этого они записываются непосредственно в окно консоли или какой-либо другой нестандартный механизм. В таких случаях вы не сможете получить выход ошибки, перенаправляя stderr.

Вы можете идентифицировать эти программы, перенаправляя их вывод по команде, например, например. iperf.exe 2> foo.txt. Файл дескриптора stderr равен 2, и поэтому синтаксис перенаправляет этот дескриптор файла в файл с именем foo.txt. Если файл пуст и вы видите ошибки на экране, программа является одной из тех странных программ.

Но на самом деле, я думаю, вы, вероятно, просто забыли позвонить BeginErrorReadLine(). :)

+0

вы ТАК ПРАВО! :) Я не могу поверить, что я забыл об этом – LordTitiKaka

Смежные вопросы