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