64位Windows上的%ProgramFiles%差异


8

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

>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位命令提示符或其他内容?


在这两种环境中,都%programfiles%将返回C:\Program Files(在Windows的默认配置下)。在Windows的x64版本上,%programfiles(x86)返回C:\Program Files (x86)。不知道为什么php返回相反的结果,但是您可以通过set在x64 Windows和x86 Windows 上从命令提示符运行轻松地验证给定系统的环境变量设置。
MDMarra 2012年

Answers:


12

当在64位Windows中启动的32位应用程序处理系统环境变量%ProgramFiles%或%commonprogramfiles%时,WoW64子系统将这些变量的值替换为变量%ProgramFiles(x86)%和“% commonprogramfiles(x86)%。因此,例如,从32位程序寻址时,%ProgramFiles%将作为“ C:\ Program Files(x86)”打开。

此行为由提供32位软件与64位操作系统的向后兼容性的寄存器重定向系统确定。即使32位环境正在寻址的数据位于不同的位置,也可以为32位程序模拟32位环境。

为避免在32位程序中进行此类重定向,在访问相应的寄存器节点时,应使用%programfiles%或%COMMONPROGRAMFILES%(即带有相反大小写)环境变量或KEY_WOW64_64KEY标志。


实际上,我试图避免在Windows提示符下实施重定向,而不是避免重定向。例如,我希望能够编写脚本%ProgramFiles%并使其C:\Program Files在32位C:\Program Files (x86)上使用,而在64位上使用。这是Apache和PHP共同工作的方式,尽管我不能评论这是否“正确”,但这是一个不错的行为。例如,我可以ServerRoot "${ProgramFiles}\Zend\Apache2"在httpd.conf中进行设置,无论Windows版本如何,它都能正确找到Zend / Apache安装(位于64位的x86文件夹中)。
2012年

3
在我的机器上,在32位命令外壳程序中,echo %programfiles%仍然返回32位路径。但是,有一个名为ProgramW6432的变量指向64位路径。
哈里·约翰斯顿

这对我不起作用。所有这些变量都返回相同的路径: var environmentVariables = new string[] { "%programfiles%", "%programfiles(x86)%", "%ProgramFiles%", "%commonprogramfiles%", "%COMMONPROGRAMFILES%" };
Saeed Neamati 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.