Как изменить переменную PATH определенно через командную строку в Windows
Я хотел бы сделать файл.bat, который бы добавил строку в конце значения переменной Windows PATH. Предупреждение, я хочу, чтобы это изменение было окончательным, а не работало только для текущего сеанса.
Кто-нибудь знает способ сделать это? Насколько это возможно, он не должен зависеть от версии Windows
2 ответа
Извините за длинный ответ, но короткий ответ на ваш вопрос невозможен.
Прежде всего вы должны понять, как работают переменные среды. Есть некоторые места в реестре, как 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, но идея останется прежней. Проблема в том, что другие процессы не должны ждать сообщения и что-то делать. Большинство консольных приложений не имеют цикла обработки сообщений и ничего не делают, если вы отправляете такие сообщения.
Поэтому важно понимать, что не существует простого способа обновления переменных среды всех процессов без перезагрузки компьютера. Вы должны иметь четкое понимание этого и немного уменьшить свой вопрос.
Если вы обновляете среду в реестре и отправляете 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) и другое для консольных приложений.
Если вы заботитесь только о новых экземплярах процесса и действительно хотите, чтобы это делалось через командный файл, то setx
это то, что вы ищете.
/M
изменитPATH
вHKEY_LOCAL_MACHINE
вместоHKEY_CURRENT_USER
,
т.е. системная переменная, а не пользовательская.
пример:SETX /M PATH "%PATH%;C:\your path with spaces"
Если вы хотите напрямую изменить переменную среды для запущенных в данный момент процессов, да, это сложно и, очевидно, не рекомендуется:
Altering the environment variables of a child process during process creation
is the only way one process can directly change the environment variables of
another process. A process can never directly change the environment variables
of another process that is not a child of that process.
В противном случае, как говорит Олег, программным путем лучше всего изменить реестр и отправить WM_SETTINGCHANGE
и надеюсь, что приложения достаточно хороши, чтобы поднять его.