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

ПУТЬ системы = C:\Windows
Пользователь Боба PATH = 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

Другой пользователь, Алиса, входит в систему.
Пользователь Алисы PATH = C:\Users\Alice

В командной строке команда PATH возвращает C:\Node;C:\Windows;C:\Users\Bob;C:\Users\Alice

У Боба есть дублированный путь в его PATH , а у Алисы есть пути Боба в ее PATH .

Есть ли способ добавить к системной PATH не загрязняя ее текущей PATH?

2 ответа2

1

В Windows 7 вы можете искать системный путь с

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path

Если это все еще работает в Windows 8, используйте это для создания нового значения.

Вы должны выяснить, как анализировать выходные данные reg query .  Вот что может сработать:

for /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 .
0

Не указывайте конкретный путь Боба в значении системного пути, которое используется всеми.

Прочитайте старое значение системного пути, измените его и установите новое значение. Если cmd.exe (очевидно, команда set может создавать / изменять / удалять, но не читать) не предоставляет эти возможности, поместите его в программу, вызываемую командным файлом.

Значение системного пути найдено (и изменено) через Реестр. Я просто ищу значение, которое, как я знаю, должно выяснить, где именно, Google, этот ключевой путь, чтобы проверить, что было сказано об этом.
(позже: это HKLM\System\CurrentControlSet\Control\Session Manager\Environment и HKCU\Environment)

Любой более продвинутый язык сценариев для Windows или с поддержкой Windows API может справиться с этим. Или скомпилированная программа, исполняемая на выбранном вами языке.

Сменная команда CMD Take Command имеет функцию @REGQUERY:

echo %@REGQUERY["HKLM_64\System\CurrentControlSet\Control\Session Manager\Environment\Path"]

так как кажется, что вы имеете в виду конкретную машину, вы можете установить TCC/LE (бесплатно) и использовать его для интерпретации вашего пакетного файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .