В командной строке я получаю следующее:
>echo %ProgramFiles%
C:\Program Files
Однако некоторые приложения (в данном случае PHP, хотя я видел такое же поведение из httpd.conf Apache), это:
>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)
Почему это?
Предпосылки: я разрабатываю сценарии, которые не зависят от того, является ли ОС хоста 32-битной или 64-битной, и для файлов конфигурации это отлично работает. В 32-битной системе %ProgramFiles%
это "C: \ Program Files", а в 64-битной системе то же самое %ProgramFiles%
похоже, возвращается C:\Program Files (x86)
. Мне просто любопытно, почему то же самое не выполняется, когда я пробую это из командной строки Windows (или в панели проводника и т. Д.). Есть ли 64-битная командная строка или что-то в этом роде?
Когда 32-битное приложение, запущенное в 64-битной Windows, обращается к системным переменным окружения% ProgramFiles% или% commonprogramfiles%, подсистема WoW64 заменяет значения этих переменных на значения переменных% ProgramFiles (x86)% и "% commonprogramfiles (x86)%. Так, например,% ProgramFiles% будет открыт как "C: \ Program Files (x86)" при обращении из 32-битной программы.
Такое поведение определяется системой перенаправления регистров, которая обеспечивает обратную совместимость 32-разрядного программного обеспечения с 64-разрядными операционными системами. 32-битная среда эмулируется для 32-битных программ, даже несмотря на то, что данные, к которым они обращаются, находятся в другом месте.
Чтобы избежать такого перенаправления в 32-битной программе, вы должны использовать переменные среды% programfiles% или% COMMONPROGRAMFILES% (т.е.в обратном регистре) или флаг KEY_WOW64_64KEY при доступе к соответствующим узлам регистра.