setx를 사용하여 Windows PATH 변수에 어떻게 추가합니까? 이상한 문제가


79

.NET을 사용하여 Windows PATH 변수를 수정하고 싶습니다 setx. 다음은 Windows 8에서 50 % 이상 작동합니다.

setx PATH %PATH%;C:\Python27\;C:\Python27\Scripts\

"기본 인수는 2 번만 사용할 수 있습니다."라는 오류 메시지가 표시되면 다음과 같은 경우가 있습니다.

setx PATH "%PATH%;C:\Python27\;C:\Python27\Scripts\"

차이점은 두 번째 인수를 따옴표로 묶었다는 것입니다. %PATH%공백을 포함하도록 확장 할 때 따옴표가 필요하다고 생각합니다 .

그러나 Windows 7에서 이상한 문제가 발생했습니다. 특정 Windows 7 컴퓨터에서 다음과 같은 문제가 발생했습니다.

echo %PATH%

다음을 인쇄합니다.

C:\Foo\;C:\Bar\;[...lots of stuff...]C:\Baz\

그런 다음 이렇게합니다.

setx PATH "%PATH%;C:\Quux\"

그런 다음 "오류 : 1,024 자에서 잘림"이라고 표시됩니다. 이제 PATH에 포함 된 내용을 확인하겠습니다.

echo %PATH%

다음을 인쇄합니다.

C:\Foo\;C:\Foo\;C:\Bar\;C:\Bar\;[...lots of stuff, now duplicated...]C:\B

... 그리고 1,024 자로 잘립니다. 중복 때문에 달렸습니다. 또한 흥미로운 점 : setx오류가 발생하고 "성공"이라고 말하지 않았 음에도 불구하고 PATH의 값이 변경 됩니다.

이 이상한 동작을 여러 번 반복 할 수있었습니다 (다행히도 PATH의 원래 내용을 저장했습니다).

현재 내가 아는 유일한 확실한 방법은 PATH에 추가하는 것입니다.

  1. echo 경로.

  2. PATH의 내용을 텍스트 파일에 복사하고 수동으로 ;C:\Python27\;C:\Python27\Scripts\PATH 끝에 추가 합니다.

  3. 텍스트 파일에서 모든 것을 복사하십시오.

  4. setx PATH "<paste the string here>"

이 프로세스는 Windows 7과 Windows 8 모두에서 매번 작동합니다.

나는 이것을 하나의 명령으로 정말로 할 수 있어야한다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

감사합니다.


10
사용 setx은 또 다른 이유로 위험합니다. 경로에 환경 변수 (예 %JAVADIR%\bin:)가 포함 된 경우 참조가 손실됩니다. 즉, JAVADIR이 변경되면 경로가 더 이상 변경되지 않습니다. 소프트웨어 설치 프로그램 인 경우 최종 사용자 시스템이 손상 될 수 있습니다. 좋은 생각이 아닙니다.
Harry Johnston

1
@HarryJohnston, 이것은 의도적으로 설계된 것입니다. 당신이 할 때마다 %, 그것은 그 자리 에서 그것을 해석합니다 .
Pacerier

2
@Pacerier, 경로에 대한 레지스트리 항목의 모든 환경 변수 참조는 이미 확장되었으며, 이는 환경 블록이 빌드 될 때 발생합니다. 당신이 먹이 그래서 %PATH%으로 setx이 정보를 잃어 가고있다. 또한 물론 OP가 수행하는 방식은 시스템 경로 설정이 사용자 경로 설정에 추가되고 질문을 다시 보면 그것이 OP 문제의 실제 원인 인 것처럼 보입니다.
해리 존스턴

2
@HarryJohnston, env 변수에는 hkcu reg_sz, hkcu reg_expand_sz, hklm reg_sz, hklm reg_expand_sz의 4 가지 종류가 있습니다. (regedit를 사용하여 수동으로 조정하고 실행 setx하여 플러시를 완료 할 수 있습니다 .) ~~~ 입력에 2+ 문자 가 포함 된 경우 둘 다 setxsetx/m기본값은 reg_sz %입니다. ~~~ hklm 및 hkcu에서 "expand"는 hklm으로 확장하는 것을 의미합니다. setx/m qwe %JAVADIR%\bin그리고 setx/m javadir asdfg어느 순서로든. 그런 다음 새 cmd를 열고echo %qwe% : 예상대로 작동합니다.
Pacerier

