ProcessStartInfoクラスを用いると、引数以外にも子プロセス起動時のオプションや動作を細かく指定することができます。 環境変数やカレントディレクトリを変更した状態で起動したい場合には、ProcessStartInfoクラスを使って子プロセスを起動する必要があります。
例として、コマンドなどを子プロセスとして起動したい場合・シェルを使用して起動したい場合には、UseShellExecuteをtrue
にします。 逆に、実行可能ファイルを直接指定して子プロセスとして起動したい場合や、標準入出力を扱いたい場合、環境変数を設定して起動する場合は、false
にする必要があります。 UseShellExecuteはランタイムによってデフォルト値が異なり、.NET Frameworkではtrue
、.NET Core/.NET 5ではfalse
となっています。
また、Windows上でコマンドラインプロセス(コンソールアプリケーション)を起動する場合にDOSプロンプトウィンドウを表示したくない場合には、CreateNoWindowにtrue
を指定して起動します。 CreateNoWindowはデフォルトではfalse
となっています。
ProcessStartInfoクラスでオプションを指定して子プロセスを起動する
Imports System
Imports System.Diagnostics
Class Sample
Shared Sub Main()
' 子プロセスchild.exeの起動パラメータを作成する
Dim psi As New ProcessStartInfo("child.exe")
' 子プロセスに渡すコマンドライン引数を設定する
psi.Arguments = "/arg1 /arg2 /foo=bar"
' .NET Standard 2.1/.NET Core 2.1以降では、ArgumentListプロパティを使用することもできる
' (ArgumentListプロパティでは、空白を含むパスなど、必要なエスケープが自動的に行われる)
psi.ArgumentList.Add("/arg1")
psi.ArgumentList.Add("/arg2")
psi.ArgumentList.Add("/foo=bar")
' プロセス起動時の作業ディレクトリ(カレントディレクトリ)を設定する
psi.WorkingDirectory = ".\temp\"
' 環境変数を設定する
psi.EnvironmentVariables("PATH_DATA") = ".\data\"
' プロセス起動時にウィンドウを生成しない
' (Windows上でコマンドラインプロセスを起動する場合に
' DOSプロンプトを表示せずに起動する)
psi.CreateNoWindow = True
' シェルを使用せずに子プロセスを起動する
' (環境変数を設定したり、標準ストリームをリダイレクトする場合など、
' 一部オプションを使用する際にはFalseとする必要がある)
psi.UseShellExecute = False
' 上記のパラメータで子プロセスを起動する
Using child As Process = Process.Start(psi)
' 子プロセスの終了を待機する
child.WaitForExit()
End Using
End Sub
End Class
子プロセスの起動と環境変数の設定については環境変数 §.子プロセスの環境変数でも解説しています。