从命令提示符中,我得到以下内容:
>echo %ProgramFiles%
C:\Program Files
但是,在某些应用程序(本例中是 PHP,尽管我在 Apache 的 httpd.conf 中看到了相同的行为)中,它是:
>php -r "echo $_ENV['ProgramFiles'];"
C:\Program Files (x86)
为什么是这样?
背景:我正在开发与主机操作系统是 32 位还是 64 位无关的脚本,对于配置文件来说,这非常有效。在 32 位系统上,%ProgramFiles%
是“C:\Program Files”,而在 64 位系统上,%ProgramFiles%
似乎返回相同C:\Program Files (x86)
的结果。我只是好奇为什么当我从 Windows 命令提示符(或在资源管理器栏等中)尝试时,结果不成立。是否有 64 位命令提示符之类的东西?
答案1
当在 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 标志。