3
@Pacerier, 관련성이 보이지 않습니다. PATH의 값은 이미 확장 되어 있고 HKCU 및 HKLM 항목을 모두 포함합니다 (후자는 특별한 경우이며 다른 환경 변수에 대해서는 발생하지 않음). 따라서 HKLM의 경로가 원래 포함되어 %JAVADIR%\bin있고 HKCU의 경로가 원래 포함 된 경우 포함 된 %JDK%\bin다음 PATH에 설정됩니다 C:\Java\bin;C:\jdk\bin당신이 말할 때 너무 setx PATH %PATH%HKCU의 값으로 변경 C:\Java\bin;C:\jdk\bin하는 (a)는 더 이상 트랙 JDK의 값으로 변경되지 중복 항목와 (b)가 포함되어 있습니다.
해리 존스턴

답변:


76

cmd관리자 권한 으로 실행 한 다음 :

setx /M PATH "%PATH%;<your-new-path>"

/ M 옵션은 SYSTEM 범위에서 변수를 설정합니다. 기본 동작은 USER에 대해 설정하는 것입니다.

TL; DR

잘림 문제는 % PATH %를 에코 할 때 SYSTEM 및 USER 값의 연결을 표시하기 때문에 발생합니다. 따라서 setx에 대한 두 번째 인수에 추가하면 USER var 안에 SYSTEM 및 USER 값이 적합합니다. 다시 울리면 일이 두 배가 될 것입니다.

또한 / M 옵션에는 관리자 권한이 필요하므로 "관리자 권한으로 실행"을 사용하여 터미널을 열어야합니다. 그렇지 않으면 setx가 "레지스트리 경로에 대한 액세스가 거부되었습니다"라는 메시지를 표시합니다.

마지막으로 유의해야 할 사항 : 이렇게 설정 한 직후 % PATH %를 에코하면 새 값이 표시되지 않으므로 닫고 cmd다시 열어야합니다.

레지스트리에 저장된 실제 값을 확인하려면 이 질문을 확인 하십시오 .


26
이 솔루션은 가짜입니다. 위의 명령을 실행하면 Path유형이에서 REG_EXPAND_SZ로 변경 됩니다 REG_SZ. 그리고 그 과정에서 거기에 존재하는 모든 환경 변수 참조를 제거하십시오.
user2023370

@garyM 피드백 주셔서 감사합니다. 나는 제 경우에 언급 된 결과를 경험하지 않았거나 알지 못했습니다. 이 답변을 수정할 수있는 방법이 있으면 알려주십시오. 또는 다른 답변을 제안하는 경우.
Vituel

2
안녕하세요 Vituel,이 문제는 변수가 새로 생성 된 후 나중에 동일한 프로세스 내에서 수정 될 때 발생합니다. 새로 생성 된 변수는 기존 셸 환경에 표시되지 않습니다. 모든 참조는 참조 % var %를 텍스트 문자열로 취급합니다. 이 문제를 방지하려면 변수가 생성 된 후 생성 된 새 프로세스에서 변수에 액세스해야합니다. 경로 변수는 일부 Windows 버전에서 특수한 경우입니다. 2008R2에서 PATH 변수의 수정은 기존 프로세스로 승격되지 않으며 변경 사항을 가져 오려면 다시 인스턴스화해야합니다. OS에 따라 / M이 끝에 있습니다.
garyM

2
또한 사용자 PATH 변수가 컴퓨터 PATH에 추가되어 (a) 다른 사용자를 방해합니다. 그리고 (b) 반복적으로 달리는 경우, 결국 오버플로 될 때까지 경로의 길이를 계속 늘립니다. 대부분 의 경우 PATH에 대한 사용자 설정이 없으므로 벗어날 수 있지만 위험합니다.
Harry Johnston

3
이것을 사용하지 마십시오. setxPATH를 1024 자로 자릅니다. 이전에 더 많은 디렉토리를 추가하여 PATH를 변경했다면 원래 PATH 내용의 대부분을 잃게됩니다 !
e.tadeu

23

이것은 완벽하게 작동합니다.

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set my_user_path=%B

setx PATH "C:\Python27;C:\Python27\Scripts;%my_user_path%"

첫 번째 명령은 USER 환경 변수 'PATH'를 'my_user_path'변수로 가져옵니다. 두 번째 줄은 'C : \ Python27; C : \ Python27 \ Scripts;'앞에 추가합니다. USER 환경 변수 'PATH'에


