Как изменить переменную PATH определенно через командную строку в Windows - PullRequest
8 голосов
/ 03 сентября 2010

Я хотел бы создать файл .bat, который бы добавил строку в конце значения переменной Windows PATH. Предупреждение, я хочу, чтобы это изменение было окончательным, а не работало только для текущего сеанса.

Кто-нибудь знает способ сделать это? Насколько это возможно, она не должна зависеть от версии Windows

Ответы [ 2 ]

20 голосов
/ 03 сентября 2010

Извините за длинный ответ, но короткий ответ на ваш вопрос невозможен.

Прежде всего вы должны понять, как работают переменные среды.В реестре есть несколько мест, таких как 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), а другой - для консольных приложений.

4 голосов
/ 03 сентября 2010

Если вы заботитесь только о новых экземплярах процесса и действительно хотите, чтобы это было сделано с помощью пакетного файла, тогда 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 и надеяться, что приложения достаточно хороши, чтобы его забрать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...