Как обновить переменную среды пользователя PATH из командной строки

12

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

Я хотел бы обновить пользовательскую переменную PATH из командной строки, например, с помощью setx.

Но я не знаю, как ссылаться на существующий путь пользователя в setx.

В следующей команде (setx без / M)

setx PATH c:\my-user-specifc-bin-path;%PATH%

первый PATH означает пользовательский PATH, но второй% PATH% будет заменен «полным» (user + system) PATH.

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

Я хотел бы:

  • Влияет только на переменную окружения PATH пользователя
  • Добавить / добавить один или несколько элементов пути к существующему значению
  • Сделайте это из командной строки.
Кристиан Лемер
источник
Сдается мне, что при использовании ;%PATH%вы запрашиваете существующий путь (производный от системного пути), который будет добавлен.
Даниэль Р Хикс

Ответы:

3

Версия PowerShell, установите PATH для пользователя:

  1. Установите новый PATH (перезаписать) для текущего пользователя:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
  1. Установить добавление к текущему пользователю PATH:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
  1. Установите prepend для текущего пользователя PATH:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"
Тхо Хо
источник
12

Чтобы установить ПУТЬ пользователя, перезаписывающую любое предыдущее значение:

setx PATH "C:\MyPath1"

Чтобы добавить значение «C: \ MyPath0» к существующей пользовательской переменной PATH:

for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "C:\MyPath0;%~a" ) else ( @setx PATH "C:\MyPath0;%~a %~b" )

Чтобы добавить значение «C: \ MyPath2» в существующий путь пользователя:

for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "%~a;C:\MyPath2" ) else ( @setx PATH "%~a %~b;C:\MyPath2" )

Условие if-else является обязательным, поскольку пользовательский PATH может содержать или не содержать пробелы. Если вы хотите, вы можете сохранить команды как общие пакетные файлы (обязательно удваивайте каждый знак%), которые принимают значение, которое будет установлено / добавлено / добавлено в качестве аргумента.

Пакетный файл

:: PATH-ADD - add a path to user path environment variable

@echo off
setlocal

:: set user path
set ok=0
for /f "skip=2 tokens=3*" %%a in ('reg query HKCU\Environment /v PATH') do if [%%b]==[] ( setx PATH "%%~a;%1" && set ok=1 ) else ( setx PATH "%%~a %%~b;%1" && set ok=1 )
if "%ok%" == "0" setx PATH "%1"

:end
endlocal
echo.
Каран
источник
1
нужно больше объяснений. что такое% a, что такое% b?
OfusJK
К сожалению, это не работает, если пользователь PATH еще не определен :(
nowox
@ KJK: for /?расскажет вам все, что вам нужно знать. :) Я не хотел копировать все это здесь без необходимости и думал, что информация будет легко понять в любом случае.
Каран
Код не проверяет, заканчивается ли пользователь PATH точкой с запятой, и в этом случае добавление переданного каталога должно выполняться без дополнительной точки с запятой. Но самая большая проблема в этом коде - это искажение пользователя, PATH если строка становится длиннее 1024 символов из-за setx усечения строки до 1024 символов с отображением соответствующей информации перед добавлением ее в реестр Windows. Так что может случиться так, что вместо добавления переданного каталога, существующий пользователь PATH усекается (искажается) этим кодом.
Мофи
4

нужно SETX /M, по умолчанию SETXустановленоHKEY_CURRENT_USER

SETX /M PATH c:\my-bin-path;%PATH%
STTR
источник
Это влияет на системную переменную PATH ... возможно, мой пример вводил в заблуждение, но я хотел бы специально обновить пользовательскую переменную PATH.
Кристиан Лемер
@Chris op111.net/82
STTR
1

Это похоже на работу:

setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%
rsphillips
источник
Абсолютно НЕТ ИДЕТ, НИКОГДА не обновлять пользователя или систему PATH с использованием локальных PATH . Эта командная строка действительно портит пользователя PATH , добавляя в реестр Windows для пользователя PATH строку c:\my-user-specifc-bin-path-which-may-contain-spaces;%C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;%в лучшем случае. Каждый, кто использует эту командную строку, успешно повредил настройки пользователя PATH и стал локальным, PATH что используется всеми процессами, запущенными с текущей учетной записью пользователя, после перезапуска Windows или выхода из системы / входа в систему.
Мофи