如何获取程序文件 x86 的环境变量?

126
我想知道如何在命令提示符中显示Program Files (x86)的位置。我正在使用Windows 7 64位操作系统。 我尝试了“echo %programfiles(x86)%”和“echo %programfiles%”命令,但两者都输出“C:\Program Files”。当我手动检查注册表HKEY_LOCAL_MACHINE/Software/microsoft/windows/currentversion时,programfilesdir指向“C:\Program Files”,而在HKEY_LOCAL_MACHINE/Software/WOW64/Microsoft/windows/currentversion下, programfilesdir 指向“C:\Program Files (x86)” 。但是,为什么我总是看到“C:\Program Files”被显示呢?

11
我认为真正的问题是,为什么在Windows 7和Windows XP上没有一个始终指向x86的%programfiles%版本,以简化运行安装在两者上的程序?例如,在XP上安装了Windows调试工具(x86)后,它在Program Files中找到,但在Windows 7中则在Program Files(x86)中找到,这意味着没有简单的方法来创建可在所有计算机上分发的命令文件,因为没有内置环境变量始终指向Program Files的32位位置。 - dj69
我认为在这次讨论中缺少了一个重点,那就是无论使用哪个变量,都保证始终指向适当的文件夹。这在Windows安装在除C:\之外的驱动器的罕见情况下变得至关重要。 - Amir Katz
5个回答

211

在以64位模式运行的64位机器上:

  • echo %programfiles% ==> C:\Program Files
  • echo %programfiles(x86)% ==> C:\Program Files (x86)

在以32位(WOW64)模式运行的64位机器上:

  • echo %programfiles% ==> C:\Program Files (x86)
  • echo %programfiles(x86)% ==> C:\Program Files (x86)

在以32位模式运行的32位机器上:

  • echo %programfiles% ==> C:\Program Files
  • echo %programfiles(x86)% ==> %programfiles(x86)%

18
在32位模式下,32位计算机上的%programfiles(x86)%将返回什么? - Ivan Kochurkin
在Windows XP(x86)上不起作用,您需要放置%programfiles%。 我认为唯一的方法是首先通过代码检查操作系统版本,然后使用一个变量或其他变量。 - gsubiran
4
可以考虑将%ProgramW6432%添加到上述列表中。 - Alex Wiese
3
对于32位版本的Windows 7同样适用- 没有%programfiles(x86)%环境变量。 - badsamaritan
2
我赞同@Alex Wiese的观点,%ProgramW6432%始终是64位程序文件目录。%ProgramFiles(x86)%始终是32位程序文件目录。这两个变量是稳定的...其他变量可能会根据64位操作系统(或命令提示符)运行的模式而改变。 - Jason

41

另一个相关的环境变量是:

%ProgramW6432%

因此,在以32位(WOW64)模式运行的64位机器上:

  • echo %programfiles% ==> C:\Program Files (x86)
  • echo %programfiles(x86)% ==> C:\Program Files (x86)
  • echo %ProgramW6432% ==> C:\Program Files

来自维基百科:

“%ProgramFiles%”变量指的是“Program Files”目录,其中存储了Windows和其他操作系统中安装的所有程序。在英文系统中,默认路径为“C:\Program Files”。在64位版本的Windows(XP、2003、Vista)中,还有“%ProgramFiles(x86)%”,默认路径为“C:\Program Files (x86)”,以及“%ProgramW6432%”,默认路径也为“C:\Program Files”。而“%ProgramFiles%”本身取决于请求环境变量的进程是32位还是64位(这是由Windows-on-Windows 64-bit重定向引起的)。”
参考资料:http://en.wikipedia.org/wiki/Environment_variable

4
“ProgramW6432”和“CommonProgramW6432”环境变量是从Windows 7和Windows Server 2008 R2开始添加的。维基百科直接与此相矛盾;有趣的是,根据MSDN,维基百科仅列出了不支持此变量的三个版本。不幸的是,我没有64位的XP / Vista进行测试。” - Lexikos
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Lexikos