2
이 대답은 논리적으로 올바른 imo입니다. 이 답변이 더 많은 표를 얻지 못하거나 수락되지 않은 이유는 무엇입니까? 내가 놓친 것이 있습니까?
Siva Sankaran 19

2
@AMVaddictionist-.bat 파일로 실행하거나 cmd에서 직접 실행하는 경우 %% 또는 %와 관련이 있다고 생각합니다. 도움이되기를 바랍니다.
Manohar Reddy Poreddy

2
동의하다. 이것이 정답입니다. 쓰여진대로 명령 프롬프트에서 실행하기위한 것이며 배치 파일에서 실행하려면 단일 %를 이중 %%로 바꿔야합니다.
JonathanDavidArndt

1
@ManoharReddyPoreddy 고맙습니다, 환경 변수를 백업했지만이 답변은 다른 답변과 비교할 때 보석입니다. 먼저 이전 환경 변수를 저장 한 다음 새 변수를 추가합니다. 잘 작동합니다 :)
mozilla_firefox

1
@mozilla_firefox-예, 백업을하고 새로운 것을 시도합니다 :), 우리는 적절한 개발자입니까? : D
Manohar Reddy Poreddy

5

누군가 PowerShell에서 실행하려면 아래와 같이 작동합니다.

관리자 권한으로 Powershell 실행

그때

setx /M PATH "$Env:PATH;<path to add>"

확인하려면 다른 Powershell을 열고 아래와 같이 PATH를 확인하십시오.

$Env:PATH

4

에 속지 않는 경우 pathedsetx 와 같은 대체 명령 줄 도구를 사용할 수 있습니다 . /superuser/297947/is-there-a-convenient-way-to-edit-path-in-windows-7/655712#655712에 더 포괄적 인 대체 PATH 편집기 목록이 있습니다.

레지스트리 값을 직접 편집 할 수도 있습니다 setx. 이 답변 에서 더 .

%PATH%1024 자에서 잘리는 것이 이상합니다 . 나는 setx그 문제가 없다고 생각 했다. 유효하지 않은 경로 항목을 정리해야 할 수도 있습니다.


5
제안 해 주셔서 감사하지만 타사 소프트웨어에 의존하고 싶지 않습니다. Windows와 함께 제공되는 것만 사용하고 싶습니다. 이것은 두 가지 주요 사용 사례가 있기 때문입니다. (1) Python을 배우고 싶은 초보자를 설정하고 (2) 회사 공장에서 사용되는 기계를 설정합니다. 두 경우 모두 PATH를 한 번만 편집하는 임의의 Windows 시스템입니다. PATH 편집을 가능한 한 쉽게 만들고 싶습니다. 더 많은 소프트웨어를 설치한다고해서 잘리지 않습니다. 그렇기 때문에 4 단계 해결 방법만으로는 충분하지 않습니다.
SerMetAla 2013

그래서 내가 링크 한 도구는 zip 파일로 묶을 수있는 휴대용 바이너리를 가지고 있습니다. 사용자가 .bat파일 을 실행하는 것처럼 간단한 작업을 수행 PATH하고 Python 코드를 설정하고 편집 을 처리하도록 할 수 있습니다.
Ehtesh Choudhury 2013

4

관리자 권한이 없으면 다음 코드가 포함 된 bat 파일 만 저에게 효과적이었습니다.

for /F "tokens=2* delims= " %%f IN ('reg query HKCU\Environment /v PATH ^| findstr /i path') do set OLD_SYSTEM_PATH=%%g
setx PATH "%USERPROFILE%\wev-tools;%OLD_SYSTEM_PATH%"

코드는 https://stackoverflow.com/a/45566845/4717152https://stackoverflow.com/a/10292113/4717152 답변의 조합입니다.


경로의 해당 부분이 % USERPROFILE %에 대한 변경 사항을 따르도록하려면 %%bat 파일에서 double 을 사용할 수 있습니다 (또는 ^%명령을 직접 실행하는 경우 -bat 대 cmd에서 이스케이프하는 방법 참조 ).
TamaMcGlinn

3

나는 같은 문제에 직면했고 이제 쉬운 해결책을 찾았습니다.

Pathman 사용.

pathman /as %M2%

예를 들어 % M2 %를 시스템 경로에 추가합니다. 그 이상도 이하도 아닙니다. 사용자 PATH와 시스템 PATH를 혼합하는 데 더 이상 문제가 없습니다. 더 이상 레지스트리에서 올바른 값을 가져 오려고하지 않아도됩니다.

