ProcessStartInfoクラスを用いると、引数以外にも子プロセス起動時のオプションや動作を細かく指定することができます。 環境変数やカレントディレクトリを変更した状態で起動したい場合には、ProcessStartInfoクラスを使って子プロセスを起動する必要があります。
例として、コマンドなどを子プロセスとして起動したい場合・シェルを使用して起動したい場合には、UseShellExecuteをtrue
にします。 逆に、実行可能ファイルを直接指定して子プロセスとして起動したい場合や、標準入出力を扱いたい場合、環境変数を設定して起動する場合は、false
にする必要があります。 UseShellExecuteはランタイムによってデフォルト値が異なり、.NET Frameworkではtrue
、.NET Core/.NET 5ではfalse
となっています。
また、Windows上でコマンドラインプロセス(コンソールアプリケーション)を起動する場合にDOSプロンプトウィンドウを表示したくない場合には、CreateNoWindowにtrue
を指定して起動します。 CreateNoWindowはデフォルトではfalse
となっています。
ProcessStartInfoクラスでオプションを指定して子プロセスを起動する
using System;
using System.Diagnostics;
class Sample {
static void Main()
{
// 子プロセスchild.exeの起動パラメータを作成する
var psi = 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 (var child = Process.Start(psi)) {
// 子プロセスの終了を待機する
child.WaitForExit();
}
}
}
子プロセスの起動と環境変数の設定については環境変数 §.子プロセスの環境変数でも解説しています。