Як додати до змінної Windows PATH за допомогою setx? Маючи дивні проблеми


79

Я хочу змінити змінну Windows PATH за допомогою setx. Наступне працює щонайменше 50% часу на Windows 8:

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

Якщо він видає помилку "аргумент за замовчуванням можна використовувати лише 2 рази", то наступне працює деякий час:

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

Різниця полягає в тому, що ми обгорнули другий аргумент у лапки. Я вважаю, що лапки потрібні, коли %PATH%розгортаються, включаючи пробіли.

Однак я зіткнувся з дивними проблемами в Windows 7. На одній машині Windows 7 у мене була така проблема:

echo %PATH%

Друкується:

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

Тоді я роблю це:

setx PATH "%PATH%;C:\Quux\"

Потім пише "Помилка: усічено 1024 символи". Тепер перевіримо, що містить PATH:

echo %PATH%

Друкується:

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

... і він відрізаний на 1024 символи. Це наїхало через дублікати. Також цікаво: значення PATH змінюється, незважаючи на те, щоsetx викликало помилку і не говорило "Успіх".

Мені вдалося повторити цю дивну поведінку кілька разів (на щастя, я врятував оригінальний вміст PATH).

На даний момент єдиним надійним способом, який я знаю, щоб додати до PATH, є наступний:

  1. echo Шлях.

  2. Скопіюйте вміст PATH у текстовий файл та додайте вручну ;C:\Python27\;C:\Python27\Scripts\ його в кінець .

  3. Скопіюйте все це з текстового файлу.

  4. setx PATH "<paste the string here>"

Цей процес працює кожного разу як на Windows 7, так і на Windows 8.

Я справді мав би це зробити за одну команду. Що я роблю не так?

Дякую.


10
Використання setxнебезпечно з іншої причини: якщо шлях містить будь-які змінні середовища, наприклад, %JAVADIR%\binпосилання буде втрачено, тобто, якщо JAVADIR змінить, шлях більше не буде змінюватися разом із ним. Якщо це програма встановлення програмного забезпечення, це може зламати машини кінцевих користувачів. Не гарна ідея.
Harry Johnston

1
@HarryJohnston, це за задумом. Щоразу, коли ви це робите %, воно інтерпретує це на місці .
Pacerier

2
@Pacerier, будь-які посилання на змінні середовища в записах реєстру для шляху вже будуть розширені, це відбувається під час побудови блоку середовища. Тому , коли ви подаєте %PATH%в setxви втрачаєте цю інформацію. Плюс, звичайно, те, як OP робить це, налаштування системного шляху додається до налаштування шляху користувача, дивлячись на питання ще раз, здається, що це справжня причина проблеми OP.
Harry Johnston

2
@HarryJohnston, Є 4 види змінної env: hkcu reg_sz, hkcu reg_expand_sz, hklm reg_sz, hklm reg_expand_sz. (Ви можете вручну налаштувати їх за допомогою regedit і запустити, setxщоб завершити змивання.) ~~~ І, setxі setx/mза замовчуванням reg_sz, якщо ваші дані містять більше 2 %символів. ~~~ "розширити" як у hklm, так і у hkcu означає розширити до hklm. setx/m qwe %JAVADIR%\binі setx/m javadir asdfgв будь-якому порядку. Потім відкрийте новий cmd і виконайте echo %qwe%: працює, як очікувалося.
Pacerier

3
@Pacerier, я не бачу актуальності. Значення PATH вже розширено , а також містить записи HKCU та HKLM (останнє є особливим випадком, цього не трапляється для будь-якої іншої змінної середовища), тому якщо шлях у HKLM спочатку містився, %JAVADIR%\binа шлях у HKCU спочатку , що міститься %JDK%\binтоді, PATHбуде встановлено C:\Java\bin;C:\jdk\binтак, коли ви скажете, setx PATH %PATH%що значення в HKCU змінюється, до C:\Java\bin;C:\jdk\binякого (a) міститься надлишковий запис, а (b) більше не відстежує зміни до значення JDK.
Harry Johnston

Відповіді:


76

Запустіть cmdяк адміністратор, а потім:

setx /M PATH "%PATH%;<your-new-path>"

Параметр / M встановлює змінну в області СИСТЕМИ. Типовою поведінкою є встановлення його для КОРИСТУВАЧА.

TL; DR

Проблема з обрізанням трапляється, тому що коли ви повторите% PATH%, він покаже об'єднання значень СИСТЕМИ та КОРИСТУВАЧА. Отже, коли ви додаєте його у свій другий аргумент до setx, він буде поміщати значення СИСТЕМИ та КОРИСТУВАЧА всередину USER var. Коли ви знову повторите, все буде подвоєно.

Крім того, параметр / M вимагає прав адміністратора, тому вам потрібно відкрити свій термінал за допомогою "запустити від імені адміністратора", інакше setx скаржиться на "доступ до реєстру заборонено".

