Windows가 Path에서 환경 변수를 처리 할 수없는 이유는 무엇입니까?


44

동료와 Windows XP Professional x64 에디션이 설치된 동일한 Dell 워크 스테이션이 있습니다.

내 경로 환경 변수는 다음으로 시작합니다.

%JAVA_HOME%\bin;...

동료의 Path 변수에는 동일한 환경 변수를 사용하여 지정된 동일한 디렉토리가 포함되어 있지만 Path의 첫 번째 항목은 아닙니다.

시스템 특성-> 환경 변수에 액세스하고 JAVA_HOME 변수 값을 변경하면 명령 행에서 찾은 java 버전이 예상대로 변경됩니다. 변경 사항을 적용하기 위해 새로운 콘솔 창이 시작됩니다.

그러나 내 동료의 컴퓨터에서는 그렇지 않습니다. 그는 Path 변수를 가져 와서 저장할 때까지 (이전의 Java 버전을 찾지 않아도) 이전 버전의 Java를 계속 찾습니다. (이것은 새로운 콘솔 창을 시작할 때입니다.)

나는 약 6 개월 동안 Windows 에서이 불일치를 관찰하고 그것에 대해 매우 궁금합니다. 우리 사무실에는 너무 많은 Windows 버전이 있으므로 지금까지 동일한 OS 버전을 실행하는 두 대의 컴퓨터에서 이런 일이 발생하는 것을 거의 볼 수 없었습니다.

이 원인은 무엇입니까? 내 컴퓨터가 새로운 JAVA_HOME을 사용하여 경로를 다시 평가하지 않는 이유는 무엇입니까?

(경로에서 첫 번째가 아니기 때문에? 그렇다면 어떻게 할 수 있으며 왜 그런가? 나는 더 많은 테스트를 해보고 싶지만, 그는 지금 그것에 지 쳤고 다시 일하고 싶다고 생각한다. .)


9
당신이 닫으려고 투표하는 모든 사람들에게 (현재 3) ... 어딘가에 멍청이가 있다면, 그것을 가리키는 의견이 좋을 것입니다. 그것이 속임수가 아닌 경우 ...이 질문에 잘못되었다고 생각하는 것이 있으면 좋을 것입니다.
skiphoppy

1
프로그래밍에 직접적인 영향을 미치더라도 프로그래밍 질문보다 시스템 질문이므로 아마도 닫으려고 투표하지 않는 이유는 ... ...)

9
Attenion close-nazis : superuser.com과 serverfault.com이 도착하기 전에 Stack Overflow에 대한 질문이 적절한 경우 오늘날에도 여전히 적절하다는 견해를 홍보하고 싶습니다. 이것은 프로그래밍 문제입니다.
skiphoppy

프로그래머가이 문제를 겪을 수있는 Windows 사용자 일 뿐입니 까? 닥쳐, 프로그래머 나치! 둘째, 더 적절한 Q & A 사이트가 도착하기 전에 여기에 질문을 게시 할 수있는 옵션이 없었습니다. SO의 환대가 그것을 학대하는 주장이되어서는 안됩니다.
Val

Windows 10에서 이것을보고 있습니다 .PATH 로의 변수 대체가 간헐적 으로 작동 하지 않았습니다 . 환경 변수로 이동하여 변경없이 저장 한 다음 새 CMD 프롬프트를 열어 문제를 해결했습니다.
Thomas W

답변:


37

경로는 시스템 경로와 사용자 경로의 연결입니다. 또한 시스템 환경 변수에는 사용자 환경 변수에 대한 참조가 포함 되지 않을 수 있으며 이러한 참조는 확장 되지 않습니다 . 원하는 결과를 얻으려면 사용자 환경 변수 PATH 에 % JAVA_HOME %에 대한 참조를 삽입 하거나 해당 변수가없는 경우 작성하십시오.

아마도 간단한 예가 이것을 더 명확하게 할 것입니다. SYSTEM 환경이

ProgramFiles = C:\Program Files
SystemRoot = C:\WINDOWS
PATH = %SystemRoot%\SYSTEM32

사용자 JSmith의 환경은

JAVA_HOME = %ProgramFiles%\Java\bin
USERPROFILE = C:\USERS\JSmith
PATH = %JAVA_HOME%\bin;%USERPROFILE%\bin

결과 경로는

C:\WINDOWS\SYSTEM32;C:\Program Files\Java\bin;C:\Users\JSmith\bin

바라는대로.


