【CMD】別の変数への参照を含む環境変数(set・setx)

コマンドプロンプト

変数値に別の変数の参照を含める場合の挙動の違い

環境変数の設定を行う場合、値の一部に、変数名を % で囲んだ文字列を使用することで、別の環境変数の値を含めることができます。( %による環境変数の参照

以下は、COMPUTERNAMEUSERNAME の値を使用して、環境変数PROMPT の設定を行っている例です。それぞれ %COMPUTERNAME%%USERNAME% とすることで、変数の値を PROMPT に含めています。

# 環境変数 COMPUTERNAME の値は「TEST-PC」
$ set COMPUTERNAME
COMPUTERNAME=TEST-PC

# 環境変数 USERNAME の値は「user01」
$ set USERNAME
USERNAME=user01

# % で囲むことで COMPUTERNAME と USERNAME の値を
# 使用して環境変数 PROMPT の値を設定する
$ set PROMPT=[%USERNAME%@%COMPUTERNAME%]$$$S

# 別の環境変数の値を参照して設定できている
[user01@TEST-PC]$ set PROMPT
PROMPT=[user01@TEST-PC]$$$S

このように別の変数の値を使用して環境変数の設定を行うことができますが、setコマンドで行う一時的な設定と、setxコマンド(または環境変数の設定画面)で行う永続的な設定とでは、挙動が異なる場合があります。ここではこの点について整理していきます。

環境変数の値に別の変数の参照を含める場合、設定方法によって挙動が異なる。

  • 一時設定
    • CUI(setコマンド)
  • 永続設定
    • CUI(setxコマンド)
    • GUI(環境変数の設定画面)

一時設定 – CUI(setコマンド)

setコマンドによる一時的な設定の場合、設定値に含まれる %<変数>% は先に展開され、固定の文字列として使用されます。そのため、setコマンド実行後に参照元の変数に対して変更や削除を行っても、これらは反映されません。

setコマンドによる環境変数の一時設定の詳細

具体的な挙動を見る方が分かりやすい場合、実際の例は以下を確認してください。

永続設定 – CUI(setxコマンド)または GUI(設定画面)

CUI(setxコマンド)や GUI(環境変数の設定画面)から永続的な設定を行う場合、設定値に含まれる %<変数>% は、設定後であっても参照元の <変数> の変更が反映されます。(※ただし、参照元の <変数> に対する変更も、永続設定として実施する必要があります。setコマンドでの変更は反映されません。)

setxや設定画面での環境変数の永続設定の詳細

具体的な挙動を見る方が分かりやすい場合、実際の例は以下を確認してください。

またこの時、環境変数の設定画面やsetコマンドでは、実際に取得できる環境変数の値を確認することはできますが、その値が直接設定されているものなのか、別の環境変数を参照しているものなのかは判別できません。この場合、編集画面を開いて変数値の欄を確認する必要があります。

永続設定時の挙動の例外(環境変数PATH)

環境変数 PATH に対して別の変数の参照を含む値を永続的に設定する場合は、さらに異なる例外的な挙動となるため注意が必要です。CUI(setxコマンド)で永続設定する場合と、GUI(設定画面)で永続設定する場合とで、参照元の変数が反映されるか否かが変ってきます。詳細については以下を参照してください。

CUIとGUIの永続設定の違い(環境変数 PATH に別の変数の参照を含む場合)

一時設定と永続設定の参照の違い

環境変数 PATH の例外はありますが、setコマンドで行う一時的な設定と、setxコマンド(または環境変数の設定画面)で行う永続的な設定との違いは下記の通りです。

環境変数の設定値に %<変数>% を含める際の挙動

  • 一時設定
    • 参照元の<変数>の状態が反映されない。
    • 設定時点で展開された値は固定の文字列と認識される。
  • 永続設定
    • 参照元の<変数>の状態が反映される。
    • 設定時に使用された変数への参照が維持される。
参照元の<変数>の状態一時設定(setコマンド)永続設定(setxコマンド / 設定画面)
<変数>が未定義の場合文字列「%<変数>%」が設定される。
※ 後から定義されても「%<変数>%」のままになる。
文字列「%<変数>%」が設定される。
※ 後から定義されると<変数>の値が反映される。
<変数>が定義済の場合<変数>の値が固定の文字列として設定される。
※ 参照元の<変数>の値の変更は反映されない。
<変数>の値が設定される。
※ 参照元の<変数>の値の変更は反映される。
<変数>が削除された場合設定時の参照元の<変数>の値が設定されたままになる。
※ 既に<変数>を参照しておらず削除の影響を受けない。
値に文字列「%<変数>%」が設定された状態になる。
※ 参照元の<変数>が再定義されると値にも反映される。
タイトルとURLをコピーしました