
答案1
SystemRoot
按預期擴展,因為它是偽/預定義的環境變數。WinDir
是一個常規環境變量,並且與其他變量“競爭”,就像PATH
在初始化序列中一樣。
Raymond Chen 的最佳解釋為:Windows 機密:隱藏變數:「將一個環境變數嵌入到另一個環境變數中只是一個好的操作時機問題」。引用更多:
以下是環境建構過程的工作原理。它大致分為四個步驟:
- 首先,系統會建立一些預先定義的電腦範圍環境變量,例如 SystemRoot 和 ALLUSERSPROFILE(但不包括 COMPUTERNAME 或 ProgramFiles)。
- 其次,它從「環境變數」對話框的「系統」部分建立環境變數。系統環境變數定義可以使用「%」符號來引用上一個步驟中建立的預定義環境變數。例如,您可以將系統環境變數設定為 %SystemDrive%\Extras。系統環境完成後,Windows開始建置使用者環境。
- 第三步是建立預先定義的每個使用者環境變量,例如 USERPROFILE 和 APPDATA。與 COMPUTERNAME 和 ProgramFiles 相關的變數也在此處創建,即使它們在技術上是系統變數而不是每個使用者變數。
- 最後,系統建立環境變數。它們位於「環境變數」對話方塊的「使用者」部分,可以存取前三個步驟建立的任何變量,因此您可以將使用者環境變數設定為%USERPROFILE%\Extras 或在第二步驟中設定的自訂系統環境變數。如果使用者環境變數與系統環境變數同名,則新值將取代舊值。
…
一位客戶在將系統 PATH 環境變數設定為 %APPDATA%;C:\Windows 時遇到困難。他們發現最終的環境僅包含指定的文字路徑(百分號和全部),而不是用 APPDATA 環境變數的值取代它。如果您仔細查看之前詳細介紹的操作順序,就會清楚為什麼會發生這種情況。他們試圖根據尚未定義的變數設定係統環境變數。
解決方案很簡單:將編輯路徑從系統環境列錶框移至使用者環境列錶框。這樣,當它想要使用 %APPDATA% 環境變數時,該變數就會在那裡。
對於基於其他變數定義環境變數時可能的「競爭條件」的簡單範例,請考慮循環情況,其中將兩個系統變數定義為:
bbb=%ccc%
ccc=%bbb%
在我的 Windows 7 上,這會導致變數評估為:
C:\etc>set
...
bbb=%ccc%
ccc=%ccc%