Извините за длинный ответ, но короткий ответ на ваш вопрос невозможен.
Прежде всего вы должны понять, как работают переменные среды.В реестре есть несколько мест, таких как HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
и HKEY_CURRENT_USER\Environment
, где будут храниться переменные среды.При запуске операционная система считывает этот раздел реестра.Затем один процесс Windows создает другой процесс Windows.Родительский процесс может предоставить клиентскому процессу любой набор переменных среды.Если родительский процесс этого не делает, дочерний процесс наследует переменные среды родительских процессов.
Чтобы иметь возможность обновлять переменные среды запущенного процесса с учетом WM_WININICHANGE или WM_SETTINGCHANGE сообщений.Приложение Windows может интерпретировать эти сообщения и перечитать текущие переменные среды из реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
и HKEY_CURRENT_USER\Environment
.Таким образом, вы можете в общем случае изменить значения реестра в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
или HKEY_CURRENT_USER\Environment
и отправить
SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment");
Было бы намного лучше использовать SendMessageTimeout вместо SendMessage Но идея останется прежней.Проблема в том, что другие процессы не должны ждать сообщения и что-то делать.Большинство консольных приложений не имеют цикла сообщений и ничего не делают, если вы отправляете такие сообщения.
Поэтому важно понимать, что существует no простой способ обновления переменных среды всех процессов.без перезагрузки компьютера.Вы должны иметь четкое представление об этом и немного сократить свой вопрос.
Если вы обновите среду в реестре и отправите SendMessage (HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment")
, тогда будет обработан новый обработчик, созданный Explorer.exe новые переменные среды, но cmd.exe этого не сделает.
Если вы хотите обновить переменные среды текущего cmd.exe внутри пакетного запуска, вы можетевыполните следующее: Вы можете создать новый файл CMD, например, t.cmd, в каталоге% TEMP%, записать в файл SET PATH=%PATH%;C:\BlaBla
, а затем использовать call %TEMP%\t.cmd
и dell %TEMP%\t.cmd
для обновления переменных среды текущего cmd..exe .
Точнее, есть еще места, которые используются для создания переменных среды вновь создаваемых процессов.Это подразделы ключа HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
и %SystemRoot%\System32\autoexec.nt
файла.Один будет использоваться для процессов, созданных ShellExecute
и ShellExecuteEx
(например, Explorer.exe), а другой - для консольных приложений.