Останнє, на що слід звернути увагу: Ви не побачите нового значення, коли повторите% PATH% відразу після встановлення його таким чином, вам потрібно закрити cmd і відкрити знову.

Якщо ви хочете перевірити фактичні значення, що зберігаються в реєстрі, перевірте це питання .


26
Це рішення є фіктивним. Виконання наведеної команди змінить ваш Pathтип REG_EXPAND_SZна на REG_SZ; і в процесі видаліть усі наявні там посилання на змінні середовища.
user2023370

@garyM Дякую за відгук. Я не зазнав / не помітив згаданих наслідків у своїй справі. Будь ласка, повідомте нам, чи є спосіб змінити цю відповідь, яка це виправить. Або якщо ви пропонуєте іншу відповідь.
Vituel

2
Привіт Vituel, проблема виникає, коли змінна створюється заново, а потім змінюється в рамках того ж процесу. Новостворена змінна не відображається в існуючому середовищі оболонки. будь-яке посилання буде розглядати посилання% var% як текстовий рядок. Щоб уникнути цієї проблеми, доступ до змінної повинен виконуватися в новому процесі, який створюється після створення змінної. Змінна шляху є особливим випадком у деяких версіях Windows. У 2008R2 модифікація змінної PATH не просувається до існуючих процесів, їх потрібно повторно створити, щоб отримати зміни. На основі ОС, / M знаходиться в кінці.
garyM

2
Крім того, це призводить до додавання змінної PATH до машини PATH, що буде (a) заважати іншим користувачам; і (b) при повторному запуску продовжуйте збільшувати довжину шляху, поки він врешті не переллється. Здебільшого для користувача PATH не буде налаштовувати користувача, щоб ви могли врятуватися, але це небезпечно.
Harry Johnston

3
НЕ ВИКОРИСТОВУЙТЕ ЦЕ. setxскоротить PATH до 1024 символів. Якщо PATH раніше було змінено шляхом додавання до нього більшої кількості каталогів, ви втратите більшість оригінального вмісту PATH !
e.tadeu

23

Це чудово працює:

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B

setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

Перша команда отримує змінну середовища USER 'PATH' у змінну 'my_user_path'. Другий рядок додає 'C: \ Python27; C: \ Python27 \ Scripts;' до змінної середовища USER 'PATH'


2
ця відповідь логічно правильна imo. чому ця відповідь ні набрала більше голосів, ні була прийнята? Я щось пропустив?
Сіва Санкаран

2
@AMVaddictionist - я думаю, %% або% це стосується, якщо ви запускаєте його як файл .bat або безпосередньо в cmd. Сподіваюся, що це допомагає.
Manohar Reddy Poreddy

2
Погодьтеся. Це правильна відповідь. Як писано, він призначений для запуску в командному рядку, і одиничний% повинен бути замінений на подвійний %% для запуску в командному файлі.
Джонатан

1
@ManoharReddyPoreddy Дякую, Бог врятував мене, хоча я зробив резервні копії змінних середовища, але ця відповідь є перлиною порівняно з іншими відповідями. Спочатку магазин попередня версія, а потім додається нова. Чудово працює :)
mozilla_firefox

1
@mozilla_firefox - так, ми беремо резервні копії, а потім пробуємо щось нове :), ми справжні розробники? : D
Манохар Редді Поредді

5

Якщо хтось хоче запустити його в PowerShell, він працює, як показано нижче,

Запустіть Powershell від імені адміністратора

Тоді

setx /M PATH "$Env:PATH;<path to add>"

Щоб перевірити, відкрийте іншу Powershell і перегляньте PATH, як показано нижче,

$Env:PATH

4

Якщо вас не супроводжують setx, ви можете використовувати альтернативний інструмент командного рядка, такий як pathed . Існує більш вичерпний список альтернативних редакторів PATH за адресою /superuser/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712

Ви також можете безпосередньо відредагувати значення реєстру, саме це і setxробить. Більше у цій відповіді .

Дивно, що ваш %PATH%обрізається на 1024 символи. Я думав, у мене setxне було цієї проблеми. Хоча вам, мабуть, слід очистити неправильні записи шляху.


5
Дякую за пропозиції, але я справді не хочу покладатися на сторонні програми. Я хочу використовувати лише те, що поставляється з Windows. Це тому, що у мене є два основних випадки використання: (1) налаштування початківців, які хочуть вивчити Python, і (2) налаштування машин, які використовуються на заводі моєї компанії. В обох випадках це випадкова машина Windows, яка лише один раз відредагує PATH. Я хочу максимально спростити редагування PATH, а встановлення додаткового програмного забезпечення насправді це не вирізає. Ось чому навіть мій 4-кроковий обхідний шлях недостатньо хороший.
SerMetAla

Тож інструменти, на які я зв’язав, мають портативні двійкові файли, які ви можете об’єднати у zip-файл. Ви можете попросити користувачів зробити щось таке просте, як запустити .batфайл, і виконати PATHредагування, а також налаштування коду Python.
Ехтеш Чоудхурі,

