Process.StandardOutput プロパティ
アプリケーションの出力の読み取りに使用されるストリームを取得します。
Public ReadOnly Property StandardOutput As StreamReader
[C#]
public StreamReader StandardOutput {get;}
[C++]
public: __property StreamReader* get_StandardOutput();
[JScript]
public function get StandardOutput() : StreamReader;
プロパティ値
アプリケーションの標準出力ストリームの読み取りに使用できる StreamReader 。
例外
例外の種類 | 条件 |
---|---|
InvalidOperationException | StandardOutput 値が定義されていません。 StartInfo プロパティの RedirectStandardOutput が false である可能性があります。 |
解説
StandardOutput を使用するには、 StartInfo プロパティの RedirectStandardOutput プロパティを true に指定しておく必要があります。設定しない場合は、 StandardOutput プロパティを読み取ると例外がスローされます。
メモ StandardOutput を true に設定するには、 StartInfo プロパティの UseShellExecute が false になっている必要があります。
Process コンポーネントは、パイプを使用して子プロセスと通信します。子プロセスからパイプに書き込まれるデータによってバッファが満杯になる場合は、親プロセスがパイプからデータを読み取るまで、子プロセスがブロックされます。アプリケーションが、標準エラー出力および標準出力へのすべての出力を読み取る場合、このブロック処理がデッドロックの原因になることがあります。この例を次の C# コードに示します。
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "test.exe";
p.Start();
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
このインスタンスでは、パイプが満杯になると子プロセスが完了しなくなりますが、親プロセスは子プロセスの終了を永久に待機し続けます。そのため、親プロセスと子プロセスの両方でブロックが発生します。
この問題は、次のように、 ReadToEnd()
を WaitForExit()
の前に移動することによって解決できます。
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "test.exe";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
標準出力と標準エラー出力の両方をリダイレクトし、両方を読み取ろうとすると、似た問題が発生します。この例を次の C# コードで示します。
string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();
この例では、親プロセスは標準出力からの読み取りを終了するまで標準エラー出力から読み取ることができないため、子プロセスが標準エラー出力にテキストを書き込むと、プロセスがブロックされます。しかし、親プロセスはプロセスが終了するまで標準出力から読み取りません。この問題の解決方法としては、アプリケーションがそれぞれのスレッドでそれぞれのストリームの出力を読み取ることができるように、2 つのスレッドを作成する方法をお勧めします。
使用例
[Visual Basic, C#, C++] ユーザー定義の新しい実行可能ファイルを作成し、その標準出力を読み取る例を次に示します。読み取った出力は、コンソールに表示します。
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo("Process_StandardOutput_Sample.exe")
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
Dim myStreamReader As StreamReader = myProcess.StandardOutput
' Read the standard output of the spawned process.
Dim myString As String = myStreamReader.ReadLine()
Console.WriteLine(myString)
myProcess.Close()
[C#]
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("Process_StandardOutput_Sample.exe" );
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardOutput = true;
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
StreamReader myStreamReader = myProcess.StandardOutput;
// Read the standard output of the spawned process.
string myString = myStreamReader.ReadLine();
Console.WriteLine(myString);
myProcess.Close();
[C++]
Process* myProcess = new Process();
ProcessStartInfo* myProcessStartInfo = new ProcessStartInfo(S"Process_StandardOutput_Sample.exe");
myProcessStartInfo->UseShellExecute = false;
myProcessStartInfo->RedirectStandardOutput = true;
myProcess->StartInfo = myProcessStartInfo;
myProcess->Start();
StreamReader* myStreamReader = myProcess->StandardOutput;
// Read the standard output of the spawned process.
String* myString = myStreamReader->ReadLine();
Console::WriteLine(myString);
myProcess->Close();
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
.NET Framework セキュリティ:
- SecurityPermission (完全信頼を指定して System.Diagnostic.Process のメンバを呼び出すためのアクセス許可) PermissionState.Unrestricted (関連する列挙体)
参照
Process クラス | Process メンバ | System.Diagnostics 名前空間 | StandardInput | StandardError | ProcessStartInfo.RedirectStandardOutput