Windows 10에서 시도



@PatMigliaccio 귀하의 링크가 죽었
TamaMcGlinn

2
setx path "%PATH%; C:\Program Files (x86)\Microsoft Office\root\Office16" /m

이렇게하면 추가 항목없이 시스템 환경 변수 경로에 추가하고 데이터 손실없이 원본을 그대로 유지해야합니다. 이 명령을 사용하여 McAfee의 Web Control이 Microsoft의 Outlook 데스크톱 클라이언트에 수행하는 문제를 수정했습니다.

명령 줄은 공백을 구분 기호로 인식하고 명령 줄에서 다음 값을 실행하려고하기 때문에 따옴표가 경로 값에 사용됩니다. 따옴표는이 동작을 무시하고 따옴표 안의 모든 것을 문자열로 처리합니다.


0

단계 : 1. 관리자 권한으로 명령 프롬프트를 엽니 다.

단계 : 2. 다음 명령을 실행합니다. setx / M PATH "path \ to; % PATH %"

[참고 : path \ to가 루트의 폴더 경로를 반영하도록 명령을 변경해야합니다.]

: setx / M PATH "C : \ Program Files; % PATH %"


4
OP는 그의 문제에 대한 몇 가지 세부 사항과 관찰을 설명했습니다. OP는 그의 문제를 해결하기위한 몇 가지 시도를 설명했습니다. 그들 중 일부는 당신의 제안과 매우 유사합니다. 관련 차이점을 강조하고 OP 문제를 해결하는 방법을 설명 할 수 있습니까?
Yunnosch


0

안타깝게도 OOTB 도구를 사용하면 시스템 경로 또는 사용자 경로를 직접 / 쉽게 추가 할 수 없습니다. OOTB 도구를 계속 사용하려면 SYSTEM 또는 USER 경로를 쿼리하고 해당 값을 변수로 저장 한 다음 추가 항목을 추가하고 setx를 사용하여 저장해야합니다. 아래 두 가지 예는 둘 중 하나를 검색하고 저장하고 추가하는 방법을 보여줍니다. % PATH %를 엉망으로 만들지 마십시오. 이것은 USER + SYSTEM의 연결이므로 결과에 많은 중복이 발생합니다. 아래와 같이 분할해야합니다.

시스템 PATH에 추가

for /f "usebackq tokens=2,*" %A in (`reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) do set SYSPATH=%B

setx PATH "%SYSPATH%;C:\path1;C:\path2" /M

사용자 PATH에 추가

for /f "usebackq tokens=2,*" %A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%B

setx PATH "%userPATH%;C:\path3;C:\path4"

0

이 vbscript / batch 하이브리드 "append_sys_path.vbs"는 직관적이지는 않지만 완벽하게 작동합니다.

If CreateObject("WScript.Shell").Run("%ComSpec% /C ""NET FILE""", 0, True) <> 0 Then
    CreateObject("Shell.Application").ShellExecute WScript.FullName, """" & WScript.ScriptFullName & """", , "runas", 5
    WScript.Quit
End If
Set Shell = CreateObject("WScript.Shell")
Cmd = Shell.Exec("%ComSpec% /C ""REG QUERY ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path | FINDSTR /I /C:""REG_SZ"" /C:""REG_EXPAND_SZ""""").StdOut.ReadAll
Cmd = """" & Trim(Replace(Mid(Cmd, InStr(1, Cmd, "_SZ", VBTextCompare) + 3), vbCrLf, ""))
If Right(Cmd, 1) <> ";" Then Cmd = Cmd & ";"
Cmd = "%ComSpec% /C ""REG ADD ""HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"" /v Path /t REG_EXPAND_SZ /d " & Replace(Cmd & "%SystemDrive%\Python27;%SystemDrive%\Python27\Scripts"" /f""", "%", """%""")
Shell.Run Cmd, 0, True

이 접근 방식의 장점 :

1) 1024 자에서 시스템 경로 환경을 자르지 않습니다.
2) 시스템과 사용자 경로 환경을 연결하지 않습니다.
3) 관리자 권한으로 자동 실행됩니다.
4) 시스템 경로 환경에서 백분율을 유지하십시오.
5) 공백, 괄호 및 특수 문자를 지원합니다.
6) Windows 7 이상에서 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.