Добавить к системной переменной PATH, не включая пользовательскую переменную PATH

Добавить к системной переменной PATH, не включая пользовательскую переменную PATH

Представьте себе следующие переменные среды:

СистемаПУТЬ = 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%acommand2
  • 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 (бесплатно)и используйте это для интерпретации вашего пакетного файла.

Связанный контент