มีเครื่องมือบรรทัดคำสั่งที่สามารถใช้แก้ไขตัวแปรสภาพแวดล้อมใน Windows ได้หรือไม่?


15

มีเครื่องมือบรรทัดคำสั่งที่สามารถใช้แก้ไขตัวแปรสภาพแวดล้อมใน Windows ได้หรือไม่?

มันจะดีถ้าเป็นเครื่องมืออันชาญฉลาดตัวอย่างเช่น:

  • เมื่อเพิ่มบางพา ธ เพื่อบอกว่าตัวแปร PATH และพา ธ นี้มีอยู่แล้วมันไม่ควรเพิ่มเป็นสองเท่าของรายการนี้
  • การแทรกพา ธ ใหม่ไปยังตัวแปร PATH ควรเป็นไปได้ก่อน / หลังบางเส้นทางอื่นหรือตามลำดับที่ระบุ (ลำดับแรกลำดับที่ 7 อันดับสุดท้ายเป็นต้น)
  • มันควรจะเป็นไปได้ที่จะเปลี่ยนเพียงบางส่วนของค่าของตัวแปร (ในกรณีของเส้นทางเส้นทางที่กำหนดจากรายการของเส้นทางทั้งหมด)

และสุดท้าย แต่ไม่ท้ายสุด - ฉันต้องการให้การเปลี่ยนแปลงของฉันยังคงมีอยู่ระหว่างเซสชันดังนั้นตลาดหลักทรัพย์จึงไม่ต้องสงสัยเลย ...

มีเครื่องมือ GUI ที่ดีมากสำหรับที่เรียกว่าPath Editorและฉันต้องการอะไรแบบนี้ แต่สำหรับบรรทัดคำสั่ง


4
ใช่แล้ว มันเรียกว่า SET ฉันรู้ว่ามันไม่ได้สวย แต่คุณไม่สามารถทำได้ตรงไปกว่าการตั้งค่าตัวแปรด้วยเครื่องมือที่อยู่ในมือ
Michael ทอดด์

น่าสนใจ ฉันคิดว่าแน่นอนว่าจะมีเครื่องมือบุคคลที่สามที่เป็นที่รู้จักกันดีในเรื่องนี้
Sasha Chedygov

คุณใช้ Windows รุ่นใดอยู่
Sasha Chedygov

@musicfreak Vista Home Premium 64 บิต
Piotr Dobrogost

คำตอบ:


16

ฉันไม่รู้เครื่องมือใด ๆ ที่ทำสิ่งนี้ แต่บางทีคุณสามารถใช้regคำสั่ง:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path

เพื่ออ่านเส้นทางปัจจุบันและ

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d "newPath" /f

เพื่อเขียนค่าใหม่ของคุณ

คุณต้องมีสิทธิ์ของผู้ดูแลระบบเพื่อรับสิทธิ์ hsving ใน HKLM หากเป็นปัญหาให้ลองปรับเปลี่ยนการตั้งค่าพา ธ เฉพาะของผู้ใช้ HKCU\Environmentแทน


1
คำตอบนี้ควรได้รับการยอมรับมันสามารถเปลี่ยนตัวแปรสภาพแวดล้อมใด ๆ และยังสามารถห่อหุ้มในแบทช์ไฟล์ดังนั้นหนึ่งต้องป้อนชื่อและค่าใหม่
Tamara Wijsman

หากรวมกับ Vi มันจะเข้าใกล้เกณฑ์ของผู้ถาม เช่นชุดไฟล์ที่เขียนเส้นทางไปยังไฟล์ข้อความชั่วคราวเปิดใน vi แล้วเมื่อคุณปิด vi จะเขียนไฟล์ไปยังเส้นทาง ด้วยวิธีนี้คุณสามารถแก้ไขเส้นทางของคุณผ่านบรรทัดคำสั่งได้อย่างง่ายดาย ฉันทำสิ่งนี้ใน XP ด้วยไฟล์แบตช์ notepad และคำสั่ง reg เหล่านั้น
barlop

1
คำเตือนอย่าคัดลอก - วางอย่างไร้เหตุผลถ้าคุณต้องการทำอะไรที่โง่ ...
n611x007

7

หากคุณต้องการวิธีทั่วไปในการตั้งค่าตัวแปรสภาพแวดล้อมใด ๆ และยังคงมีการเปลี่ยนแปลงอยู่setx.exeจะเป็นเครื่องมือที่ใช้ ไม่สามารถทำสิ่งที่ "ฉลาด" ที่คุณขอได้แม้ว่า ...

setx.exe มาพร้อมกับ Windows Vista หรือใหม่กว่า; หากคุณใช้ Windows รุ่นก่อนหน้าคุณสามารถใช้ลิงค์ดาวน์โหลดด้านบนเพื่อรับมัน


5

สำหรับโปรแกรมปัจจุบันนั้นมี path :

แสดงหรือตั้งค่าพา ธ การค้นหาสำหรับไฟล์ที่เรียกทำงานได้

PATH [[drive:]path[;...][;%PATH%]
PATH ;

ชนิด PATH ;เพื่อล้างการตั้งค่าเส้นทางการค้นหาทั้งหมดและนำcmd.exeไปค้นหาเฉพาะในไดเรกทอรีปัจจุบันเท่านั้น

พิมพ์PATHโดยไม่มีพารามิเตอร์เพื่อแสดงพา ธ ปัจจุบัน การรวม%PATH%ในการตั้งค่าเส้นทางใหม่ทำให้เส้นทางเก่าถูกผนวกเข้ากับการตั้งค่าใหม่

set PATHแต่นี้จะสวยมากเช่นเดียวกับ

setxสำหรับตัวแปรสภาพแวดล้อมที่ยังคงมีอยู่คุณต้องแก้ไขรีจิสทรีหรือการใช้งาน


3

ฉันเพิ่งค้นพบความสามารถในการอนุญาตให้ผู้ใช้เรียกใช้กล่องโต้ตอบแก้ไขตัวแปรสภาพแวดล้อมโดยไม่มีสิทธิ์ยกระดับ

จากเมนูเริ่มให้เรียกใช้สิ่งต่อไปนี้:

rundll32 sysdm.cpl,EditEnvironmentVariables

2
+1 สำหรับวิธีใช้บรรทัดคำสั่งในการไปที่วิดเจ็ตการแก้ไข GUI เนื่องจากแน่นอนกว่าตรงไปข้างหน้ามากกว่าเส้นทางการคลิก
matt wilkie

2

ตั้งค่า PATH

(ชุดความช่วยเหลือ)


1
นี่เป็นเพียงสำหรับเซสชันเทอร์มินัลและเพื่อเพิ่ม / เปลี่ยนค่าที่คุณต้องพิมพ์เส้นทางเก่าทั้งหมดอีกครั้ง
John T

2
ไม่จริง. SET PATH =% path%; c: \ newpath
Michael Todd

2
คุณยังพิมพ์มันไม่ขยายออก :) นั่นยังไม่บันทึกลองออกจากพรอมต์คำสั่งแล้วเปิดใหม่แล้วตรวจสอบเส้นทางของคุณ
John T

เขาไม่ได้ระบุว่าจำเป็นต้องคงอยู่ระหว่างเซสชันหรือไม่
sangretu

4
ดีถ้าคุณตรวจสอบสิ่งที่ patheditor (คำแนะนำของเขา) ทำมันจะบันทึกอย่างถาวร ตั้งค่า PATH ถูกใช้จริงในการสร้างสคริปต์สำหรับโปรแกรมเพราะมันเป็นแบบชั่วคราว
John T

2

คุณอาจต้องการตรวจสอบเส้นทางของคอลเลกชัน gtools: http://www.p-nand-q.com/gtools.html

มันมีชุดของคำสั่งสำหรับคำสั่งที่ต้องการเช่น

pathed /APPEND %CD% /USER

เพื่อผนวกเส้นทางปัจจุบันตัวอย่างเช่น ฉันยังไม่ได้ตรวจสอบความจริงเพราะฉันสบายดีกับการใช้ GUI

