Certain Variables won't expand in Windows System Environment Variables PATH [duplicate]
Solution 1:
SystemRoot
expands as expected because it is a pseudo/predefined environment variable. WinDir
is a regular environment variable, and "competes" with others like PATH
in the initialization sequence.
Best explained by Raymond Chen at Windows Confidential: The hidden variables: "Embedding one environment variable within another is simply a matter of good operational timing". Quoting more:
Here’s how the environment-building process works. It proceeds in roughly four steps:
- First, the system creates some predefined machine-wide environment variables, such as SystemRoot and ALLUSERSPROFILE (but not COMPUTERNAME or ProgramFiles).
- Second, it creates environment variables from the System section of the Environment Variables dialog box. The System environment variable definitions can use the “%” notation to refer to the predefined environment variables created in the previous step. For example, you can set a System environment variable to %SystemDrive%\Extras. After the System environment is complete, Windows starts building the User environment.
- Step three is to create predefined per-user environment variables, such as USERPROFILE and APPDATA. The COMPUTERNAME and ProgramFiles-related variables are also created here, even though they’re technically System variables and not per-user variables.
- Finally, the system creates the environment variables. These are in the User section of the Environment Variables dialog box and have access to any variables created by the first three steps, so you can set a User environment variable to %USERPROFILE%\Extras or a custom System environment variable set in the second step. If a User environment variable has the same name as a System environment variable, the new value replaces the old.
...
One customer was having difficulty setting the System PATH environment variable to %APPDATA%;C:\Windows. They found the final environment merely contained the literal path as specified (percent signs and all), instead of replacing it with the value of the APPDATA environment variable. If you look through the sequence of operations previously detailed, it’s clear why this occurred. They were trying to set a System environment variable based on a variable that had not yet been defined.
The solution was simple: Move editing the PATH from the System environment list box to the User environment list box. That way, when it wanted to use the %APPDATA% environment variable, the variable would be there.
For a simple example of possible "race conditions" when defining environment variables based on others, consider the circular case where one defines two system variables as:
bbb=%ccc%
ccc=%bbb%
On my Windows 7 this results in the variables evaluating to:
C:\etc>set
...
bbb=%ccc%
ccc=%ccc%