2011-10-21 7 views
2

他のアプリケーションの標準出力をリダイレクトする方法を示す多くの例があります。しかし、私はアプリケーションがstdoutを維持し、親プロセスのstdoutのコピーのみを取得するようにしたいと思います。これは可能ですか?プロセスの標準出力をコピーするにはどうすればいいですか(コピー、リダイレクトはしません)?

私のシナリオ:私は彼らのテストを行うための外部プロセス(サーバー)を起動する(Visual Studioのテストランナーを使用して)いくつかのテストを持っています。サーバーは、テスト結果に含めるstdoutに多くの有用なデバッグ情報を出力します。

私はそれが後でテストの詳細に表示できるようにTrace.WriteLineを介してプロセスの出力と、それをキャプチャすることができます。しかし、現在の進捗状況を確認するためにテストが実行されている間に、サーバーウィンドウに出力を表示すると良いでしょう(テストは長い時間稼働している可能性があります)。

私はこの情報を単純にリダイレクトするのではなくコピーする方法を探しています。

アイデア?

+0

mmmおそらくエコー/ティーストリームは役に立ちますか? 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に転送する小さなプログラムを作成すると同時に、他の処理も同時に行うのはどうでしょうか?

次に、上記のユーティリティにパイプ、その出力を開始し1でのサーバ・プロセスを起動するコマンドを置き換えることができます。そのようにすれば、出力へのプログラムによるアクセスと、出力ウィンドウでリアルタイムに見ることができます。

+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

関連する問題