Process.StandardError プロパティ
アプリケーションのエラー出力の読み取りに使用されるストリームを取得します。
Public ReadOnly Property StandardError As StreamReader
[C#]
public StreamReader StandardError {get;}
[C++]
public: __property StreamReader* get_StandardError();
[JScript]
public function get StandardError() : StreamReader;
プロパティ値
アプリケーションの標準エラー ストリームの読み取りに使用できる StreamReader 。
例外
例外の種類 | 条件 |
---|---|
InvalidOperationException | StandardError 値が定義されていません。 StartInfo プロパティの RedirectStandardError が false である可能性があります。 |
解説
StandardError プロパティを使用するには、 StartInfo プロパティの RedirectStandardError プロパティに true が指定されている必要があります。それ以外の場合は、 StandardError プロパティを読み取ると例外がスローされます。
メモ StandardError を true に設定するには、 StartInfo プロパティの UseShellExecute が false になっている必要があります。
Process コンポーネントは、パイプを使用して子プロセスと通信します。子プロセスからパイプに書き込まれるデータによってバッファが満杯になる場合は、親プロセスがパイプからデータを読み取るまで、子プロセスがブロックされます。アプリケーションが、標準エラー出力および標準出力へのすべての出力を読み取る場合、このブロック処理がデッドロックの原因になることがあります。この例を次の C# コードに示します。
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.FileName = "test.exe";
p.Start();
p.WaitForExit();
string output = p.StandardError.ReadToEnd();
このインスタンスでは、パイプが満杯になると子プロセスが完了しなくなりますが、親プロセスは子プロセスの終了を永久に待機し続けます。そのため、親プロセスと子プロセスの両方でブロックが発生します。
この問題は、次のように、 ReadToEnd()
を WaitForExit()
の前に移動することによって解決できます。
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.FileName = "test.exe";
p.Start();
string output = p.StandardError.ReadToEnd();
p.WaitForExit();
標準出力と標準エラー出力の両方をリダイレクトし、両方を読み取ろうとすると、似た問題が発生します。この例を次の C# コードで示します。
string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.ReadToEnd();
p.WaitForExit();
この例では、親プロセスは標準出力からの読み取りを終了するまで標準エラー出力から読み取ることができないため、子プロセスが標準エラー出力にテキストを書き込むと、プロセスがブロックされます。しかし、親プロセスはプロセスが終了するまで標準出力から読み取りません。この問題の解決方法としては、アプリケーションがそれぞれのスレッドでそれぞれのストリームの出力を読み取ることができるように、2 つのスレッドを作成する方法をお勧めします。
使用例
[Visual Basic, C#, C++] ユーザーにより渡された引数を net use コマンドで使用して、ネットワーク リソースをマップする例を次に示します。この例では、次に net.exe の標準エラー出力を読み取り、それをコンソールに書き込みます。
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo("net ", "use " + args(1))
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardError = True
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
Dim myStreamReader As StreamReader = myProcess.StandardError
' Read the standard error of net.exe and write it on to console.
Console.WriteLine(myStreamReader.ReadLine())
myProcess.Close()
[C#]
Process myProcess = new Process();
ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("net ","use "+ args[0]);
myProcessStartInfo.UseShellExecute = false;
myProcessStartInfo.RedirectStandardError = true;
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
StreamReader myStreamReader = myProcess.StandardError;
// Read the standard error of net.exe and write it on to console.
Console.WriteLine( myStreamReader.ReadLine());
myProcess.Close();
[C++]
Process* myProcess = new Process();
ProcessStartInfo* myProcessStartInfo = new ProcessStartInfo(S"net ", String::Concat(S"use ", args[0]));
myProcessStartInfo->UseShellExecute = false;
myProcessStartInfo->RedirectStandardError = true;
myProcess->StartInfo = myProcessStartInfo;
myProcess->Start();
StreamReader* myStreamReader = myProcess->StandardError;
// Read the standard error of net.exe and write it on to console.
Console::WriteLine(myStreamReader->ReadLine());
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 | StandardOutput | ProcessStartInfo.RedirectStandardError