วิธีอัปเดตตัวแปรสภาพแวดล้อมผู้ใช้ PATH จากบรรทัดคำสั่ง


12

ฉันมีตัวแปร PATH ของระบบพร้อมการกำหนดค่าระดับระบบ ฉันใช้ตัวแปร PATH ของผู้ใช้เพื่อเสริม PATH กับการตั้งค่าเฉพาะของผู้ใช้

ฉันต้องการอัพเดตตัวแปร PATH ของผู้ใช้จาก command-line เช่น setx

แต่ฉันไม่รู้วิธีอ้างอิงเส้นทางผู้ใช้ที่มีอยู่ใน setx

ในคำสั่งต่อไปนี้ (setx ไม่มี / M)

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

PATH แรกหมายถึง PATH ของผู้ใช้ แต่% PATH ที่สองจะถูกแทนที่ด้วย PATH "เต็ม" (user + system)

ดังนั้นหมายความว่าเส้นทางของระบบทั้งหมดจะถูกทำซ้ำใน PATH ของผู้ใช้ ... สิ่งที่แน่นอนไม่ใช่สิ่งที่ฉันต้องการ

ฉันอยากจะ:

  • ส่งผลต่อตัวแปรสภาพแวดล้อม PATH ของผู้ใช้เท่านั้น
  • ผนวก / เติมองค์ประกอบของเส้นทางหนึ่งหรือมากกว่าหนึ่งไปยังค่าที่มีอยู่
  • ทำจากบรรทัดคำสั่ง

ดูเหมือนว่าเมื่อคุณใช้;%PATH%คุณกำลังขอเส้นทางที่มีอยู่ (มาจากเส้นทางของระบบ) ที่จะผนวกเข้า
Daniel R Hicks

คำตอบ:


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" ให้กับเส้นทางผู้ใช้ที่มีอยู่:

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 เนื่องจากเส้นทางผู้ใช้อาจมีหรือไม่มีช่องว่าง หากคุณต้องการคุณสามารถบันทึกคำสั่งเป็นไฟล์แบตช์ทั่วไป (ตรวจสอบให้แน่ใจว่าได้ใส่เครื่องหมาย% แต่ละอัน) สองเท่าที่ยอมรับค่าที่จะตั้งค่า / prepended / ต่อท้ายเป็นอาร์กิวเมนต์

ไฟล์ชุด

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

น่าเสียดายที่มันไม่สามารถใช้งานได้หากเส้นทางผู้ใช้ยังไม่ได้กำหนด :(
nowox

@KJK: for /?จะบอกทุกอย่างที่คุณจำเป็นต้องรู้ :) ฉันไม่ต้องการที่จะทำซ้ำทั้งหมดที่นี่โดยไม่จำเป็นและคิดว่าข้อมูลนั้นจะง่ายต่อการค้นหา
Karan

รหัสไม่ได้ตรวจสอบว่าผู้ใช้ PATHลงท้ายด้วยอัฒภาคในกรณีที่ผนวกไดเรกทอรีผ่านควรทำโดยไม่ต้องอัฒภาคเพิ่มเติม แต่ปัญหาที่ใหญ่ที่สุดของรหัสนี้คือความเสียหายของผู้ใช้ PATHหากสตริงยาวเกิน 1024 อักขระเนื่องจากsetx ตัดทอนสตริงเป็น 1024 อักขระด้วยการแสดงข้อมูลที่เหมาะสมก่อนเพิ่มลงในรีจิสทรีของ Windows ดังนั้นจึงอาจเกิดขึ้นได้ว่าแทนที่จะผนวกต่อท้ายไดเรกทอรีผู้ใช้ ปัจจุบันPATHจะถูกตัดทอน (อ่านไม่ออก) ด้วยรหัสนี้
Mofi

4

ต้องการตั้งค่าSETX /Mเริ่มต้นSETXเป็นHKEY_CURRENT_USER

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

สิ่งนี้มีผลต่อตัวแปร PATH ของระบบ ... บางทีตัวอย่างของฉันอาจทำให้เข้าใจผิด แต่ฉันอยากอัปเดตตัวแปร PATH ของผู้ใช้โดยเฉพาะ
Christian Lemer

@ Chris op111.net/82
STTR

1

ดูเหมือนว่าจะใช้งานได้:

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

มันเป็นที่แน่นอนไม่ไปไม่เคยที่จะปรับปรุงการใช้หรือระบบ PATHที่ใช้ในท้องถิ่น PATHบรรทัดคำสั่งนี้จริงๆ corrupts ผู้ใช้ 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 รีสตาร์ทหรือออกจากระบบ / เข้าสู่ระบบ
Mofi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.