открыто regedit.exe
, перейдите к HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
. Создайте две переменные среды:
Name Type Data
----- -------------- -----------
zbar REG_SZ water
zfoo REG_EXPAND_SZ %zbar%
Открыть новый cmd.exe
, powershell.exe
или что угодно. Эти переменные отсутствует. Сделайте LogOff, затем LogOn. В cmd.exe
тип окна echo %zbar%
- water
отображается. Тип echo %zfoo%
и %zbar%
отображается, но я ожидаю увидеть расширенное значение - water
.
И сейчас. Открыть Windows Переменные среды диалог. Измените или создайте любую переменную (например zzz=zzz
). Открыть заново cmd.exe
и введите echo %zfoo%
- теперь вы видите water
!
Собственно, я создаю эти переменные с помощью сценария PowerShell. Но все, что делает этот скрипт, описывается манипуляциями с реестром.
Вопросы:
zfoo
переменная, чтобы иметь правильное значение без этой магии при открытии Windows Переменные среды диалог и изменение некоторых переменных? Может мне стоит вызвать какой-нибудь API, что-то вроде [Microsoft.Win32.Registry]::Refresh()
?Спасибо.
Тебе надо трансляция в Сообщение WM_SETTINGCHANGE.
Помните: вы фактически не устанавливаете какие-либо переменные среды любой формы при изменении реестра. Переменные среды являются частью пространства памяти каждого отдельного процесса, причем каждый процесс имеет свой собственный набор. Они не живут в реестре. Вы меняете шаблон. Вам нужно уговорить программы, которые устанавливают актуальный переменные среды, чтобы перечитать шаблон и соответствующим образом настроить их среды. Вы делаете это, передавая сообщение Windows, которое сообщает всем заинтересованным сторонам об изменении шаблона в реестре. Microsoft Windows Explorer является одной из таких заинтересованных сторон и изменяет свои собственные переменные среды всякий раз, когда узнает об изменении шаблона. Эти модификации затем наследуются обычным образом любым новым процессом, который запускает Explorer.
Вы можете использовать SETX, он будет транслировать WM_SETTINGCHANGE после установки переменной:
SETX VAR VALUE /M
Или, если вы настаиваете на вводе переменных в реестр, вы можете настроить SETX для установки уже существующей переменной, чтобы транслировать изменение реестра:
SETX OS %OS% /M