ตัวเลือกอื่น ๆ :

  /MACHINE: print machine PATH
     /USER: print user PATH
      /ADD: add variable at the head
   /APPEND: add variable at the tail
   /REMOVE: remove path / index
     /SLIM: strip duplicate vars
      /ENV: environment variable, defaults to PATH

เมื่อรวมกับคอลเล็กชั่นเดียวกันคุณก็มีเครื่องมือที่ดีเช่นกัน ไฟล์ใดที่ "หาตำแหน่งไฟล์ที่เรียกใช้งานได้บน PATH"

 /EXTENSION: search for extension , can be a ; separated list
       /DIR: add directory , can be a ; separated list
 /RECURSIVE: search directories recursively
    /SINGLE: stop after the first find result
       /ENV: environment variable, defaults to PATH
FILE {FILE}: one or more files to find

ที่มา: http://op111.net/82/


1
คุณช่วยอธิบายสิ่งที่คุณกำลังลิงก์ไปได้หรือไม่? คำตอบสำหรับลิงก์อย่างเดียวอาจไม่ถูกต้องหากเนื้อหาที่เชื่อมโยงใช้งานไม่ได้
bwDraco

Shure ขออภัยฉันอ้างถึงคำถามโดยปริยาย
hugo der hungrige

ดูเหมือนว่า URL สำหรับ Gtools และเส้นทางนั้นตายแล้ว p-nand-q.com/gtools.html
DevPlayer

1

ฉันเขียนชุดสคริปต์ชุดสำหรับสิ่งนี้ addpath.bat เพิ่มองค์ประกอบให้กับเส้นทาง rmpath.bat ลบองค์ประกอบจากเส้นทางและ lpath.bat เพียงแค่รายการเส้นทาง แต่ฉันต้องการสคริปต์สนับสนุนบางส่วนดังนั้นจึงมี chkpath.bat

มันไม่ได้เป็นเรื่องเล็กน้อยและจำเป็นต้องใช้ tr.exe และ cat.exe ซึ่งเป็นยูทิลิตี้สไตล์ยูนิกซ์ เหตุผลที่มันไม่สำคัญ: ไม่มี backticks ใน cmd.exe (แม้ว่าคุณสามารถใช้สำหรับลูปสำหรับสิ่งนี้) และชื่อสั้น ๆ เมื่อเทียบกับชื่อยาว

addpath.bat:

@echo off
setlocal
set cwd=%~dps0

goto testit

:loopy

call %cwd%chkpath "%~1"
if %errorlevel%==2 (
  set path=%path%;%~1
)

shift

:testit
if not _%1==_ goto loopy


call %cwd%lpath.bat

endlocal & set path=%path%

ChkPath.bat:

@echo off
goto START

-------------------------------------------------------
chkpath.bat

checks path for existence of the given segment.
Returns 1 if present, 2 if not present, 0 if not checked.

The matching and checking complicated by case sensitivity and "short pathnames".

created sometime in 2003 and lovingly maintained since then.


-------------------------------------------------------

:START
setlocal enabledelayedExpansion
set rc=0
set cwd=%~dps0
set curdrive=%~d0
set tr=%curdrive%\bin\tr.exe
set regexe=%windir%\system32\reg.exe


if _%1==_ goto Usage


@REM convert arg 1 to a fully-qualified, short path name,
@REM and then convert to uppercase.
set toupper=%~fs1
call :ToUpper
set tocheck=%toupper%


if not _%TEMP%==_ goto GotTemp
call :gettemp


:GotTemp
set d=%DATE:~4%
set stamp=%d:~6%%d:~3,2%%d:~0,2%%TIME::=%
set d=
set tempfile1=%TEMP%\chkpath1-%stamp%.tmp

echo %path% | %tr% ; \n  >  %tempfile1%

@REM check each element in the path for the match:
for /f  "delims=^" %%I in (%tempfile1%) do (
  if !rc!==0 (
call :CheckElt "%%I"
  )
)

if %rc%==0 set rc=2
goto END


