子プロセスの標準入力への書き込みを行うには、ProcessStartInfoのRedirectStandardInputプロパティをtrue
にした上で子プロセスを起動します。 次に、起動した子プロセスのStandardInputプロパティに設定されるStreamWriterを取得します。 これに対して書き込みを行うことにより、子プロセスの標準入力へ書き込むことができます。
例として、親プロセスparent.exeから子プロセスchild.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
' 子プロセスを起動する
Using child As Process = Process.Start(psi)
' リダイレクトされた子プロセスの標準入力を取得する
Using stdin As StreamWriter = child.StandardInput
' 標準入力にテキストを書き込む
stdin.WriteLine("line1")
stdin.WriteLine("line2")
stdin.WriteLine("line3")
End Using ' 標準入力を閉じて書き込みを終了する
' 子プロセスの終了を待機する
child.WaitForExit()
End Using
End Sub
End Class
Imports System
Class Sample
Shared Sub Main()
Dim lineNumber As Integer = 0
Do
' 標準入力から1行読み込む
Dim line As String = Console.ReadLine()
' これ以上読み込めない場合は終了
If line Is Nothing Then Exit Do
' 読み込んだ行に行番号を付けて標準出力に書き込む
lineNumber += 1
Console.WriteLine($"{lineNumber}: {line}")
Loop
End Sub
End Class
>parent.exe
1: line1
2: line2
3: line3
このようにして子プロセスの標準入力に書き込みを行うことができます。 子プロセスの標準入力はStreamWriterとして取得できるため、ファイル等への書き込みと同様にStreamWriterのメソッドを使って書き込みを行うことができます。
なお、この例でのchild.exeは標準入力から読み込めなくなるまで読み込みを続けるようになっています。 標準入力の末尾(EOF)に到達するまで読み込み続けるようなプロセスを起動する場合、親プロセスは子プロセスの終了を待機する一方、子プロセスは標準入力が閉じられるまで読み込みを続けようとし、互いに待機状態となったまま処理が進行しないという状況が起こり得ます。 このため親プロセス側では、子プロセスの終了を待機する前にusingステートメントやCloseメソッドの呼び出しによって標準入力を閉じる必要があります。
標準入力を含め標準ストリームをリダイレクトするためにはProcessStartInfo.UseShellExecuteがfalse
である必要があります。 .NET Core/.NET 5以降ではデフォルトでfalse
となっている一方、.NET Frameworkではtrue
となっているため、明示的に指定する必要があります。
子プロセスを起動する際にコマンドライン引数を指定する方法についてはプロセス §.子プロセスのコマンドライン引数を、その他起動時のオプションについてはプロセス §.子プロセスの起動およびプロセス §.子プロセスの起動オプションを参照してください。