Як оновити змінну середовища користувача PATH з командного рядка


12

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

Я хотів би оновити змінну PATH користувача з командного рядка, наприклад, з setx.

Але я не знаю, як посилатися на існуючий шлях користувача в setx.

У наступній команді (setx без / M)

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

перший PATH означає користувача PATH, але другий% PATH% буде заміщений "повним" (користувач + система) 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. Встановити подачу для поточного користувача PATH:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"

12

Щоб встановити, що користувач PATH замінить будь-яке попереднє значення:

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" до існуючої PATH користувача:

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%

Це впливає на системну змінну PATH ... можливо, мій приклад був неправильним, але я хотів би спеціально оновити змінну PATH користувача.
Крістіан Лемер

@Chris op111.net/82
STTR

1

Це, здається, працює:

setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%

Це абсолютно НЕ ІДО, НІКОЛИ не оновлювати користувача або систему, 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 або входу в систему / входу в систему.
Мофі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.