3
내 시스템에는 일부 시스템 환경 변수와 동일한 이름의 사용자 환경 변수가 있습니다. PATH를 에코하지 않으면 확장되지 않습니다.이를 읽은 후 우선 순위로 선택되었지만 확장 할 수없는 경우 중복 사용자 변수를 제거했습니다. 이것은 이제 나를 위해 일했습니다-많은 감사합니다. :)
Michael

확장되지 않은 원래 PATH를 얻는 방법이 Powershell을 통해 있습니까? 확장되지 않은 환경 변수를 유지하면서 PATH를 추가하려고했습니다.
CMCDragonkai

다른 질문의 도움으로 해결했습니다. 이 처리 할 수있는 PowerShell 스크립트 작성 gist.github.com/CMCDragonkai/a02d77c2d7c0799dd42fd2aab26a3cd5
CMCDragonkai

16

이 키에서 Windows 레지스트리를 체크인하십시오.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Environment

환경 변수를 확장해야하는 경우 (여기 : % JAVA_HOME %)

변수 REG_EXPAND_SZ 값 으로 설정 해야합니다 .

명령 줄을 통해 reg.exe를 사용하여 레지스트리 값을 추가 / 편집하는 경우 기본값은 REG_SZ입니다. reg add /t REG_EXPAND_SZ옵션 을 사용하여 REG_EXPAND_SZ 유형을 지정하십시오 .


그래 ... 이것은 내가 항상 잊어 버린 것 중 하나입니다 ... 성가신 레지스트리 ;-)
Eddie B

9

변수가 공백이 포함 된 경로로 확장 될 때 PATH 변수 내에서 환경 변수를 확장 할 때 명확한 문제가 있습니다.

"OUR_ROOT = c : \ MyRoot"와 같은 자체 시스템 수준 변수를 만든 다음 "PATH =; % OUR_ROOT % \ bin;"과 같은 시스템 PATH에서 사용했습니다. "PATH =; c : \ MyRoot \ bin;"으로 올바르게 확장됩니다. 지금까지 아무런 문제가 없습니다.

그러나 Windows 7 (32 비트)에서는 제품을 설치하고 다음과 같은 시스템 환경 변수를 만듭니다.

STUDIO_BIN=C:\program files\Company Name\Product Name 10.4\bin

그리고 시스템 PATH 변수에 추가했습니다.

PATH=<other path elements>;%STUDIO_BIN%;<more path elements>

그러나 CMD에 표시된 PATH 값에는 "% STUDIO_BIN %;"이 포함되어 있습니다. 확장 된 경로가 아닙니다. 내 컴퓨터> 속성> 고급> 환경 변수의 값은 확장되지 않은 상태로 유지되었습니다. 즉, 해당 디렉토리에서 DLL이 필요한 프로그램을 실행할 수 없습니다.

STUDIO_BIN을 내 컴퓨터> 속성> 고급 ...> 환경 변수를 통해) 공백이없는 이름으로 변경하면됩니다.

STUDIO_BIN=C:\ProductName\bin

그런 다음 CMD 창을 다시 시작하면 PATH는 다음과 같습니다.

PATH=<other path elements>;C:\ProductName\bin;<more path elements>

또 다른 해결책은 내 컴퓨터> 속성> 고급 ...> 환경 변수 대화 상자를 사용하여 PATH에서 사용중인 시스템 변수를 충분히 편집하는 것입니다. 문자를 추가하고 제거하여 '변경'을 한 다음 확인을 시도하고 새 CMD 프롬프트를 시작했으며 PATH가 올바르게 확장되지 않았습니다. 그런 다음 경로의 일부 를 삭제하려고 했습니다.

STUDIO_BIN=C:\Program Files\Company Name

( "Product Name 10.4"생략) 그리고 다음 CMD 프롬프트는 STUDIO_BIN이 올바르게 확장 된 PATH를 표시했습니다.

이상하게도, 돌아가서 "Product Name 10.4"를 STUDIO_BIN에 추가하면 (처음으로 그와 함께 뭉치기 시작하기 전에 있던 모든 공간 포함) PATH가 제대로 확장되었습니다.

분명히 내용이 충분히 변경되면 PATH 변수는 환경 변수 대화 상자에서 추가 처리를 거쳐 작동합니다. 제품의 설치 프로그램에서 변수를 추가했을 때 수행되지 않은 처리 (아마도 레지스트리에서 PATH를 직접 수정했을 수도 있음).

나는 이것이 XP에서도 문제라고 거의 긍정적입니다. 새로운 개발 시스템을 만들면서 Windows 7에서 다시 표면화되었습니다. 분명히 Microsoft에 의해 수정되지 않았습니다.

