子プロセスの標準出力からの読み込みを行う場合は、ProcessStartInfoRedirectStandardOutpoutプロパティtrueにして子プロセスを起動します。 次に、起動した子プロセスのStandardOutputプロパティに設定されるStreamReaderを取得します。 これに対して読み込みを行うことにより、子プロセスの標準出力を読み込むことができます。

標準エラーの場合も同様に、RedirectStandardErrorプロパティtrueにし、StandardErrorプロパティのStreamReaderから読み込みます。

例として、親プロセスparent.exeから子プロセスchild.exeを起動し、子プロセスの標準出力・標準エラーからテキストを読み込む場合は次のようになります。

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.RedirectStandardOutput = True
    psi.RedirectStandardError = True

    ' 子プロセスを起動する
    Using child As Process = Process.Start(psi)
      Dim output As String = Nothing
      Dim err As String = Nothing

      ' リダイレクトされた子プロセスの標準出力を取得する
      Using stdout As StreamReader = child.StandardOutput, _
            stderr As StreamReader = child.StandardError
        ' 標準出力に書き込まれたテキストをすべて読み込む
        output = stdout.ReadToEnd()
        ' 標準エラーに書き込まれたテキストをすべて読み込む
        err = stderr.ReadToEnd()
      End Using ' 標準出力・標準エラーを閉じて読み込みを終了する

      ' 子プロセスの終了を待機する
      child.WaitForExit()

      ' 読み込んだテキストを表示する
      Console.WriteLine($"output: ""{output}""")
      Console.WriteLine($"err: ""{err}""")
    End Using
  End Sub
End Class
child.exe:標準出力・標準エラーにテキストを書き込む
Imports System

Class Sample
  Shared Sub Main()
    ' 標準出力・標準エラーにテキストを書き込む
    Console.Write("Hello, ")
    Console.WriteLine("stdout!")
    Console.Error.WriteLine("Hello, stderr!")
    Console.WriteLine("Hello, stdout!")
  End Sub
End Class
実行結果
>parent.exe
output: "Hello, stdout!
Hello, stdout!
"
err: "Hello, stderr!
"

このようにして子プロセスの標準出力・標準エラーから読み込みを行うことができます。 子プロセスの標準出力・標準エラーはStreamReaderとして取得できるため、ファイル等からの読み込みと同様にStreamReaderのメソッドを使って読み込みを行うことができます。

標準出力・標準エラーを含め標準ストリームをリダイレクトするためにはProcessStartInfo.UseShellExecutefalseである必要があります。 .NET Core/.NET 5以降ではデフォルトでfalseとなっている一方、.NET Frameworkではtrueとなっているため、明示的に指定する必要があります。

子プロセスを起動する際にコマンドライン引数を指定する方法についてはプロセス §.子プロセスのコマンドライン引数を、その他起動時のオプションについてはプロセス §.子プロセスの起動およびプロセス §.子プロセスの起動オプションを参照してください。