如何获取程序文件 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/currentversion,programfilesdir
指向 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 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章