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


12

Tôi có một biến PATH hệ thống với cấu hình cấp 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 dành riêng cho người dùng.

Tôi muốn cập nhật biến PATH của người dùng từ dòng lệnh chẳng hạn với setx.

Nhưng tôi không biết làm thế nào để tham chiếu đường dẫn người dùng hiện có 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ằng PATH "đầy đủ" (người dùng + hệ thống).

Vì vậy, điều đó có nghĩa là toàn bộ đường dẫn hệ thống sẽ được sao chép trong PATH của người dùng ... thứ chắc chắn không phải là thứ 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 / Chuẩn bị một hoặc nhiều phần tử đường dẫn đến giá trị hiện có
  • Làm điều đó từ dòng lệnh.

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ó (xuất phát từ đường dẫn hệ thống) sẽ được nối thêm.
Daniel R Hicks

Câu trả lời:


3

Phiên bản PowerShell, đặt PATH cho người dùng:

  1. Đặt PATH mới (ghi đè) cho người dùng hiện tại:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
  1. Đặt chắp thêm cho người dùng hiện tại PATH:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
  1. Đặt trả trước cho người dùng hiện tại PATH:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"

12

Để đặt ghi đè PATH của người dùng bất kỳ giá trị nào trước đó:

setx PATH "C:\MyPath1"

Để thêm một giá trị "C: \ MyPath0" cho Người dùng 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" )

Để nối thêm một giá trị "C: \ MyPath2" cho Người dùng 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-other là bắt buộc vì Người dùng PATH có thể có hoặc không chứa khoảng trắng. Nếu bạn muốn, bạn có thể lưu các lệnh dưới dạng tệp bó chung (đảm bảo nhân đôi mỗi ký hiệu%) chấp nhận giá trị được đặt / chuẩn bị / thêm vào làm đối số.

Tập tin 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.

1
cần giải thích thêm. % a là gì,% b là gì?
OfusJK

Thật không may, nó không hoạt động nếu người dùng PATH chưa được xác định :(
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 được tìm ra bằng mọi cách.
Karan

Mã này không kiểm tra xem người dùng PATH đã kết thúc bằng dấu chấm phẩy hay chưa, trong trường hợp nối thêm thư mục đã được thực hiện mà không cần thêm dấu chấm phẩy. Nhưng vấn đề lớn nhất với mã này là sự tham nhũng của người dùng PATH nếu chuỗi trở nên dài hơn 1024 ký tự do setx cắt ngắn chuỗi thành 1024 ký tự với việc hiển thị thông tin phù hợp trước khi thêm nó vào Windows registry. Vì vậy, có thể xảy ra rằng thay vì nối thêm thư mục đã qua, người dùng hiện tại PATHbị cắt bớt (bị cắt xén) bởi mã này.
Mofi

4

cần SETX /M, mặc định SETXđược đặt thànhHKEY_CURRENT_USER

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

Điều này ảnh hưởng đến biến PATH của hệ thống ... có thể ví dụ của tôi đã sai, nhưng tôi muốn cập nhật biến PATH của người dùng một cách cụ thể.
Christian Lemer

@ Chris op111.net/82
STTR

1

Điều này dường như làm việc:

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

Đó là một cách tuyệt đối KHÔNG CÓ, KHÔNG BAO GIỜ để cập nhật người dùng hoặc hệ thống PATH bằng cách sử dụng cục bộ PATH . Dòng lệnh này thực sự làm hỏng người dùng PATH bằng cách thêm vào Windows registry cho người dùng PATH chuỗi 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\;%trong trường hợp tốt nhất. Mọi người sử dụng dòng lệnh này đã làm hỏng thành công cài đặt người dùng PATHcục bộ PATH như được sử dụng bởi tất cả các quy trình đang chạy với tài khoản người dùng hiện tại sau khi Windows khởi động lại hoặc đăng xuất / đăng nhập.
Mofi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.