Как добавить переменную PATH в Windows с помощью setx? Иметь странные проблемы

Я хочу изменить переменную 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.

Я действительно должен быть в состоянии сделать это в одной команде. Что я делаю неправильно?

Спасибо.

12 ответов

Бежать cmd как администратор, то:

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

Параметр /M устанавливает переменную в области SYSTEM. Поведение по умолчанию - установить его для пользователя.

TL; DR

Проблема усечения возникает потому, что при выводе%PATH% будет показано объединение значений SYSTEM и USER. Поэтому, когда вы добавите его в свой второй аргумент в setx, он будет соответствовать значениям SYSTEM и USER внутри переменной USER. Когда ты повторишь эхо, все будет удвоено.

Кроме того, для параметра /M требуются права администратора, поэтому вам нужно открыть терминал с помощью "Запуск от имени администратора", иначе setx будет жаловаться на "доступ к пути в реестре запрещен".

Последнее, что следует отметить: вы не увидите новое значение, когда вы выводите%PATH% сразу после его установки, вам нужно закрыть cmd и открой снова.

Если вы хотите проверить фактические значения, хранящиеся в реестре, проверьте этот вопрос.

Это прекрасно работает:

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%"

1-я команда получает переменную среды USER 'PATH' в переменную 'my_user_path'. 2-я строка добавляет 'C:\Python27;C:\Python27\Scripts;' в переменную среды USER 'PATH'

Если кто-то хочет запустить его в PowerShell, он работает, как показано ниже,

Запустите Powershell от имени администратора

затем

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

Чтобы проверить, откройте другой Powershell и просмотрите PATH, как показано ниже,

$Env:PATH

Если вы не обязаны setx, вы можете использовать альтернативный инструмент командной строки, как pathed. Более полный список альтернативных редакторов PATH можно найти по адресу https://superuser.com/questions/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712

Вы также можете редактировать значение реестра напрямую, вот что setx делает. Подробнее в этом ответе.

Странно что твой %PATH% становится усеченным до 1024 символов. я думал setx не было этой проблемы. Хотя вам, вероятно, следует очистить неверные записи пути.

Без прав администратора единственный способ, который работал для меня - это 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%"

Код представляет собой комбинацию ответов /questions/24886245/kak-dobavit-peremennuyu-path-v-windows-s-pomoschyu-setx-imet-strannyie-problemyi/24886258#24886258 и /questions/3950565/kak-postoyanno-ustanovit-peremennuyu-v-windows-7-iz-komandnogo-fajla/3950571#3950571

К сожалению, с инструментами OOTB вы не можете напрямую / легко добавить ни системный путь, ни путь пользователя. Если вы хотите использовать инструменты OOTB, вам нужно запросить путь SYSTEM или USER, сохранить это значение как переменную, затем добавить свои дополнения и сохранить его с помощью setx. В двух приведенных ниже примерах показано, как получить, сохранить и добавить свои дополнения. Не путайтесь с%PATH%, это конкатенация USER+SYSTEM, и это приведет к большому дублированию результата. Вы должны разделить их, как показано ниже...

Добавить в системный путь

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

Добавить в ПУТЬ пользователя

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

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

Я столкнулся с теми же проблемами и нашел легкое решение сейчас.

Используя Pathman.

pathman /as %M2%

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

Пробовал в Windows 10

Просто хотел повторюсь: ранее ответ от Manohar Reddy Poreddy является правильным.

Можно внести ряд улучшений, которыми, я подумал, будет полезно поделиться:

      @echo off

REM -- Use directory where script is located. For current working directory, use %CD%
set CURRENT_DIR=%~dp0
REM -- Great example from Strawberry Perl's portable shell launcher:
if #%CURRENT_DIR:~-1%# == #\# set CURRENT_DIR=%CURRENT_DIR:~0,-1%

REM -- Load the user PATH from the registry, making sure it is not blank
reg query HKCU\Environment /v PATH 1>nul 2>&1
if ERRORLEVEL 1 goto skipLoadPath
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set MY_USER_PATH=%%B

REM -- Optionally, checks if this directory is already part of the user PATH
REM -- This will avoid duplication, and allow this to be run multiple times,
REM -- but if a sub-directory of the current is already part of the user PATH,
REM -- this script will simply not do anything
echo %MY_USER_PATH%|find "%CURRENT_DIR%" >nul
if errorlevel 1 (goto skipLoadPath) else (goto skipSetXPath)
:skipLoadPath

REM -- Avoid adding a useless semicolon to the previous user PATH
if not "" == "%MY_USER_PATH%" set "MY_USER_PATH=%MY_USER_PATH%;"
REM -- Permanently set the following location as part of the system path
setx PATH "%MY_USER_PATH%%CURRENT_DIR%" >nul 2>&1
REM -- This will update the current environment, since SETX only updates the registry
set "PATH=%PATH%;%MY_USER_PATH%%CURRENT_DIR%"
:skipSetXPath
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

Это должно сделать добавление к пути переменной системной среды без добавления каких-либо дополнительных функций и сохранение оригинала без каких-либо потерь данных. Я использовал эту команду, чтобы исправить проблему, которую McAfee's Web Control делает с настольным клиентом Microsoft Outlook.

Цитаты используются в значении пути, потому что командная строка видит пробелы как разделитель и будет пытаться выполнить следующее значение в командной строке. Цитаты переопределяют это поведение и обрабатывают все, что находится внутри цитат, как строку.

У меня были такие проблемы с управлением компьютерными лабораториями, когда переменная окружения%PATH% приблизилась к 1024 символам, и я написал сценарий Powershell, чтобы исправить это.

Вы можете скачать код здесь: https://gallery.technet.microsoft.com/scriptcenter/Edit-and-shorten-PATH-37ef3189

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

Этот гибрид 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 и выше.

Шаги: 1. Откройте командную строку с правами администратора.

Шаги: 2. Запустите команду: setx /M PATH "путь \ к;% PATH%"

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

Пример: setx /M PATH "C:\Program Files;%PATH%"

Другие вопросы по тегам