Назад | Перейти на главную страницу

Переменные среды Windows и ручное редактирование реестра - проблема отсутствия / неправильных значений

открыто 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. Но все, что делает этот скрипт, описывается манипуляциями с реестром.

Вопросы:

  1. Как заставить zfoo переменная, чтобы иметь правильное значение без этой магии при открытии Windows Переменные среды диалог и изменение некоторых переменных? Может мне стоит вызвать какой-нибудь API, что-то вроде [Microsoft.Win32.Registry]::Refresh()?
  2. Можно ли сделать эти переменные видимыми для пользователей без необходимости операций выхода из системы / входа в систему? Если я редактирую переменные среды на уровне пользователя (также в реестре), они сразу становятся доступными, а с глобальными - нет.

Спасибо.

Тебе надо трансляция в Сообщение WM_SETTINGCHANGE.

Помните: вы фактически не устанавливаете какие-либо переменные среды любой формы при изменении реестра. Переменные среды являются частью пространства памяти каждого отдельного процесса, причем каждый процесс имеет свой собственный набор. Они не живут в реестре. Вы меняете шаблон. Вам нужно уговорить программы, которые устанавливают актуальный переменные среды, чтобы перечитать шаблон и соответствующим образом настроить их среды. Вы делаете это, передавая сообщение Windows, которое сообщает всем заинтересованным сторонам об изменении шаблона в реестре. Microsoft Windows Explorer является одной из таких заинтересованных сторон и изменяет свои собственные переменные среды всякий раз, когда узнает об изменении шаблона. Эти модификации затем наследуются обычным образом любым новым процессом, который запускает Explorer.

Вы можете использовать SETX, он будет транслировать WM_SETTINGCHANGE после установки переменной:

SETX VAR VALUE /M

Или, если вы настаиваете на вводе переменных в реестр, вы можете настроить SETX для установки уже существующей переменной, чтобы транслировать изменение реестра:

SETX OS %OS% /M