Глобальное изменение переменной Path
, Windows XP SP3, Windows 7
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.140] |
|
|
Правила раздела Windows
Глобальное изменение переменной Path
, Windows XP SP3, Windows 7
|
Сообщ.
#1
,
|
|
|
|
Надо в скрипте добавлять к Path свои пути. Везде рекомендуют править реестр командой типа
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH /t REG_EXPAND_SZ /d "%PATH%";<добавляемый путь> /f но проблема в том, что это не работает. Командный файл выполняется, в реестре значение изменяется. Но оно не влияет на переменные среды как самого командного файла, так и последующих вызовов программ. Ну ладно, для текущей сессии, в которой выполняется командный файл, оно и не обязано измениться, там используется полученная от ОС копия, в которой изменений нет. Но если после внесения изменений выполнить отдельно командный файл со строкой set path > path.txt то path.txt содержит значение Path до изменений, а не то, которое в реестре. И как сделать, чтобы у следующего запускаемого cmd.exe или другого приложения среда содержала Path с изменением? Или это только перезагрузкой? |
|
Сообщ.
#2
,
|
|
|
|
setx обычно используют. хотя на текущий набор переменных она тоже не влияет
|
|
Сообщ.
#3
,
|
|
|
|
нужно встроенными средствами, причём винда это всё может - если запустить "Система\Дополнительно\Переменные среды" и там нажать ОК, то всё становится на свои места, и изменения Path начинают влиять на последующие командные файлы
я так понимаю, это из-за того, что текущая копия Explorer имеет сначала не измененные переменные среды, но "Система\Дополнительно\Переменные среды" их приводит в соответствие с записью в реестре - вот и вопрос, как это сделать самостоятельно? наверняка в какой-нибудь DLL есть соответствующий вызов |
|
Сообщ.
#4
,
|
|
|
|
Цитата Environment Variables ... Calling SetEnvironmentVariable has no effect on the system environment variables. The user can add or modify system environment variables using the Control Panel. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key, then broadcast a WM_SETTINGCHANGE message with lParam set to the string "Environment". This allows applications, such as the shell, to pick up your updates. Note that the values of the environment variables listed in this key are limited to 1024 characters. ... |
|
Сообщ.
#5
,
|
|
|
|
Цитата then broadcast a WM_SETTINGCHANGE message ага, вот оно... осталось найти в какой системной dll что дернуть, чтобы она это сделала, дабы самому не писать крохотную утилитку только для этого сообщения |
|
Сообщ.
#6
,
|
|
|
|
Это SendMessage() из User32.dll. Что за скринт? Shell?
|
|
Сообщ.
#7
,
|
|
|
|
Цитата Что за скринт? Shell? cmd.exe с трудом представляю, как дёрнуть её с параметрами HWND_BROADCAST и WM_SETTINGCHANGE Добавлено что-то типа такого? rundll32 user32.dll,SendMessage 65535 26 0 "Environment" ? Добавлено нет, так не работает, среда не изменяется при повторном пуске cmd |
|
Сообщ.
#8
,
|
|
|
|
Не надо хаков.
![]() ![]() echo Set objShell = WScript.CreateObject("WScript.Shell") > addPaths.vbs echo Set objSysEnv = objShell.Environment("SYSTEM") >> addPaths.vbs echo objSysEnv("PATH") = objSysEnv("PATH") + "тут твои маршруты" >> addPaths.vbs echo Set objSysEnv = Nothing >> addPaths.vbs echo Set objShell = Nothing >> addPaths.vbs cscript addPaths.vbs del addPaths.vbs |
|
Сообщ.
#9
,
|
|
|
|
так и что - это изменит Path в реестре и сделает броадкаст сообщения об изменении среды, чтобы и в команднике она поменялась?
|
|
Сообщ.
#10
,
|
|
|
|
Если objShell.Environment("SYSTEM"), то должно, проверь. Если будет objShell.Environment("USER"), то повлияет на локальные для текущего юзера переменные. Если objShell.Environment("PROCESS"), то на локальные для процесса. Думаю, этот вариант совсем не интересен.
|
|
Сообщ.
#11
,
|
|
|
|
проверю, но почему-то пока думаю, что изменит только в реестре и у текущего командника, а у копии Explorer останутся старые
проверю завтра |
|
Сообщ.
#12
,
|
|
|
|
Это должно повлиять на все приложения, которые слушают броадкаст WM_SETTINGCHANGE. Те, которые не слушают, не переубедишь без их рестарта, но это не проблемы системы.
|
|
Сообщ.
#13
,
|
|
|
|
а кроме как vbscript-ом - просто из командной строки никак? мало ли что...
|
|
Сообщ.
#14
,
|
|
|
|
![]() ![]() wmic environment where "name='Path' and SystemVariable=TRUE" set VariableValue='NEWPATHVALUE' Правда сам wmic не везде есть - в WinXP Home, например, ЕМНИП. |
|
Сообщ.
#15
,
|
|
|
|
Цитата wmic environment where "name='Path' and SystemVariable=TRUE" set VariableValue='NEWPATHVALUE' это очевидно заменит старый Path, а как к нему добавить? Добавлено ага, кажется сам разобрался... в Windows 7 есть wmic? нет под руками 7-ки, чтобы проверить |
|
Сообщ.
#16
,
|
|
|
|
Сам проверял только Windows 7 Home, Pro и Ultimate - там есть
Добавлено Цитата Гурман @ это очевидно заменит старый Path, а как к нему добавить? На всякий случай, как сначала получить путь: ![]() ![]() wmic environment where "name='Path' and SystemVariable=TRUE" get VariableValue /VALUE |
|
Сообщ.
#17
,
|
|
|
|
Цитата На всякий случай, как сначала получить путь: да не, всё гораздо проще, это же в команднике, переменные среды и так доступны ![]() ![]() wmic environment where "name='Path' and SystemVariable=TRUE" set VariableValue='%Path%;D:\test' |
|
Сообщ.
#18
,
|
|
|
|
А %PATH% какой подставиться - системный?
|