2013-09-23 3 views
2

dumpcap.exe가 데이터를 캡처 할 수있는 지원되는 인터페이스를 나열하려고합니다.빈 문자열을 반환하는 C#의 프로세스 표준 출력

내가 실행할 명령은 "dumpcap.exe -D"내 시스템에서

, 그것은으로 출력을 제공입니다 - 나는에 의해 위의 출력을 읽을려고

1. \Device\NPF_{1B627AA8-2A1D-4C90-B560-517CF71B33A5} (Intel(R) 825 
Network Connection) 
2. \Device\NPF_{7ECC4D31-DF17-49AB-960D-628D0580F3C6} (Microsoft) 

WPF C# 응용 프로그램에서 동일한 명령을 실행합니다. 나는 다음과 같은 코드를 가지고있다. -

 Process proc = new Process(); 

     //set the path to dumpcap.exe (verified by me) 
     proc.StartInfo.FileName = "..\\..\\..\\..\\..\\Dumpcap\\dumpcap.exe"; 

     StringBuilder dumpcapArgs = new StringBuilder(); 

     dumpcapArgs.Append("-D"); 

     proc.StartInfo.Arguments = dumpcapArgs.ToString(); 
     proc.StartInfo.CreateNoWindow = true; 
     proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.StartInfo.UseShellExecute = false; 

     proc.Start(); 

     while (!proc.StandardOutput.EndOfStream) 
     { 
      string line = proc.StandardOutput.ReadLine(); 
      MessageBox.Show(line); 

     } 

내가 디버깅 할 때 실행은 내 while 루프에 전혀 들어 가지 않는다. StandardOutput은 이미 스트림의 끝 부분에 있습니다. StandardOutput 기본 스트림 클래스 멤버를 더 자세히 살펴보면 길이, 위치 등에서 많은 System.NotSupportedExceptions를 볼 수 있습니다.

위 코드가 잘못된 것은 무엇입니까?

나는 다음과 같은 코드로 다른 샘플 C# 콘솔 응용 프로그램을 시도

빠른 관찰 :

 Process proc = new Process(); 

     proc.StartInfo.FileName = "C:\\Karan\\Dumpcap\\dumpcap.exe"; 
     proc.StartInfo.Arguments = "-D"; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.Start(); 

     Console.WriteLine(proc.StandardOutput.ReadToEnd()); 

     proc.WaitForExit(); 

이 예상대로 출력을 인쇄!

그러나 문자열 변수에서 표준 출력을 읽으려고하면 빈 문자열이 표시됩니다.

는 예를 들어,이 나에게 빈 문자열을 반환합니다 : -

 Process proc = new Process(); 

     proc.StartInfo.FileName = "C:\\Karan\\Dumpcap\\dumpcap.exe"; 
     proc.StartInfo.Arguments = "-D"; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardOutput = true; 
     proc.Start(); 


     String output = proc.StandardOutput.ReadToEnd(); 


     proc.WaitForExit(); 

답변

2

당신은 프로세스를 시작하지 않습니다. 당신은 너무 proc.Start();

Length, Position를 사용하여 콘솔 응용 프로그램 중 표준을 나타내는 스트림 길이와 앞으로 만 이동 가능한 스트림에서 알 수 없기 때문에 Stream 비슷한 구성원이 지원되지 않습니다해야한다. 따라서 정상적인 것이며 코드에서 오류가 아닙니다.

+0

미안 해요, 난 그 라인을 놓친 : 나는 보통 다른 방식으로 출력의 리디렉션을 수행하기 때문에이 트릭을 할 것입니다 경우

는 잘 모르겠어요. 내 잘못이야. 업데이트 됨. – Karan

1

이 시도 :

string output = proc.StandardOutput.ReadToEnd(); 
proc.WaitForExit(); 

foreach(var line in output.Split('\r')) 
{ 
    MessageBox.Show(line); 
} 

왜이 일을 하는가? 잠재적으로 EndOfStream을 처음 쿼리 할 때 출력 스트림에 아무 것도 없습니다. 이것은 경쟁 조건입니다.

게시하기 전에이 기사에 문의했습니다. 읽으십시오. http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx

+1

메시지 상자에 여전히 빈 문자열이 있습니다. – Karan

+0

빠른 시사가 업데이트되었습니다. – Karan

+0

당신이 내 문제에 아주 가깝다고 생각합니다.나는 varup 문자열을 출력 할 수 없다 (항상 비어 있음). 표준 동기 메소드 (readToEnd() 및 Console.WriteLine() 사용)는 예상 출력을 인쇄합니다. 나는 그것이 프로세스가 종료되고 Console.Writeline()의 버퍼를 채우는 것을 기다리는 것과 관련이 있다고 생각한다. – Karan

2

EnableRaisingEventstrue으로 설정 했습니까? 비주얼 스튜디오의 코드를 복사하는 동안

private Process proc; 
private string procOutput = string.Empty; 

private void StartProc() 
{ 
    this.procOutput = string.Empty; 
    this.proc = new Process(); 
    ... 
    this.proc.StartInfo.UseShellExecute = false; 
    this.proc.StartInfo.CreateNoWindow = true; 
    this.proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

    this.proc.EnableRaisingEvents = true; 
    this.proc.OutputDataReceived += this.ProcOutputDataReceivedHandler; 
    this.proc.Exited += this.ProcExitedHandler; 

    this.proc.Start(); 

    this.proc.BeginOutputReadLine(); 
} 

private void ProcOutputDataReceivedHandler(object sendingProcess, DataReceivedEventArgs e) 
{ 
    if (!string.IsNullOrEmpty(e.Data)) 
    { 
     this.procOutput += e.Data; 
    } 
} 

private void ProcExitedHandler(object sender, EventArgs e) 
{ 
    // Check the exitcode for possible errors happened during execution. 
    MessageBox.Show(this.procOutput); 
} 
+0

빠른 견해로 질문을 업데이트했습니다. – Karan

+0

나는 당신의 방법을 시도했다. 나는 varup 문자열을 출력 할 수 없다 (항상 비어 있음). 표준 동기 메소드 (readToEnd() 및 Console.WriteLine() 사용)는 예상 출력을 인쇄합니다. – Karan

+0

이상합니다. 'ProcOutputDataReceivedHandler'에 중단 점을 설정하여 실제로 적중하는지 체크 할 수 있습니까? 그렇다면 'e.Data'의 내용은 무엇입니까? – Koen

관련 문제