子プロセスの標準入力のリダイレクトと標準出力・標準エラーのリダイレクトは同時に組み合わせることもできます。 これにより、子プロセスの標準入力に書き込み、子プロセスで何らかの処理を行った結果を標準出力から読み込む、さらに子プロセスの標準エラー出力も読み込む、といったことができます。
parent.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,
// 起動した子プロセスの標準入出力をリダイレクトする
RedirectStandardInput = true,
RedirectStandardOutput = true,
};
// 子プロセスを起動する
using (var child = Process.Start(psi)) {
string output = null;
// リダイレクトされた子プロセスの標準入出力を取得する
using (var stdin = child.StandardInput)
using (var stdout = child.StandardOutput) {
// 子プロセスの標準入力に書き込む
stdin.WriteLine("hello, world!");
// 子プロセスの標準出力から読み込む
output = stdout.ReadLine();
} // 子プロセスの標準入出力を閉じて読み書きを終了する
// 子プロセスの終了を待機する
child.WaitForExit();
// 読み込んだテキストを表示する
Console.WriteLine($"output: \"{output}\"");
}
}
}
child.exe:標準入力から読み込み標準出力へ書き込む
using System;
class Sample {
static void Main()
{
// 標準入力から読み込む
var line = Console.ReadLine();
// 標準出力へ書き込む
Console.WriteLine(line.ToUpper()); // 入力を大文字化して出力
}
}
実行結果
>parent.exe
output: "HELLO, WORLD!"
さらに、自プロセスの標準ストリームの入出力先を子プロセスの標準ストリームへリダイレクトすることにより、子プロセスの標準ストリームとパイプすることもできます。