Как я могу навсегда добавить запись в системную переменную PATH через командную строку?


13

Что мне нужно сделать:

  • Добавьте папку к %PATH%переменной среды на уровне SYSTEM.
  • Сделайте изменение постоянным.

Как мне нужно это сделать:

  • Использование командной строки или другой метод, с помощью которого все необходимые команды могут быть записаны в .BATфайл.
  • Использование только инструментов, которые были бы доступны на чистой установке Windows XP SP3, без подключения к Интернету.
  • Я бы предпочел запустить скрипт локально, но у меня также есть удаленный доступ к целевым системам. Имейте в виду, однако, что я не могу предположить, что какие-либо службы не по умолчанию (например, удаленный реестр) включены в системах.

Системы, на которых скрипт должен работать:

  • Windows XP SP3
  • Windows Server 2003 с пакетом обновления 2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

Я довольно знаком с SETкомандой, но я также знаю, что она, как правило, перезаписывает существующую переменную вместо добавления к ней. Это не приемлемо. Есть ли другой инструмент (или опция SET, о которой я не знаю), который вместо этого добавит к переменной? Или мне нужно добавить обходной путь в сценарий, который включает временное копирование существующей переменной в другую переменную или текстовый файл?

Кроме того, я понимаю, что SETне будет постоянно изменять переменную. Я видел упоминание SETX, но, похоже, оно не встроено в Windows XP SP3 (или, по крайней мере, оно недоступно в системе, над которой я работаю). Есть ли другой способ сделать изменение постоянным, через редактирование реестра или что-то еще?

Я немного осмотрелся и узнал много полезного о настройке переменных среды в Windows. Тем не менее, я еще не нашел точный дубликат вопроса, который бы соответствовал моим потребностям. Если есть, пожалуйста, дайте мне знать.


Setx не поставляется с XP. Он находится в одном или нескольких ресурсных комплектах, но я забыл, какие из них не были. Сделать постоянные изменения переменных среды в командной строке - это, безусловно, самый простой способ. Вы можете внести изменения в реестр (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment), но изменения реестра из командной строки также не являются чем-то простым. Если бы я был тобой, я бы написал VBScript для этого.
EBGreen

@EBGreen Я немного знаком с использованием REGдля внесения изменений в реестр. Если вы хотите опубликовать это как ответ с предложениями о том, как сохранить существующий путь, я бы, по крайней мере, проголосовал за него.
Изи

1
Я думаю, по предложению EBGreen, я понял, как мне нужно это сделать. Теперь я просто хотел бы, чтобы был способ принудительно обновить реестр (и отправить в переменные среды) без перезагрузки или перезагрузки проводника?
Изи

1
@EBGreen Да, вот как это выглядит. Кстати, если у вас есть время, чтобы выяснить синтаксис, не могли бы вы опубликовать фактический ответ? Я бы предпочел, чтобы это не превратилось в вопрос с самостоятельным ответом.
Изи

1
@lszi, ты должен ответить на свой вопрос. Хороший ответ на хороший вопрос ценен, даже если вы отвечаете на него сами.
Мирддин Эмрис

Ответы:


4

Следующее добавляет «C: \ bin» к вашему пути и затем сохраняет новый путь в Реестре:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

Я проверял это только на XP SP3, но он должен работать и на более новой версии.

Я предполагаю, что новый пользователь, который входит в систему до перезагрузки компьютера, может не получить новый путь.

Гарри прав в своем комментарии о% SystemRoot%, если вы хотите сохранить их, вам сначала нужно извлечь старое значение для пути из реестра:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

2
Имейте в виду, что это изменит некоторые из существующих записей PATH, расширив ссылки на переменные среды. Например, стандартная запись% SystemRoot% \ system32 будет заменена на c: \ windows \ system32. Этот конкретный пример не имеет значения, потому что SystemRoot является константой, но если кто-то настроил PATH со ссылкой на переменную среды, которая изменится, вы нарушите ее. (Я делаю это на некоторых своих компьютерах, чтобы указать на каталог bin в текущем Sun JDK.)
Harry Johnston

Новый скрипт не работает так, как написано, если путь содержит скобки, например, любые ссылки на Program Files (x86).
Гарри Джонстон

-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f

2
Хотя простые команды могут быть полезны, мы ожидаем немного больше работы в наших вопросах / ответах. Пожалуйста, объясните, как это отвечает на вопрос ОП.
Ƭᴇcʜιᴇ007
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.