System.EnvironmentクラスのGetEnvironmentVariableメソッド・SetEnvironmentVariableメソッドを用いることにより、プロセスの環境変数の取得・設定をすることができます。 子プロセスを起動する場合には、ProcessStartInfo.EnvironmentVariablesプロパティを用いることにより環境変数を追加・削除・変更して子プロセスを起動することができます。
ここでは主にプロセスの環境変数を中心として、環境変数の取り扱いに関する事項を扱います。
環境変数の取得
名前を指定した環境変数の取得 (Environment.GetEnvironmentVariable)
Environment.GetEnvironmentVariableメソッドを使うことで現在のプロセスの環境変数を取得することができます。 このメソッドは、指定された名前の環境変数が設定されていればその値を、設定されていない場合はnull
/Nothing
を返します。 Windowsでは、このメソッドは環境変数の名前における大文字小文字の違いを無視します。 Linux等では大文字小文字の異なる環境変数は異なるものとして扱われます。
大文字小文字の違いが異なる環境変数を別のものとして扱いたい場合は、Environment.GetEnvironmentVariablesメソッドを使うことができます。
すべての環境変数の取得 (Environment.GetEnvironmentVariables)
Environment.GetEnvironmentVariablesメソッドを使うと、現在のプロセスの環境変数すべてを取得できます。 このメソッドは環境変数の名前をエントリのキー、環境変数の値をエントリの値とするIDictionary (ディクショナリ)を返します。
このメソッドが返すIDictionaryは大文字小文字の違いをチェックするため、大文字小文字を正しく指定しないと環境変数を取得できません。
IDictionaryの列挙、DictionaryEntry構造体についてはHashtableクラス §.列挙操作を参照してください。
環境変数名の大文字小文字の違いを無視するようにするには、次の例のようにStringComparer.OrdinalIgnoreCaseを用いてキーの大文字小文字の違いを無視するようなDictionaryを作成し、そこにEnvironment.GetEnvironmentVariablesメソッドの結果をコピーした上で環境変数を参照します。
Dictionaryと大文字小文字の違いの無視についてはジェネリックコレクション(2) Dictionary §.キー比較のカスタマイズ(大文字小文字の違いの無視)、StringComparerについては文字列と比較オプション・カルチャの並べ替え規則で詳しく解説しています。
環境変数の追加・変更・削除 (Environment.SetEnvironmentVariable)
環境変数を追加・変更・削除するにはEnvironment.SetEnvironmentVariableメソッドを使うことができます。
SetEnvironmentVariableメソッドで存在しない環境変数名を指定すれば、その名前で環境変数を追加することができます。 すでに同じ名前の環境変数が存在する場合は、環境変数の値が変更されます。 環境変数の値としてnull
/Nothing
や空の文字列(String.Empty)を指定した場合、その環境変数は削除されます。
環境変数の設定・取得の対象 (EnvironmentVariableTarget)
Environment.SetEnvironmentVariableメソッドでは、変更する環境変数の対象を指定するEnvironmentVariableTarget列挙体を同時に指定することができます。
EnvironmentVariableTargetを指定しなかった場合はプロセスの環境変数を変更しますが、レジストリに保存されている環境変数を変更する場合はEnvironmentVariableTargetを指定します。 例えば、システムで設定されている環境変数PATH
の値を変更したいといった場合にはEnvironmentVariableTarget.Machine
やEnvironmentVariableTarget.User
を指定します。
EnvironmentVariableTargetで指定できる値と、変更対象は次のとおりです。
EnvironmentVariableTargetの値 | 変更対象の環境変数 |
---|---|
EnvironmentVariableTarget.Machine | レジストリに保存されているシステムに共通の環境変数 (レジストリキー HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment の環境変数) |
EnvironmentVariableTarget.User | レジストリに保存されているユーザー別の環境変数 (レジストリキー HKEY_CURRENT_USER\Environment の環境変数) |
EnvironmentVariableTarget.Process | プロセスの環境変数 (EnvironmentVariableTargetを指定しなかった場合と同じ) |
Environment.GetEnvironmentVariableメソッドでも同様にEnvironmentVariableTargetを指定して環境変数の取得対象を指定することができます。
環境変数の展開 (Environment.ExpandEnvironmentVariables)
Environment.ExpandEnvironmentVariablesメソッドを使うと、文字列内に含まれる環境変数(%ENVVAR%
)を展開して環境変数に設定されている値に置換することができます。 文字列内に複数の環境変数が存在する場合は、そのすべてが置換されます。
環境変数PATH
のように複数のパスが指定されている場合は、展開される際にパスが分割されるといったことはなく、指定されている値がそのまま展開されます。 環境変数に設定されているパスを分解して展開したい場合は§.実行可能ファイルの検索などで掲載しているような方法をとる必要があります。
環境変数が存在しない場合は、%ENVVAR%
の表記は置換されずにそのまま維持されます。 空の文字列に展開されて削除されるといった動作にはなりません。
環境変数PATH
パスの分割
通常、環境変数PATH
には複数のパスが含まれる場合がほとんどで、Environment.GetEnvironmentVariableメソッドなどで環境変数PATH
を取得した場合は複数のパスが連結された状態で取得されます。
連結されたPATH
を分割するにはString.Splitメソッド(文字列の加工・編集 §.分割 (Split))を用いることができます。 WindowsではPATH
の区切り文字には";
"、Linuxなどでは":
"が用いられますが、この区切り文字はPath.PathSeparatorフィールドを参照することで取得でき、これをSplitメソッドに渡すことで実行環境に応じた区切り文字での分割を行うことができます。
Pathクラスを用いてパスをディレクトリ単位で分割したり結合したりする方法についてはパスの操作を参照してください。
実行可能ファイルの検索
where
コマンド(Windows)・which
コマンド(Linux)のようにコマンド名から実行可能ファイルのフルパスを取得するには、環境変数PATH
に設定されているディレクトリを一つずつ走査して実行可能ファイルが存在するかどうかを調べる必要があります。
以下はwhich
コマンドと同等の動作をするコードです。
パスの追加
環境変数PATH
に別のパスを追加する場合も、分割の場合と同様にPath.PathSeparatorフィールドからパス区切り文字を取得して次のようにします。
環境変数PATH
の値を分割してListに格納し、編集した上で再設定する場合は次のようにします。
環境変数PATH
にパスを追加して子プロセス(外部アプリケーション)を起動する方法については§.子プロセスの環境変数も参照してください。
Listクラスの扱い方についてはジェネリックコレクション(1) Listを参照してください。
子プロセスの環境変数
Process.Startメソッドなどによって子プロセス(外部アプリケーション)を起動する際、環境変数は起動した子プロセスにも引き継がれるため、Environment.SetEnvironmentVariableメソッドによって設定した環境変数は子プロセスでも同じ値が用いられます。 一方、ProcessStartInfoクラスを用いることによって、起動する子プロセスの環境変数だけを設定することができます。
特に環境変数を設定しない場合は親プロセスの環境変数がそのまま引き継がれますが、ProcessStartInfo.EnvironmentVariablesプロパティを設定することで、親プロセスの環境変数を上書き(あるいは変更・削除)した状態で子プロセスを起動することができます。 親プロセスとは異なる環境変数で子プロセスを実行させたい場合にはこのプロパティを使って環境変数を変更します。
EnvironmentVariablesプロパティで環境変数の値としてnull
/Nothing
や空の文字列(String.Emptyを指定した場合、その環境変数は削除されます。 EnvironmentVariablesプロパティを変更する場合、Windows環境では大文字小文字の違いは無視されます。 一方、Linux等では大文字小文字の違いが意識される点に注意してください(大文字小文字が異なる環境変数名は別のものとして扱われます)。
Process.Startメソッドによるプロセスの起動では、コマンド・実行可能ファイルの検索に際して環境変数PATH
の値が参照されます。 環境変数PATH
が適切に設定されていれば、フルパスを指定しなくてもコマンド・実行可能ファイルを起動することができます。
この他、子プロセスの起動や、プロセス起動時のオプションについてはプロセス §.子プロセスの起動オプションを参照してください。 また、Pathクラスによるパスの分割・結合などの操作についてはパスの操作を参照してください。
環境変数と代替機能
ロケール情報(環境変数LANG・環境変数LC_*)
Windowsではコントロールパネルの地域と言語のオプションが用いられるため、環境変数LANG
の設定は実行時の動作に影響しません。 一方Linux等では環境変数LANG
の設定に応じたロケールが用いられます。 詳しくはカルチャの基本・種類・カルチャ情報の取得 §.作成したスレッドのカルチャを参照してください。
また、LC_ALL
・LC_NUMERIC
・LC_TIME
などロケールに関する設定は、.NET FrameworkにおいてはカルチャとしてCultureInfoクラスによって扱われ、スレッド毎に設定・変更することができます。 詳しくはカルチャの基本・種類・カルチャ情報の取得およびカルチャと書式・テキスト処理・暦を参照してください。
システムディレクトリ・ホームディレクトリなどの取得
システムディレクトリ(%SystemRoot%
)・ホームディレクトリ(%USERPROFILE%
, HOME
)・一時ディレクトリ(%TEMP%
)など、システムで定義されている特殊なディレクトリは、環境変数から直接取得するよりもEnvironment.GetFolderPathメソッドを使うことによって取得することが推奨されます。
Environment.GetFolderPathメソッドを使った各種ディレクトリのパスの取得についてはランタイム・システム・プラットフォームの情報 §.特別なディレクトリで解説しています。
一時ディレクトリ(TMP
・TEMP
)・一時ファイルについては一時ディレクトリを取得する・一時ファイルを作成するを参照してください。
プラットフォーム・実行環境の情報の取得
プラットフォームや実行環境など、環境変数からでは取得できない情報の取得に関してはランタイム・システム・プラットフォームの情報およびプロセス・アセンブリの情報で解説しています。
実行時の動作変更
.NET Frameworkでは、実行時の動作オプションを指定する目的にXML形式のアプリケーション構成ファイル(*.exe.config
)を用いることができます。 .NETランタイムのオプションを設定する場合にも構成ファイルが用いられます。 詳細については以下のドキュメントを参照してください。