子プロセスの標準出力からの読み込みを行う場合は、ProcessStartInfoのRedirectStandardOutpoutプロパティをtrue
にして子プロセスを起動します。 次に、起動した子プロセスのStandardOutputプロパティに設定されるStreamReaderを取得します。 これに対して読み込みを行うことにより、子プロセスの標準出力を読み込むことができます。
標準エラーの場合も同様に、RedirectStandardErrorプロパティをtrue
にし、StandardErrorプロパティのStreamReaderから読み込みます。
例として、親プロセスparent.exeから子プロセスchild.exeを起動し、子プロセスの標準出力・標準エラーからテキストを読み込む場合は次のようになります。
using System;
using System.Diagnostics;
class Sample {
static void Main()
{
// 子プロセスchild.exeの起動オプション
var psi = new ProcessStartInfo("child.exe") {
// シェルを使用せず子プロセスを起動する
// (リダイレクトするために必要)
// ⚠.NET Core/.NET 5以降ではデフォルトでfalseとなっている
UseShellExecute = false,
// 起動した子プロセスの標準出力・標準エラーをリダイレクトする
RedirectStandardOutput = true,
RedirectStandardError = true,
};
// 子プロセスを起動する
using (var child = Process.Start(psi)) {
string output = null;
string error = null;
// リダイレクトされた子プロセスの標準出力を取得する
using (var stdout = child.StandardOutput)
using (var stderr = child.StandardError) {
// 標準出力に書き込まれたテキストをすべて読み込む
output = stdout.ReadToEnd();
// 標準エラーに書き込まれたテキストをすべて読み込む
error = stderr.ReadToEnd();
} // 標準出力・標準エラーを閉じて読み込みを終了する
// 子プロセスの終了を待機する
child.WaitForExit();
// 読み込んだテキストを表示する
Console.WriteLine($"output: \"{output}\"");
Console.WriteLine($"error: \"{error}\"");
}
}
}
using System;
class Sample {
static void Main()
{
// 標準出力・標準エラーにテキストを書き込む
Console.Write("Hello, ");
Console.WriteLine("stdout!");
Console.Error.WriteLine("Hello, stderr!");
Console.WriteLine("Hello, stdout!");
}
}
>parent.exe
output: "Hello, stdout!
Hello, stdout!
"
err: "Hello, stderr!
"
このようにして子プロセスの標準出力・標準エラーから読み込みを行うことができます。 子プロセスの標準出力・標準エラーはStreamReaderとして取得できるため、ファイル等からの読み込みと同様にStreamReaderのメソッドを使って読み込みを行うことができます。
標準出力・標準エラーを含め標準ストリームをリダイレクトするためにはProcessStartInfo.UseShellExecuteがfalse
である必要があります。 .NET Core/.NET 5以降ではデフォルトでfalse
となっている一方、.NET Frameworkではtrue
となっているため、明示的に指定する必要があります。
子プロセスを起動する際にコマンドライン引数を指定する方法についてはプロセス §.子プロセスのコマンドライン引数を、その他起動時のオプションについてはプロセス §.子プロセスの起動およびプロセス §.子プロセスの起動オプションを参照してください。