Windows에서 환경 변수를 편집하는 데 사용할 수있는 명령 줄 도구가 있습니까?


15

Windows에서 환경 변수를 편집하는 데 사용할 수있는 명령 줄 도구가 있습니까?

이것이 똑똑한 도구라면 좋을 것입니다.

  • PATH 변수 와이 경로가 이미 있다고 가정 할 때 경로를 추가하면이 항목을 두 배로해서는 안됩니다.
  • PATH 변수에 새 경로를 삽입하는 것은 다른 경로 앞이나 뒤에 또는 특정 순서 (첫 번째, 일곱 번째, 마지막 등)로 가능해야합니다.
  • 변수 값의 일부만 변경할 수 있어야합니다 (PATH의 경우 모든 경로 목록에서 지정된 경로).

그리고 마지막이지만 최소한은 아닙니다. 세션간에 변경 사항을 유지하려면 간단한 SET에 의문이 없습니다 ...

Path Editor 라는 멋진 GUI 도구가 있으며 명령 줄에는 이와 같은 것이 필요합니다.


4
기술적으로는 그렇습니다. SET이라고합니다. 나는 그것이 예쁘지 않다는 것을 알고 있지만, 도구를 사용하여 변수를 설정하는 것보다 훨씬 간단하지 않습니다.
Michael Todd

흥미 롭군 나는 이것을 위해 꽤 잘 알려진 타사 도구가있을 것이라고 확신했습니다.
Sasha Chedygov

어떤 버전의 Windows를 실행하고 있습니까?
Sasha Chedygov

@musicfreak Vista Home 프리미엄 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

새로운 가치를 씁니다.

HKLM에서 올바른 액세스를 확보하려면 관리자 권한이 필요합니다. 이것이 문제가되는 경우 HKCU\Environment대신 사용자 별 경로 설정을 수정하십시오 .


1
이 대답은 받아 들여 져야하며, 환경 변수를 변경할 수 있으며 배치 파일로 캡슐화 할 수도 있으므로 이름과 새 값만 입력하면됩니다.
Tamara Wijsman 2016 년

이것이 Vi와 결합되면 질문자의 기준을 충족시키는 데 더 가깝습니다. 예를 들어, 임시 텍스트 파일에 경로를 쓰는 배치 파일을 vi에서 연 다음 vi를 닫으면 파일을 경로에 씁니다. 그렇게하면 명령 줄을 통해 경로를 쉽게 편집 할 수 있습니다. XP에서 배치 파일, 메모장 및 해당 reg 명령을 사용하여 이와 같은 작업을 수행했습니다.
barlop

1
경고 당신이 어리석은 짓을하고 싶지 않다면 이것을
무의식적으로

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
Q는 명령 줄에서 PATH를 편집하기 때문에 대답이 주제가 아닌 경우에도 클릭 경로보다 훨씬 간단하기 때문에 GUI 편집 위젯으로 이동하는 명령 줄 방법의 경우 +1입니다.
matt wilkie

2

PATH 설정

(도움말 세트)


1
이것은 터미널 세션에만 해당되며 값을 추가 / 변경하려면 이전 경로 전체를 다시 입력해야합니다.
John T

2
사실이 아니다. SET PATH = % path %; c : \ newpath
Michael Todd

2
당신은 여전히 ​​그것을 입력하고 확장하지 않았습니다 :) 저장되지 않습니다. 명령 프롬프트를 종료하고 새 명령 프롬프트를 열고 경로를 확인하십시오.
John T

그는 세션간에 지속해야하는지 여부를 지정하지 않았습니다.
sangretu

4
글쎄, patheditor (그의 제안) 가하는 것을 체크 아웃하면 영구적으로 저장됩니다. set 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

슈어 죄송합니다. 질문을 암시 적으로 언급하고있었습니다.
hugo der hungrige

Gtools의 URL이 보이고 경로가 사라졌습니다. p-nand-q.com/gtools.html
DevPlayer

1

이를 위해 배치 스크립트 세트를 작성했습니다. addpath.bat는 경로에 요소를 추가하고 rmpath.bat는 경로에서 요소를 제거하며 lpath.bat는 경로 만 나열합니다. 그러나 지원 스크립트가 필요했기 때문에 chkpath.bat도 있습니다.

결국 사소한 것이 아니며 두 가지 유닉스 스타일 유틸리티 인 tr.exe 및 cat.exe가 필요했습니다. 사소하지 않은 이유 : 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루프 대신 루프를 사용할 수 있다고 생각합니다 . trcat
user1686

0

Windows Server 2003 Resource Kit Tools의 Path Manager (pathman.exe)는 내가 찾은 가장 근접한 것입니다. NT Resource Kit에서 이미 사용 가능했습니다.


아마 시도setx.exe
n611x007

@ n611x007 setx은 일반적인 환경 변수입니다. 경로 pathman를 조작 (즉, 파싱 )하기위한 것입니다.
Synetech

0

% PATH %에 디렉토리가 있는지 확인하는 방법? 스택 오버플로에는 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.