ProcessStartInfo.RedirectStandardOutput プロパティ
アセンブリ: System (system.dll 内)

Dim instance As ProcessStartInfo Dim value As Boolean value = instance.RedirectStandardOutput instance.RedirectStandardOutput = value
/** @property */ public boolean get_RedirectStandardOutput () /** @property */ public void set_RedirectStandardOutput (boolean value)
public function get RedirectStandardOutput () : boolean public function set RedirectStandardOutput (value : boolean)
出力を Process.StandardOutput に書き込む場合は true。それ以外の場合は false。

Process がテキストを標準ストリームに書き込むと、通常、そのテキストはコンソールに表示されます。StandardOutput ストリームをリダイレクトすることにより、プロセスの出力を操作したり、非表示にしたりできます。たとえば、テキストのフィルタ処理、異なる書式設定の適用、またはコンソールおよび指定したログ ファイルの両方への出力の書き込みを実行できます。
![]() |
---|
RedirectStandardOutput を true に設定するには、UseShellExecute を false に設定する必要があります。設定されていない場合は、StandardOutput ストリームからの読み取りを行うと例外がスローされます。 |
リダイレクトされた StandardOutput ストリームの読み取りは、同期または非同期で実行できます。Read、ReadLine、および ReadToEnd のようなメソッドは、プロセスの出力ストリームで同期読み取り操作を実行します。これらの同期読み取り操作は、関連する Process がその StandardOutput ストリームに書き込むか、ストリームを閉じるまで完了しません。
対照的に、BeginOutputReadLine は StandardOutput ストリームで非同期読み取り操作を開始します。このメソッドは、ストリーム出力に指定されたイベント ハンドラを有効にした後、直ちに呼び出し元に制御を返します。これにより、呼び出し元は、ストリーム出力がイベント ハンドラにリダイレクトされている間に他の作業を実行できます。
同期読み取り操作により、StandardOutput ストリームから読み取る呼び出し元と、そのストリームに書き込む子プロセスの間に依存関係が発生します。この依存関係によってデッドロック状態が発生する場合があります。呼び出し元が子プロセスのリダイレクトされたストリームから読み取る場合、呼び出し元は子に依存します。子がストリームに書き込むまで、またはストリームが閉じるまで、呼び出し元は読み取り操作を待機します。子プロセスから書き込まれるデータによってリダイレクトされたストリームが満杯になる場合、子プロセスは親に依存します。子プロセスは、満杯になったストリームから親がデータを読み取るまで、またはストリームを閉じるまで、次の書き込み操作を待機します。デッドロック状態では、呼び出し元および子プロセスは互いに操作が完了するまで待機するので、どちらも操作を続行できません。デッドロックを回避するには、呼び出し元と子プロセスとの依存関係を検査します。
リダイレクトされたストリームから読み取り、子プロセスが終了するまで待機する方法を、次の C# コード例に示します。
// Start the child process. Process p = new Process(); // Redirect the output stream of the child process. p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "Write500Lines.exe"; p.Start(); // Do not wait for the child process to exit before // reading to the end of its redirected stream. // p.WaitForExit(); // Read the output stream first and then wait. string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();
このコード例では、p.WaitForExit の前に p.StandardOutput.ReadToEnd を呼び出してデッドロックを回避しています。親プロセスが p.StandardOutput.ReadToEnd の前に p.WaitForExit を呼び出し、リダイレクトされたストリームが満杯になるまで子プロセスがテキストを書き込む場合、デッドロック状態が発生する可能性があります。親プロセスは、子プロセスが終了するまで無期限に待機することになります。子プロセスは、満杯になった StandardOutput ストリームから親がデータを読み取るまで、無期限に待機することになります。
標準出力および標準エラー ストリームの両方からすべてのテキストを読み取る場合にも類似の問題が発生します。両方のストリームで読み取り操作を実行する C# コード例を次に示します。
// Do not perform a synchronous read to the end of both // redirected streams. // string output = p.StandardOutput.ReadToEnd(); // string error = p.StandardError.ReadToEnd(); // p.WaitForExit(); // Use asynchronous read operations on at least one of the streams. p.BeginOutputReadLine(); string error = p.StandardError.ReadToEnd(); p.WaitForExit();
このコード例では、StandardOutput ストリームで非同期読み取り操作を実行してデッドロック状態を回避しています。親プロセスが p.StandardOutput.ReadToEnd の後に p.StandardError.ReadToEnd を呼び出し、エラー ストリームが満杯になるまで子プロセスがテキストを書き込む場合、デッドロック状態が発生する可能性があります。親プロセスは、子プロセスが StandardOutput ストリームを閉じるまで無期限に待機することになります。子プロセスは、満杯になった StandardError ストリームから親がデータを読み取るまで、無期限に待機することになります。
非同期読み取り操作を使用すると、これらの依存関係およびデッドロックの可能性を回避できます。デッドロック状態を回避するには、2 つのスレッドを作成して個別のスレッドで各ストリームの出力を読み取る方法もあります。

compiler.StartInfo.FileName = "csc.exe" compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs" compiler.StartInfo.UseShellExecute = False compiler.StartInfo.RedirectStandardOutput = True compiler.Start() Console.WriteLine(compiler.StandardOutput.ReadToEnd()) compiler.WaitForExit()
Process compiler = new Process(); compiler.StartInfo.FileName = "csc.exe"; compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs"; compiler.StartInfo.UseShellExecute = false; compiler.StartInfo.RedirectStandardOutput = true; compiler.Start(); Console.WriteLine(compiler.StandardOutput.ReadToEnd()); compiler.WaitForExit();
Process^ compiler = gcnew Process; compiler->StartInfo->FileName = "cl.exe"; compiler->StartInfo->Arguments = "/clr stdstr.cpp /link /out:sample.exe"; compiler->StartInfo->UseShellExecute = false; compiler->StartInfo->RedirectStandardOutput = true; compiler->Start(); Console::WriteLine( compiler->StandardOutput->ReadToEnd() ); compiler->WaitForExit();

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


Weblioに収録されているすべての辞書からProcessStartInfo.RedirectStandardOutput プロパティを検索する場合は、下記のリンクをクリックしてください。

- ProcessStartInfo.RedirectStandardOutput プロパティのページへのリンク