--------------------------------------------
* checkelt
*
* check one element in the path to see if it is the same
* as the TOCHECK string. The element is first canonicalized.
*

:CheckElt
@REM remove surrounding quotes
set ERF=%1
if [x%ERF%]==[x] goto CheckEltDone
@REM convert to fully-qualified, short paths, uppercase
set TOUPPER=%~fs1%
call :ToUpper
if _%TOCHECK% == _%TOUPPER% set rc=1
:CheckEltDone
goto:EOF
--------------------------------------------


--------------------------------------------
* backtick
*
* invoke a command and return the result as a string.
* This is like backtick in csh or bash.
* To call, set variable BACKTICK to the command to be run.
* The result will be stored in the env variable of the same name.
*

:backtick
FOR /F "usebackq delims=" %%i IN (`%backtick%`) DO (
  SET backtick=%%i
)
goto backtick_done
:backtick_none
  SET backtick=nothing to exec
:backtick_done
goto:EOF
--------------------------------------------


--------------------------------------------
* gettemp
*
* get the temporary directory, as stored in the registry.
* Relies on backtick.
*
* The result set TEMP.
*

:gettemp
set regkey=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
set regvalname=Local AppData
set backtick=%regexe% query "%regkey%" /v "%regvalname%"
call :backtick
for /f "tokens=4" %%a in ("%backtick%") do (
  set temp=%%a
)
goto:EOF
--------------------------------------------



--------------------------------------------
* ToUpper
*
* Convert a string to all uppercase.
* To call, set variable TOUPPER to the thing to be converted.
* The result will be stored in the env variable of the same name.
*

:ToUpper
  FOR /F "usebackq delims=" %%I IN (`echo %toupper% ^| %tr% a-z A-Z`) DO (
SET toupper=%%I
  )
goto:EOF
--------------------------------------------


--------------------------------------------
:CleanUp
  if _%tempfile1%==_ goto CleanUpDone
  if exist %tempfile1% del %tempfile1%
  :CleanUpDone
goto:EOF
--------------------------------------------


--------------------------------------------
:Usage
echo.
echo Usage: chkpath ^<path^>
echo checks if path element is included in path variable.
echo returns 1 if yes, 2 if no, 0 if not checked.
echo.
goto END
--------------------------------------------


:END
call :CleanUp

:ReallyEnd

endlocal & set errorlevel=%rc%
@REM set errorlevel=%rc%
@REM echo %errorlevel%

lpath.bat:

@echo.
@set curdrive=%~d0

@REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'

@REM This form shows bare path elements.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g'
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.

ฉันคิดว่าforสามารถใช้การวนซ้ำแทนtr/ catเกินไปได้
user1686

0

ตัวจัดการเส้นทาง (pathman.exe) จากเครื่องมือชุดทรัพยากรของ Windows Server 2003 ตรงกับที่ฉันพบมากที่สุด มีอยู่แล้วใน NT Resource Kit


อาจลองsetx.exe
n611x007

@ n611x007 setxสำหรับตัวแปรสภาพแวดล้อมทั่วไป pathmanมีไว้สำหรับจัดการ (เช่นการแยก ) พา ธ โดยเฉพาะ
Synetech

0

จะตรวจสอบว่ามีไดเรกทอรีอยู่ใน% PATH% ได้อย่างไร? บน Stack Overflow มีคำอธิบายที่ชัดเจนว่าอะไรทำให้การแก้ไข Windows PATH ยากขึ้นพร้อมกับไฟล์แบตช์เพื่อเอาชนะ การหาวิธีการใช้อย่างถูกต้องนั้นaddpath.batมีการฝึกฝนเล็กน้อยเนื่องจากโครงสร้างการโทรเป็นเรื่องใหม่สำหรับฉัน แต่สิ่งนี้ได้ผล:

set _path=C:\new\directory\to\add\to\path
call addpath.bat _path
set _path=

และการไล่ออกซ้ำ ๆ จะไม่เพิ่มไดเรกทอรีใหม่หากมีอยู่แล้ว ที่อยู่นี้ไม่ได้ทำให้การแก้ไขแบบถาวรตลอดเซสชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.