5

在一台Windows 64位计算机上,执行“echo %programfiles(x86)%”命令会输出C:\Program Files (x86)。


4
在64位Windows系统中,读取各种环境变量和一些Windows注册表键时会被重定向到不同的源,这取决于执行读取操作的进程是32位还是64位。下表列出了这些数据源:
X = HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion
Y = HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion
Z = HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList
     
READING ENVIRONMENT VARIABLES:    Source for 64-bit process               Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
                %ProgramFiles% :  X\ProgramW6432Dir                       X\ProgramFilesDir (x86)
           %ProgramFiles(x86)% :  X\ProgramFilesDir (x86)                 X\ProgramFilesDir (x86)
                %ProgramW6432% :  X\ProgramW6432Dir                       X\ProgramW6432Dir
     
          %CommonProgramFiles% :  X\CommonW6432Dir                        X\CommonFilesDir (x86)
     %CommonProgramFiles(x86)% :  X\CommonFilesDir (x86)                  X\CommonFilesDir (x86)
          %CommonProgramW6432% :  X\CommonW6432Dir                        X\CommonW6432Dir
     
                 %ProgramData% :  Z\ProgramData                           Z\ProgramData


      READING REGISTRY VALUES:    Source for 64-bit process               Source for 32-bit process
-------------------------------|----------------------------------------|--------------------------------------------------------------
             X\ProgramFilesDir :  X\ProgramFilesDir                       Y\ProgramFilesDir
       X\ProgramFilesDir (x86) :  X\ProgramFilesDir (x86)                 Y\ProgramFilesDir (x86)
            X\ProgramFilesPath :  X\ProgramFilesPath = %ProgramFiles%     Y\ProgramFilesPath = %ProgramFiles(x86)%
             X\ProgramW6432Dir :  X\ProgramW6432Dir                       Y\ProgramW6432Dir
     
              X\CommonFilesDir :  X\CommonFilesDir                        Y\CommonFilesDir
        X\CommonFilesDir (x86) :  X\CommonFilesDir (x86)                  Y\CommonFilesDir (x86)
              X\CommonW6432Dir :  X\CommonW6432Dir                        Y\CommonW6432Dir
     

例如,对于32位进程,%ProgramFiles%%ProgramFiles(x86)%环境变量的数据源是注册表值HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
然而,对于64位进程,%ProgramFiles%环境变量的数据源是注册表值HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir,而%ProgramFiles(x86)%环境变量的数据源是注册表值HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)
大多数默认的Windows安装将类似C:\Program Files (x86)的字符串放入注册表值HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)中,但这些值(以及其他值)可以被更改。
无论输入到这些Windows注册表值中的内容是什么,都将被Windows资源管理器读取到相应的环境变量中,在登录后复制到任何子进程中。
特别需要注意的是注册表值HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesPath,因为大多数Windows安装将字符串%ProgramFiles%放入其中,以供64位进程使用。这个字符串指的是环境变量%ProgramFiles%,它又从注册表值HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir中取得数据,除非某个程序在先改变了这个环境变量的值。
我编写了一个小实用程序,显示64位和32位进程的这些环境变量。你可以在这里下载它。其中包括VisualStudio 2017的源代码和编译好的64位和32位二进制可执行文件,分别在目录..\x64\Release..\x86\Release中。

在Visual Studio中,只需在注册表属性中使用[TARGETDIR],它将在安装过程中被转换为正确的路径,无论是32位上的Program Files还是64位上的Program Files (x86) - Ray Chakrit

0

在我看来,这次讨论中缺少的一点是,无论使用哪个变量,它都保证始终指向适当的文件夹。这在Windows安装在C:\以外的驱动器的罕见情况下变得至关重要。


1
这是一条好的留言。但由于它没有直接回答问题,最好将其作为对问题本身的评论来编写。 - AbstractVoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接