% ProgramFiles %와 같은 MS 정의 변수조차도 PATH에서 올바르게 확장되지 않습니다.

이 페이지 는 명령 줄 또는 배치 파일을 통해 PATH를 설정하는 경우 가능한 답변을 제공합니다. (SET 다음에 전체 명령을 따옴표로 묶으십시오.) 설치 한 제품이 환경 변수를 설정하는 데 사용한 설치 프로그램을 모르지만 공백으로 경로를 올바르게 확장하는 데 필요한 처리가 무엇인지 알 수 있습니다.

요약하자면 다음 중 하나를 수행 할 수 있습니다.

  • 공백이없는 경로로 경로를 변경하고 모든 관련 파일을 이동하거나

  • 환경 변수 대화 상자에서 확장에 실패한 변수를 편집하십시오 (정확하게 처리하기에 충분하도록 변경하십시오-양이 충분하지 않습니다).


7

2009 년 3 월 Microsoft 포럼에서이 질문을했지만 해결 된 적이 없습니다.

경로 환경 변수에서 % ProgramFiles %를 사용하는 방법은 무엇입니까? :


시스템의 경로 환경 변수에 폴더를 추가하려고합니다.

% ProgramFiles % \ SysInternals 를 추가하고 싶습니다

기존 경로 변수로

C : \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl; C : \ PROGRA ~ 1 \ Borland \ Delphi5 \ Bin; % SystemRoot % \ system32; % SystemRoot % ; % SystemRoot % \ System32 \ Wbem; C : \ Program Files \ Microsoft SQL Server \ 80 \ Tools \ BINN; C : \ Program Files \ Microsoft SQL Server \ 80 \ Tools \ Binn \; C : \ Program Files \ Microsoft SQL Server \ 90 \ 도구 \ binn \; C : \ 프로그램 파일 \ Microsoft SQL Server \ 90 \ DTS \ Binn \; C : \ 프로그램 파일 \ Microsoft SQL Server \ 90 \ 도구 \ Binn \ VSShell \ Common7 \ IDE \; C : \ Program Files \ Microsoft Visual Studio 8 \ Common7 \ IDE \ PrivateAssemblies \; % SYSTEMROOT % \ System32 \ WindowsPowerShell \ v1.0 \

그래서 편집 할 곳으로갑니다.

대체 텍스트

그리고 경로에 변수를 추가합니다.

% 프로그램 파일 % \ SysInternals; C : \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl; (한조각)

그런 다음 새 명령 프롬프트 창을 열면 환경 변수가 실제 값으로 바뀌지 않습니다.

경로 = % 프로그램 파일 % \ SysInternals; C : \ PROGRA ~ 1 \ Borland \ Delphi5 \ Projects \ Bpl (snip)>

다음 스크린 샷에서 볼 수 있습니다.

대체 텍스트


그러나 귀하의 질문에 대답하기 위해 : 나는 모른다. 할 수없는 것 같습니다.


5

환경 변수에는 전역 및 사용자의 두 가지 수준이 있습니다. 사용자 환경 변수로 % Java_home %을 설정했지만 대신 전역 변수를 변경하는 경우 아무런 차이가 없습니다.


2

사용자 환경 변수를 정의 할 때 PATH에 공백이 없는지 확인하십시오. 예 : C : \ GNAT \ bin; ":"사이의 공백으로 인해 C : \ GNAT \ include가 작동하지 않습니다. 및 "C : \ GNAT \ include".


2

MSTSC를 사용하여 / console 세션에 로그온 한 상태에서 환경 변수를 추가하십시오.

머신을 재부팅하면 환경 변수가 유지됩니다.

환경 변수를 변경하려고 할 때 기기에 연결된 방법에 따라 O / S에 문제가있는 것으로 보입니다.


1

"지연된 환경 변수 확장"기능 (또는 부족)과 관련이 있거나, 항상 올바른 솔루션을 갖기 위해이 기능을 활용할 수 있습니다.

cmd 프롬프트에서

set /? 

테스트 할 작은 예제를 포함하는 "지연된 환경 변수 확장"을 설명하는 섹션을 읽으십시오.

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

에코 라인을 얻지 못하면 설명 할 수 있습니다.

그러나 / V 옵션을 사용하여 cmd.exe를 시작하면 "!"를 사용할 수 있습니다. Behaivior를 변경하는 "%"대신

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

