Представьте себе следующие переменные среды:
СистемаПУТЬ = C:\Windows
БобаПользовательПУТЬ =C:\Users\Bob
В командной строке PATH
команда возвращаетC:\Windows;C:\Users\Bob
После бегаsetx /m PATH "C:\Node;%PATH%"
СистемаПУТЬ =C:\Node;C:\Windows;C:\Users\Bob
В новой командной строке PATH
команда возвращаетC:\Node;C:\Windows;C:\Users\Bob;C:\Users\Bob
Другой пользователь, Алиса, входит в систему.
АлисаПользовательПУТЬ =C:\Users\Alice
В командной строке PATH
команда возвращаетC:\Node;C:\Windows;C:\Users\Bob;C:\Users\Alice
У Боба в переменной есть дублирующийся путь PATH
, а у Алисы в ее переменной есть пути Боба PATH
.
Есть ли способ добавить данные в Систему PATH
, не загрязняя ее данными текущего пользователя PATH
?
решение1
В Windows 7 вы можете найти системный путь с помощью
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path
Если это все еще работает в Windows 8, то используйте это для создания нового значения.
Вам придется разобраться, как анализировать вывод reg query
. Вот что-то, что может сработать:
для /f "tokens=1,2*" %a in (' reg query "HKLM\…\Environment" /v path ') do set currentValue=%c
где
- строка представляет собой команду (приведенную выше), заключенную в одинарные кавычки.
'reg query "HKLM\…\Environment" /v path'
reg query
a
,currentValue
, иc
— имена переменных. Вы можете выбрать любые имена переменных, с ограничениями, чтоa
иc
должны быть отдельными буквами, разделенными двумя буквами (например, можно использоватьn
иp
, илиx
иz
).-
for /f "options" %variable in ('command1') do command2
запускает , анализирует вывод, присваивает значение(я) аргументам ( , выше; но см. также ниже) и выполняет .command1
%variable
%a
command2
tokens=1,2*
означает, что%a
берется первый токен (слово) каждой (оставшейся) строки,%b
берется второе слово и%c
берется оставшаяся часть строки.- Первое слово —
path
(имя значения). - Второе слово —
REG_EXPAND_SZ
(тип значения). - Оставшаяся часть строки — это значение.
(Можно просто использовать
tokens=2*
и затемcurrentValue=%b
.)- Первое слово —
Итак, после выполнения вышеперечисленного, вы сможете сделать следующее:
setx PATH "C:\Node;%currentValue%" /m
- Если вы делаете это в скрипте (
.BAT
файле), используйте%%a
и%%c
. - Обязательно проверьте это с помощью
echo
команд, прежде чем делать это с помощьюsetx
.
решение2
Не указывайте конкретный путь Боба в значении системного пути, используемом всеми.
Прочитайте старое значение системного пути, измените его и установите новое значение. Если cmd.exe
(очевидно, что set
команда может создавать/изменять/удалять, но не читать) не предоставляет этих функций, поместите ее в программу, вызываемую пакетным файлом.
Значение системного пути находится (и изменяется) через Реестр. Я просто ищу значение, которое, как я знаю, должно быть, чтобы узнать, где именно, Google этот ключевой путь, чтобы проверить, что было сказано об этом.
(позже: они есть HKLM\System\CurrentControlSet\Control\Session Manager\Environment
и HKCU\Environment
)
Любой более продвинутый язык сценариев для Windows или с поддержкой Windows API может справиться с этим. Или скомпилированная программа, исполняемая на вашем языке по выбору.
замена оболочки CMDВозьмите на себя командованиеимеет функцию @REGQUERY:
echo %@REGQUERY["HKLM_64\System\CurrentControlSet\Control\Session Manager\Environment\Path"]
поскольку, судя по всему, вы имеете в виду определенную машину, вы можете установитьTCC/LE (бесплатно)и используйте это для интерпретации вашего пакетного файла.