4

Без прав адміністратора єдиним способом, який працював у мене, є файл bat, який містить такий код:

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

Код є комбінацією відповідей https://stackoverflow.com/a/45566845/4717152 та https://stackoverflow.com/a/10292113/4717152


якщо ви хочете, щоб ця частина шляху слідувала за змінами в% USERPROFILE%, ви можете використовувати double %%у файлі bat (або ^%якщо команда виконується безпосередньо - подивіться, як уникнути в bat vs cmd ).
TamaMcGlinn

3

Я стикався з тими ж проблемами і знайшов зараз просте рішення.

Використання шляху.

pathman /as %M2%

Додає, наприклад,% M2% до системного шляху. Нічого більше і нічого менше. Більше проблем із отриманням суміші користувацького PATH та системного PATH. Більше не намагаючись отримати правильні значення з реєстру ...

Пробував у Windows 10



@PatMigliaccio Ваше посилання мертве
TamaMcGlinn

2
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

Це має зробити додавання до змінного шляху системного середовища без будь-яких додаткових додатків та збереження оригіналу цілим без втрати даних. Я використав цю команду, щоб виправити проблему, яку веб-служба McAfee Web Control робить із настільним клієнтом Microsoft Outlook.

Цитати використовуються у значенні шляху, оскільки командний рядок розглядає пробіли як роздільник і намагатиметься виконати наступне значення в командному рядку. Цитати замінюють таку поведінку і обробляють усе, що знаходиться всередині лапок, як рядок.


0

Етапи: 1. Відкрийте командний рядок із правами адміністратора.

Крок : 2. Виконайте команду: setx / M PATH "шлях \ до;% PATH%"

[Примітка: Обов’язково змініть команду так, щоб шлях \ відображав шлях до папки з вашого кореня.]

Приклад : setx / M PATH "C: \ Program Files;% PATH%"


4
OP описав кілька деталей та спостережень щодо своєї проблеми. OP описав кілька спроб вирішити свою проблему. Деякі з них дуже схожі на вашу пропозицію. Чи можете ви виділити відповідні відмінності та пояснити, як вони вирішують проблему ОП?
Юннош,

0

У мене були такі проблеми з управлінням моїми комп’ютерними лабораторіями, коли змінна середовища% PATH% наблизилася до 1024 символів, і я написав сценарій Powershell для її виправлення.

Завантажити код можна тут: https://gallery.technet.microsoft.com/scriptcenter/Edit-and-shorten-PATH-37ef3189

Ви також можете використовувати його як простий спосіб безпечного додавання, видалення та аналізу записів PATH. Насолоджуйтесь.


0

На жаль, за допомогою інструментів OOTB ви не можете безпосередньо / легко додати ні системний шлях, ні шлях користувача. Якщо ви хочете дотримуватися інструментів OOTB, вам потрібно запитати або шлях СИСТЕМИ, або КОРИСТУВАЧ, зберегти це значення як змінну, а потім додати ваші доповнення та зберегти його за допомогою setx. Два наведені нижче приклади показують, як отримати або зберегти їх, і додати свої доповнення. Не плутайте з% PATH%, це об'єднання СИСТЕМИ КОРИСТУВАЧ + і призведе до великого дублювання результату. Ви повинні розділити їх, як показано нижче ...

Додайте до System PATH

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B

setx PATH "%SYSPATH%;C:\path1;C:\path2" /M

Додайте до PATH користувача

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%B

setx PATH "%userPATH%;C:\path3;C:\path4"

0

Цей гібрид vbscript / batch "append_sys_path.vbs" не є інтуїтивним, але чудово працює:

If CreateObject("WScript.Shell").Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """", , "runas", 5
    WScript.Quit
End If
Set Shell = CreateObject("WScript.Shell")
Cmd = Shell.Exec("%ComSpec% /C ""REG QUERY ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path | FINDSTR /I /C:""REG_SZ"" /C:""REG_EXPAND_SZ""""").StdOut.ReadAll
Cmd = """" & Trim(Replace(Mid(Cmd, InStr(1, Cmd, "_SZ", VBTextCompare) + 3), vbCrLf, ""))
If Right(Cmd, 1) <> ";" Then Cmd = Cmd & ";"
Cmd = "%ComSpec% /C ""REG ADD ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path /t REG_EXPAND_SZ /d " & Replace(Cmd & "%SystemDrive%\Python27;%SystemDrive%\Python27\Scripts"" /f""", "%", """%""")
Shell.Run Cmd, 0, True

Переваги такого підходу:

1) Це не скорочує середовище системного шляху на 1024 символи.
2) Це не об'єднує систему та середовище шляху користувача.
3) Він автоматично запускається від імені адміністратора.
4) Зберегти відсотки в середовищі системного шляху.
5) Підтримує пробіли, дужки та спеціальні символи.
6) Працює на Windows 7 та новіших версіях.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.