2011-10-21 23 views
2

有很多示例顯示如何重定向另一個應用程序的stdout。不過,我想讓應用程序保留它的stdout,並只在我的父進程中檢索stdout的副本。這可能嗎?如何複製進程的標準輸出(複製,不重定向)?

我的場景:我有一些測試(使用Visual Studio Test Runner)啓動外部進程(服務器)來執行測試。服務器在其stdout中輸出很多有用的調試信息,我希望將其包含在我的測試結果中。

我可以捕獲過程輸出並通過Trace.WriteLine輸出,以便稍後顯示在測試細節中。然而,在測試運行時看到服務器窗口及其輸出,以查看當前進度(測試可以運行很長時間)會很好。

所以我正在尋找方法來複制這些信息,而不是簡單地重定向它。

任何想法?

+0

mmm也許回聲/ T恤流可能有幫助嗎? http://www.codeproject.com/KB/dotnet/echostream.aspx(google'c#tee stream'更多點擊) – sehe

+0

不確定,因爲我無法在這裏測試,但可能是這樣的,Process.OutputDataReceived事件給你所需的行爲,請參閱:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx – Polity

+0

OutputDataReceived是我正在使用,但它需要流重定向,因此刪除從服務器控制檯窗口的輸出... – aKzenT

回答

1

如何編寫一個將STDIN轉發到STDOUT的小程序,同時還要對其執行其他操作?

然後,您可以將啓動服務器進程的命令替換爲啓動服務器進程的命令,並將其輸出傳送到上述實用程序。這樣您就可以對輸出進行編程訪問,並在輸出窗口中實時查看。

+0

是的,這是一個解決方案,我想過了,在我的測試中使用似乎有點矯枉過正。我希望有一個更簡單的解決方案。另一個(小)缺點是我的服務器使用彩色輸出,這在轉發器應用程序中是不可見的。 – aKzenT

+0

我認爲顯示服務器窗口的小好處不足以使測試代碼進一步複雜化。然而,只要做一些小的修改,您的想法就可以工作:在測試代碼中捕獲我的服務器的輸出,並將其發送到這個「回聲」程序,該程序將簡單地顯示在控制檯中。 – aKzenT

2

這會適合你嗎?

 var outputText = new StringBuilder(); 
     var errorText = new StringBuilder(); 

     using (var process = Process.Start(new ProcessStartInfo(
      @"YourProgram.exe", 
      "arguments go here") 
      { 
       RedirectStandardError = true, 
       RedirectStandardOutput = true, 
       UseShellExecute = false 
      })) 
     { 
      process.OutputDataReceived += (sendingProcess, outLine) => 
      { 
       outputText.AppendLine(outLine.Data); // capture the output 
       Console.Out.WriteLine(outLine.Data); // echo the output 
      } 

      process.ErrorDataReceived += (sendingProcess, errorLine) => 
      { 
       errorText.AppendLine(errorLine.Data); // capture the error 
       Console.Error.WriteLine(errorLine.Data); // echo the error 
      } 

      process.BeginOutputReadLine(); 
      process.BeginErrorReadLine(); 
      process.WaitForExit(); 
      // At this point, errorText and outputText StringBuilders 
      // have the captured text. The event handlers already echoed the 
      // output back to the console. 
     } 
+0

這個。通過重定向複製控制檯輸出到一個複合輸出類,將「廣播」輸出到幾個「監聽器」。有很多模式;這可能是實施起來較爲複雜的一種。 – KeithS

+0

問題是,此代碼作爲Microsoft Visual Studio測試運行器內部的單元測試的一部分運行。測試運行器本身沒有控制檯窗口... – aKzenT

相關問題