나를 위해 (XP에서 실행 중) 첫 번째 스크립트는 작동하지 않지만 두 번째 버전은 (cmd.exe / V 사용)


1

나는 같은 문제를 겪었고 그것을 고치는 방법, 그 절름발이를 안다.

PATH를 다시 ​​편집하면되지만 변경하지 말고 PATH를 다시 ​​저장하십시오. 어떤 이유로 이로 인해 모든 중첩 환경 변수 참조가 다시 평가됩니다.

작동하지 않으면 몇 번 더 수행하면 어떻게 든 작동합니다.


1

나는 Windows가 PATH에서 변수를 확장하지 못하는 것이 아직 정의되지 않은 것을 생각하기 때문에 믿습니다. 치다:

REM Ensure variable is undefined
SET UNDEFINED=
REM And then try to expand it
ECHO UNDEFINED=%UNDEFINED%

이 가설은 저의 다른 관찰과도 일치 %ProgramFiles%\Something합니다. 사용자에게 추가 하면 변수 변경 알림 시점에 기계 환경에서 정의 된 경우 (예 : 로딩 순서-MACHINE 및 USER) 사용자에게PATH 항상 확장이 예상 %ProgramFiles%됩니다. 그러나 컴퓨터 환경을 수정하면 올바른 변수 확장이 부팅시에만 발생합니다 (지금 은 정기적으로 발생하지 않는 방법이유를 모릅니다 ).


1

로그인시 변수가 설정되는 순서를 고려해야합니다. 변수를 설정하기 전에 사용하려고하면 빈 문자열로 나타납니다.

유효 PATH는 사용자의 PATH 변수와 전역 PATH 변수의 연결입니다.

사용자 변수는 전역 변수보다 먼저 설정되므로 사용자 PATH 변수에서 전역 변수를 사용할 수 없습니다. 또한 변수는 알파벳 순서로 설정되므로 PATH 이전에 정렬 된 변수를 사용할 수 없습니다.

(이것은 Windows 7 이상에 적용됩니다. 최신 버전에서는 테스트하지 않았습니다.)


0

아마도 당신은 그것을 잘못하고 있습니까?

Windows XP Pro SP3 (32 비트)을 사용해 보았습니다. %JAVA_HOME%(및 %JAVAFX_HOME%등) 가 여러 번 발생하는 경로가 있습니다 . 커맨드 라인으로 가서 type을 입력 PATH하면 변수가 확장 된 것을 볼 수 있습니다. 좋은.

의 값을 변경합니다 JAVA_HOME. 동일한 명령 행 창으로 PATH다시 돌아가서, 경험에 따라 예상 한 것과 동일한 값 ...

새 명령 줄 창을 열고 PATH, gotcha를 입력 하면 새 값이 표시됩니다.

정확한 메커니즘이 무엇인지 확실하지 않지만 cmd.exe를 포함한 모든 실행중인 프로그램은 시작 시간에 환경 변수의 값을 캡처하고 되돌아 보지 않습니다 ... env 변경 사항을 청취하십시오.

기능이나 버그 또는 성가신 것으로 보일 수 있지만 그것이 작동하는 방식입니다. 적어도 Win9X 시간과 달리 컴퓨터를 재부팅 할 필요는 없습니다! 그리고 NT 시간 (IIRC)과 달리 로그 아웃했다가 다시 로그인 할 필요가 없습니다.

왜 불일치가 발생합니까? 마이크로 소프트의 방법은 불가피하다 ... :-P


그렇지 않습니다. 변경 후 새로운 명령 창에서 테스트하고 있습니다. 시스템 값을 변경해도 프로세스 실행 값이 변경되지 않는다는 사실을 알고 있습니다.
skiphoppy

OK, 따라서 '아마도'... :-) 그리고 내 설명은 불일치를 다루지 않지만 일부 초보자에게는 유용 할 수 있습니다 ... : -PI는 변수 확장이 경로의 모든 곳에서 작동한다는 것을 지적하고 싶었습니다. .. 일부 시스템의 경우! (내가 사용한 모든 것 ... 항상 32 비트).

0

시스템> 고급 설정> 환경 변수에서 환경 변수 설정을 해결했습니다 .

사용자 및 전역 변수 (사용자는 Windows 사용자 이름)와 시스템 변수는 전역 변수라는 두 개의 패널이 있으므로 JAVA_HOME경로를 아래에 두는 등 사용자 변수에서 '신규'를 설정하면 전역 경로에서도 변수를 설정합니다 폴더 안에 프로그램 파일이 있습니다.

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