64 비트 Windows에서 % ProgramFiles %의 차이점


8

명령 프롬프트에서 다음을 얻습니다.

>echo %ProgramFiles%
C:\Program Files

그러나 일부 응용 프로그램 (이 경우 PHP는 Apache의 httpd.conf 내에서 동일한 동작을 보았지만)은 다음과 같습니다.

>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)

왜 이런거야?

배경 : 호스트 OS가 32 비트 또는 64 비트인지에 관계없이 스크립트를 개발 중이며 구성 파일의 경우 훌륭하게 작동합니다. 32 비트 시스템에서 %ProgramFiles%"C : \ Program Files"이고 64 비트 시스템에서 동일하게 %ProgramFiles%리턴 C:\Program Files (x86)됩니다. Windows 명령 프롬프트 (또는 탐색기 표시 줄 등)에서 시도 할 때 왜 같은 것이 적용되지 않는지 궁금합니다. 64 비트 명령 프롬프트 또는 다른 것이 있습니까?


두 환경에서 모두 기본 구성 Windows로 %programfiles%돌아갑니다 C:\Program Files. x64 버전의 Windows에서는을 %programfiles(x86)반환합니다 C:\Program Files (x86). 왜 PHP가 그와 반대되는 것을 반환하는지 확실하지 않지만 setx64 Windows 및 x86 Windows의 명령 프롬프트에서 실행하여 주어진 시스템의 환경 변수가 무엇으로 설정되어 있는지 쉽게 확인할 수 있습니다 .
MDMarra

답변:


12

64 비트 Windows에서 시작된 32 비트 응용 프로그램이 시스템 환경 변수 % ProgramFiles % 또는 % commonprogramfiles %를 처리하면 WoW64 하위 시스템은이 변수의 값을 변수 % ProgramFiles (x86) % 및 "%의 값으로 바꿉니다. commonprogramfiles (x86) % 따라서, 예를 들어, 32 비트 프로그램에서 주소를 지정할 때 % ProgramFiles %는 "C : \ Program Files (x86)"로 열립니다.

이 동작은 32 비트 소프트웨어와 64 비트 운영 체제의 하위 호환성을 제공하는 레지스터 리디렉션 시스템에 의해 결정됩니다. 32 비트 환경은 주소가 지정된 데이터가 다른 위치에 있음에도 불구하고 32 비트 프로그램에 대해 에뮬레이트됩니다.

32 비트 프로그램에서 이러한 경로 재 지정을 피하려면 해당 레지스터 노드에 액세스 할 때 % programfiles % 또는 % COMMONPROGRAMFILES % (역의 경우) 환경 변수 또는 KEY_WOW64_64KEY 플래그를 사용해야합니다.


실제로 리디렉션을 피하는 대신 Windows 프롬프트에서 리디렉션하려고합니다. 예를 들어, 나는 스크립트 수 있도록하고 싶습니다 %ProgramFiles%하고 사용이 C:\Program Files32 비트 아직 사용에 대한 C:\Program Files (x86)64 비트에. 이것은 아파치와 PHP가 작동하는 방식이며 이것이 "올바른"지 여부에 대해서는 언급 할 수 없지만 멋진 동작입니다. 예를 들어 ServerRoot "${ProgramFiles}\Zend\Apache2"httpd.conf에서 설정할 수 있으며 Windows 버전에 관계없이 Zend / Apache 설치 (64 비트의 x86 폴더에 있음)를 올바르게 찾습니다.
ken

3
내 컴퓨터의 32 비트 명령 셸에서 echo %programfiles%여전히 32 비트 경로를 반환합니다. 그러나 64 비트 경로를 가리키는 ProgramW6432라는 변수가 있습니다.
Harry Johnston

이것은 나를 위해 작동하지 않습니다. 이 모든 변수들은 같은 경로를 반환합니다 : var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati

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