ConsoleクラスのSetIn・SetOut・SetErrorの各メソッドを使うことにより、自プロセスの標準ストリームをリダイレクトすることができます。 (自プロセスの標準入出力 §.標準ストリームのリダイレクト) これと子プロセスの標準ストリームのリダイレクトを組み合わせることにより、自プロセスと子プロセスの標準ストリームをパイプ(pipe)することができます。
標準ストリームをパイプするとは、自プロセスの標準出力の出力先を子プロセスの標準入力の入力元とする、また逆に子プロセスの標準出力の出力先を自プロセスの標準入力の入力元とすることで、これによりプロセス間で標準ストリームを介したやりとりをすることができます。
自プロセス | ⇄ | 子プロセス |
---|---|---|
標準出力 Console.Out |
→ | 標準入力 Console.In |
標準入力 Console.In |
← | 標準出力 Console.Out |
parent.exe:自プロセスと子プロセスの標準入出力をパイプする
Imports System
Imports System.Diagnostics
Imports System.IO
Class Sample
Shared Sub Main()
' 子プロセスchild.exeの起動オプション
Dim psi As New ProcessStartInfo("child.exe")
' シェルを使用せず子プロセスを起動する
' (リダイレクトするために必要)
' ⚠.NET Core/.NET 5以降ではデフォルトでFalseとなっている
psi.UseShellExecute = False
' 起動した子プロセスの標準入出力をリダイレクトする
psi.RedirectStandardInput = True
psi.RedirectStandardOutput = True
' 子プロセスを起動する
Using child As Process = Process.Start(psi)
Dim output As String = Nothing
' 初期状態での親プロセスの標準入出力を退避しておく
Dim initialIn As TextReader = Console.In
Dim initialOut As TextWriter = Console.Out
' リダイレクトされた子プロセスの標準入出力を取得する
Using stdin As StreamWriter = child.StandardInput, _
stdout As StreamReader = child.StandardOutput
' 親プロセスの標準出力を子プロセスの標準入力へリダイレクトする
Console.SetOut(stdin)
' 親プロセスの標準入力を子プロセスの標準出力へリダイレクトする
Console.SetIn(stdout)
' 親プロセスの標準出力へ書き込む
' →リダイレクトした子プロセスの標準入力に書き込まれる
Console.WriteLine("hello, world!")
' 親プロセスの標準入力から読み込む
' →リダイレクトした子プロセスの標準出力から読み込まれる
output = Console.ReadLine()
' 親プロセスの標準入出力を初期状態に元に戻す
Console.SetIn(initialIn)
Console.SetOut(initialOut)
End Using ' 子プロセスの標準入出力を閉じて読み書きを終了する
' 子プロセスの終了を待機する
child.WaitForExit()
' 読み込んだテキストを表示する
' (初期状態に戻した標準出力へ書き込む)
Console.WriteLine($"output: ""{output}""")
End Using
End Sub
End Class
child.exe:標準入力から読み込み標準出力へ書き込む
Imports System
Class Sample
Shared Sub Main()
' 標準入力から読み込む
' →親プロセスの標準出力に書き込まれた内容が読み込まれる
Dim line As String = Console.ReadLine()
' 標準出力へ書き込む
' →親プロセスの標準入力で読み込まれる内容として書き込まれる
Console.WriteLine(line.ToUpper()) ' 入力を大文字化して出力
End Sub
End Class
実行結果
>parent.exe
output: "HELLO, WORLD!"
Console.SetIn/SetOut/SetErrorの各メソッドを使って自プロセスの標準ストリームをリダイレクトすると、Consoleクラスでの入出力先はリダイレクト先へと変更されます。 Consoleクラスのデフォルトの入出力ストリームは、プロセスを起動したターミナルやコマンドプロンプト、IDEの出力ウィンドウなどに接続されているため、標準出力・標準エラーをリダイレクトすると以降そこには一切出力されなくなります。