64 位 Windows 上的 %ProgramFiles% 差异

ken*_*ken 8 windows environment-variables

从命令提示符,我得到以下信息:

>echo %ProgramFiles%
C:\Program Files
Run Code Online (Sandbox Code Playgroud)

然而,一些应用程序(在这个例子中是 PHP,虽然我在 Apache 的 httpd.conf 中看到了相同的行为),它是:

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

为什么是这样?

背景:我正在开发与主机操作系统是 32 位还是 64 位无关的脚本,对于配置文件,这非常有效。在 32 位系统上,%ProgramFiles%是“C:\Program Files”,而在 64 位系统上,%ProgramFiles%似乎同样返回C:\Program Files (x86). 我只是好奇为什么当我从 Windows 命令提示符(或在资源管理器栏等中)尝试它时,同样的情况不成立。是否有 64 位命令提示符之类的?

jus*_*in0 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 标志。

  • 在我的机器上,在 32 位命令 shell 中,`echo %programfiles%` 仍然返回 32 位路径。但是,有一个名为 ProgramW6432 的变量指向 64 位路径。 (4认同)
  • 文档:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384274(v=vs.85).aspx (2认同)