Jak zaktualizować zmienną środowiskową użytkownika PATH z wiersza polecenia

12

Mam zmienną systemową PATH z konfiguracją na poziomie systemu. Używam zmiennej PATH użytkownika, aby uzupełnić PATH konfiguracją specyficzną dla użytkownika.

Chciałbym zaktualizować zmienną PATH użytkownika z wiersza poleceń, na przykład za pomocą setx.

Ale nie wiem jak odwoływać się do istniejącej ścieżki użytkownika w setx.

W następującym poleceniu (setx bez / M)

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

pierwsza ŚCIEŻKA oznacza ŚCIEŻKĘ użytkownika, ale druga% ŚCIEŻKA% zostanie zastąpiona ŚCIEŻKĄ „pełną” (użytkownik + system).

Oznacza to, że cała ścieżka systemowa zostanie zduplikowana w ścieżce użytkownika ... co zdecydowanie nie jest tym, czego chcę.

Chciałbym:

  • Wpływa tylko na zmienną środowiskową PATH użytkownika
  • Dołącz / dołącz jeden lub więcej elementów ścieżki do istniejącej wartości
  • Zrób to z wiersza poleceń.
Christian Lemer
źródło
Wydaje mi się, że kiedy używasz ;%PATH%, prosisz o dołączenie istniejącej ścieżki (pochodzącej ze ścieżki systemowej).
Daniel R Hicks

Odpowiedzi:

3

Wersja PowerShell, ustaw PATH dla użytkownika:

  1. Ustaw nową ŚCIEŻKĘ (nadpisuj) dla bieżącego użytkownika:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
  1. Ustaw dołączanie do bieżącej ścieżki użytkownika:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
  1. Ustaw przedrostek dla bieżącej ścieżki użytkownika:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"
Tho Ho
źródło
12

Aby ustawić zastąpienie PATH użytkownika poprzednią wartością:

setx PATH "C:\MyPath1"

Aby dodać wartość „C: \ MyPath0” do istniejącej ŚCIEŻKI użytkownika:

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

Aby dodać wartość „C: \ MyPath2” do istniejącej ŚCIEŻKI użytkownika:

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

Warunek „if-else” jest wymagany, ponieważ ścieżka użytkownika może zawierać spacje lub nie. Jeśli chcesz, możesz zapisać polecenia jako ogólne pliki wsadowe (pamiętaj, aby podwoić każdy znak%), które akceptują wartość do ustawienia / uzupełnienia / dołączenia jako argument.

Plik wsadowy

:: 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.
Karan
źródło
1
potrzeba więcej wyjaśnień. co to jest% a, co to jest% b?
OfusJK
Niestety nie działa, jeśli PATH użytkownika nie jest jeszcze zdefiniowany :(
nowox
@KJK: for /?powie ci wszystko, co musisz wiedzieć. :) Nie chciałem powielać tego wszystkiego niepotrzebnie i pomyślałem, że i tak informacje będą łatwe do zrozumienia.
Karan
Kod nie sprawdza, czy użytkownik PATH kończy już średnikiem, w którym to przypadku dołączanie przekazanego katalogu powinno odbywać się bez dodatkowego średnika. Ale największym problemem z tym kodem jest uszkodzenie użytkownika, PATH jeśli łańcuch staje się dłuższy niż 1024 znaki z powodu setx obcięcia łańcucha do 1024 znaków z wyświetleniem odpowiedniej informacji przed dodaniem jej do rejestru Windows. Może się zdarzyć, że zamiast dopisanego katalogu istniejący użytkownik PATH zostanie obcięty (zniekształcony) przez ten kod.
Mofi,
4

potrzeba SETX /M, domyślnie SETXustawiony naHKEY_CURRENT_USER

SETX /M PATH c:\my-bin-path;%PATH%
STTR
źródło
Wpływa to na systemową zmienną PATH ... może mój przykład był mylący, ale chciałem zaktualizować konkretnie zmienną PATH użytkownika.
Christian Lemer
@Chris op111.net/82
STTR
1

To wydaje się działać:

setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%
rsphillips
źródło
To absolutnie NIE GO, NIGDY NIGDY nie aktualizować użytkownika lub systemu PATH za pomocą lokalnego PATH . Ten wiersz polecenia naprawdę psuje użytkownika PATH poprzez dodanie do rejestru systemu Windows dla użytkownika PATH ciąg 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\;%w najlepszym wypadku. Wszyscy używający tego wiersza poleceń z powodzeniem uszkodzili ustawienia użytkownika PATH , a więc lokalne, tak PATHjak są używane przez wszystkie procesy uruchomione z bieżącym kontem użytkownika po ponownym uruchomieniu systemu Windows lub wylogowaniu / zalogowaniu.
Mofi,