2013-09-23 44 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();

LengthPosition和不支持的Stream類似的成員,因爲代表了一個控制檯應用程序的標準流是在長度和只進流未知。所以這很正常,而不是代碼中的錯誤。

+0

對不起,我錯過了線,而複製從Visual Studio代碼。我的錯。更新。 – 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

我覺得你非常接近我的問題。我無法獲得字符串變量的輸出(它始終爲空),但使用標準同步方法(readToEnd()和使用Console.WriteLine())會輸出預期的輸出。我認爲這與等待進程退出並填充Console.Writeline() – Karan

2

你有沒有把EnableRaisingEvents設置爲true

我不知道這是否會做的伎倆,因爲我通常做的輸出重定向以不同的方式:

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

我試過你的方法。我無法獲得字符串變量的輸出(它始終爲空),但使用標準同步方法(readToEnd()和使用Console.WriteLine())會輸出預期的輸出。 – Karan

+0

這很奇怪。你能在'ProcOutputDataReceivedHandler'中設置一個斷點來檢查它是否真的命中,如果是,e.Data'的內容是什麼? – Koen