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

Posted

技术标签:

【中文标题】如何获取程序文件 x86 环境变量?【英文标题】:how to get program files x86 env variable? 【发布时间】:2012-03-24 13:02:24 【问题描述】:

我想知道如何在命令提示符中显示程序文件 (x86) 的位置。我使用的是 Windows 7 64 位。

我试过了:

echo %programfiles(x86)%echo %programfiles%

这两个输出C:\Program Files

当我手动检查注册表时,HKLM/Software/microsoft/windows/currentversionprogramfilesdir 指向 C:\Program Files

HKLM/Software/WOW64/Microsoft/windows/currentversion,programfilesdir 指向 C:\Program Files (x86)

但是,为什么我总是看到 C:\Program Files 显示?

【问题讨论】:

我认为真正的问题是,为什么在 windows 7 和 windows xp 上没有一个始终指向 x86 的 %programfiles% 版本来简化安装在两者上的运行程序?例如,在 XP 上安装适用于 Windows (x86) 的调试工具后,它会在 Program Files 中找到,但在 Windows 7 上,它会在 Program Files (x86) 上找到,这意味着没有简单方法来创建命令文件可以分布在所有计算机上,因为没有一个内置环境变量始终指向 Program Files 的 32 位位置。 [阅读所有答案后发布] 恕我直言,此讨论中缺少的一点是,无论您使用什么变量,都保证始终指向适当的文件夹。在 Windows 安装在 C:\ 以外的驱动器上的极少数情况下,这一点变得至关重要。 【参考方案1】:

在 64 位 Windows 系统上,各种环境变量和一些 Windows 注册表项的读取是 redirected 到不同的来源,这取决于执行读取的进程是 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 位进程的这些环境变量。你可以下载它here. 包含 VisualStudio 2017 的源代码,编译后的 64 位和 32 位二进制可执行文件分别位于目录..\x64\Release..\x86\Release

【讨论】:

【参考方案2】:

恕我直言,本次讨论中缺少的一点是,无论您使用什么变量,都保证始终指向适当的文件夹。 在 Windows 安装在 C:\

以外的驱动器上的极少数情况下,这一点变得至关重要

【讨论】:

这是一个很好的说明。但由于它没有直接回答问题,最好将其写为对问题本身的评论。【参考方案3】:

在以 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)%

【讨论】:

什么 %programfiles(x86)% 将在 32 位机器上以 32 位模式返回? 在 windows XP (x86) 上不工作,你需要放 %programfiles%。我认为唯一的方法是先通过代码检查操作系统版本,然后使用一个变量或其他变量。 可能值得将 %ProgramW6432% 添加到上面的列表中。 同样适用于 32 位版本的 Windows 7 - 没有 %programfiles(x86)% 环境变量 我第二个@Alex Wiese,%ProgramW6432% 将始终拥有 64 位程序文件目录。 %ProgramFiles(x86)% 将始终具有 32 位程序文件目录。这两个变量是稳定的......其他变量可能会根据 64 位操作系统(或命令提示符)运行的模式而改变。【参考方案4】:

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

%ProgramW6432%

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

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

来自Wikipedia:

%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 位重定向)。

参考:http://en.wikipedia.org/wiki/Environment_variable

【讨论】:

更好的参考:MSDN: WOW64 Implementation Details - “从 Windows 7 和 Windows Server 2008 R2 开始,添加了 ProgramW6432 和 CommonProgramW6432 环境变量。”***直接反驳了这一点;有趣的是,根据 MSDN,Wikipedia 仅列出了 支持此变量的三个版本。不幸的是,我没有要测试的 64 位 XP/Vista。 在第二次阅读时,我发现 Windows 7/2008 R2 要求仅适用于 64 位进程。该变量仅针对 Vista x64 上的 32 位进程定义。【参考方案5】:

在 Windows 64 位机器上, echo %programfiles(x86)% 会打印 C:\Program Files (x86)

【讨论】:

以上是关于如何获取程序文件 x86 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置python的环境变量?

如何在 x64 机器上从 nmake 访问 ProgramFiles 环境变量?

eclipse下如何配置环境变量?

如何在windows的命令行环境下编译C++程序?

如何在 csproj 文件中获取环境变量?

在Postman中如何获取环境变量?