Câu hỏi Cách cập nhật biến môi trường người dùng PATH từ dòng lệnh


Tôi có một biến hệ thống PATH với cấu hình mức hệ thống. Tôi sử dụng biến PATH của người dùng để bổ sung cho PATH với cấu hình người dùng cụ thể.

tôi muôn cập nhật biến PATH của người dùng từ dòng lệnh, ví dụ với setx.

Nhưng tôi không biết làm thế nào để tham khảo đường dẫn người dùng hiện tại trong setx.

Trong lệnh sau (setx without / M)

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

PATH đầu tiên có nghĩa là PATH của người dùng nhưng% PATH% thứ hai sẽ được thay thế bởi PATH "đầy đủ" (user + system).

Vì vậy, nó có nghĩa là toàn bộ đường dẫn hệ thống sẽ được nhân đôi trong PATH người dùng ... những gì chắc chắn không phải là những gì tôi muốn.

Tôi muôn:

  • Chỉ ảnh hưởng đến biến môi trường PATH của người dùng
  • Nối / thêm một hoặc nhiều phần tử đường dẫn vào giá trị hiện tại
  • Làm điều đó từ dòng lệnh.

10
2018-05-28 20:42


gốc


Dường như với tôi rằng khi bạn sử dụng ;%PATH% bạn đang yêu cầu đường dẫn hiện có (bắt nguồn từ đường dẫn hệ thống) được nối thêm. - Daniel R Hicks


Các câu trả lời:


Để đặt User PATH ghi đè mọi giá trị trước đó:

setx PATH "C:\MyPath1"

Để thêm một giá trị "C: \ MyPath0" vào User PATH hiện có:

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

Để thêm một giá trị "C: \ MyPath2" vào User PATH hiện có:

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

Điều kiện if-else là bắt buộc vì User PATH có thể hoặc không thể chứa dấu cách. Nếu bạn muốn, bạn có thể lưu các lệnh dưới dạng các tệp batch chung (phải chắc chắn tăng gấp đôi mỗi dấu%) chấp nhận giá trị được đặt / được thêm vào / nối thêm làm đối số.

Tệp hàng loạt

:: 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.

8
2018-05-28 22:01



Câu trả lời rất chi tiết, nhưng tôi không thấy nó trả lời câu hỏi như thế nào. Để giữ cho nó ngắn gọn, câu hỏi là "Làm thế nào tôi có thể cập nhật User PATH từ dòng lệnh" ... nhưng tôi sẽ chỉnh sửa câu hỏi để làm cho nó rõ ràng hơn. Xin lỗi nếu nó không được. - Christian Lemer
@ Chris: Chỉnh sửa của bạn làm rõ những gì bạn thực sự muốn đạt được, vì vậy tôi đã cập nhật câu trả lời của tôi cho phù hợp. - Karan
cần thêm lời giải thích. % a,% b là gì? - KJK
Thật không may nó không hoạt động nếu người dùng PATH chưa được định nghĩa :( - nowox
@KJK: for /? sẽ cho bạn biết tất cả những gì bạn cần biết. :) Tôi không muốn sao chép tất cả ở đây một cách không cần thiết và nghĩ rằng thông tin sẽ dễ dàng tìm ra. - Karan


nhu cầu SETX /M, mặc định SETX đặt thành HKEY_CURRENT_USER

SETX /M PATH c:\my-bin-path;%PATH%

4
2018-05-28 21:18



Điều này ảnh hưởng đến biến hệ thống PATH ... có thể ví dụ của tôi là sai lệch, nhưng tôi wold muốn cập nhật biến PATH người dùng cụ thể. - Christian Lemer
@Chris op111.net/82 - STTR


Điều này dường như hoạt động:

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

1
2017-08-02 17:45