SystemRoot
расширяется, как и ожидалось, потому что это псевдо / предопределенная переменная среды. WinDir
- это обычная переменная среды, которая "конкурирует" с другими, такими как PATH
в последовательности инициализации.
Лучшее объяснение - Раймонд Чен из Windows Confidential: скрытые переменные: « Внедрение одной переменной среды в другую - это просто вопрос правильного выбора времени работы ». Цитируя больше:
Вот как работает процесс создания окружающей среды. Это происходит примерно в четыре этапа:
- Во-первых, система создает некоторые предопределенные общесистемные переменные среды, такие как SystemRoot и ALLUSERSPROFILE (но не COMPUTERNAME или ProgramFiles).
- Во-вторых, он создает переменные среды из раздела «Система» диалогового окна «Переменные среды». Определения системных переменных среды могут использовать нотацию «%» для ссылки на предварительно определенные переменные среды, созданные на предыдущем шаге. Например, вы можете установить системную переменную среды в% SystemDrive%\Extras. После завершения системной среды Windows начинает создавать пользовательскую среду.
- Шаг третий - создать предопределенные переменные среды для пользователя, такие как USERPROFILE и APPDATA. Здесь также создаются переменные, связанные с COMPUTERNAME и ProgramFiles, хотя технически они являются системными, а не переменными для каждого пользователя.
- Наконец, система создает переменные среды. Они находятся в разделе «Пользователь» диалогового окна «Переменные среды» и имеют доступ к любым переменным, созданным на первых трех шагах, поэтому вы можете задать для переменной среды пользователя значение% USERPROFILE%\Extras или пользовательскую переменную среды системы, заданную на втором шаге. , Если переменная среды пользователя имеет то же имя, что и системная переменная среды, новое значение заменяет старое.
...
У одного клиента возникли проблемы с установкой переменной среды System PATH на% APPDATA%; C:\Windows. Они обнаружили, что конечная среда просто содержит заданный буквальный путь (знаки процента и все), а не заменяет его значением переменной среды APPDATA. Если вы просмотрите последовательность операций, ранее подробно описанную, станет понятно, почему это произошло. Они пытались установить системную переменную среды на основе переменной, которая еще не была определена.
Решение было простым: переместите редактирование PATH из поля со списком Системная среда в поле со списком Пользовательская среда. Таким образом, когда он захочет использовать переменную окружения% APPDATA%, переменная будет там.
Для простого примера возможных "состояний гонки" при определении переменных среды на основе других рассмотрим круговой случай, когда определяются две системные переменные как:
bbb=%ccc%
ccc=%bbb%
На моем Windows 7 это приводит к переменным, оценивающим:
C:\etc>set
...
bbb=%ccc%
ccc=%ccc%