Як я можу назавжди додати запис до змінної PATH системи за допомогою командного рядка?


13

Що мені потрібно зробити:

  • Додайте папку до %PATH%змінної середовища на рівні СИСТЕМИ.
  • Зробіть зміни постійними.

Як мені це потрібно зробити:

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

Системи, над якими повинен працювати сценарій:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • 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 я зрозумів, як мені це зробити. Тепер я просто хочу, щоб був спосіб змусити оновити реєстр (і натиснути на змінні середовища) без перезавантаження або перезавантаження Explorer?
Іссі

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 із посиланням на змінну середовища, яка змінюється, ви порушите його. (Я роблю це на деяких своїх комп’ютерах, щоб вказати на каталог бін у поточному Sun JDK.)
Гаррі Джонстон,

Новий скрипт не працює так, як написано, якщо шлях містить дужки, наприклад, будь-які посилання на програмні файли (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.