如何得到程序文件 x86环境变量?

我想知道如何在命令提示符中显示 Program Files (x86)的位置。我用的是 Windows 764位。

我试过了:

echo %programfiles(x86)%echo %programfiles%

这两个输出 C:\Program Files

当我手动检查注册表时,
软件/微软/视窗/当前版本
programfilesdir指向 C:\Program Files

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

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

281185 次浏览

在 Windows64位机器上,echo% Programfiles (x86)% 确实打印 C: Program Files (x86)

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

On a 32-bit machine running in 32-bit mode:

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

另一个相关环境变量是:

% 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” 视窗(XP,2003,Vista)的版本,还有 % ProgramFiles (x86)% ,默认为“ C: Program Files (x86)”,并且 % ProgramW6432% ,默认为“ C: Program Files” % ProgramFiles% 本身取决于请求 环境变量本身是32位或64位(这是由 Windows 64位重定向)。

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

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

On a 64-bit Windows system, the reading of the various environment variables and some Windows Registry keys is 一个 href = “ https://Learn.microsoft.com/en-us/windows/win32/winproc64/Registry-reDirector”rel = “ nofollow norefrer”> redirect to different sources, depending whether the process doing the reading is 32-bit or 64-bit.

下表列出了这些数据来源:

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)%环境变量的数据源是 Registry 值 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 注册表值中的是什么,都会在登录时通过文件资源管理器读入到相应的 Environment Variables 中,然后复制到随后生成的任何子进程中。

注册表值 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesPath特别值得注意,因为大多数 Windows 安装都将字符串 %ProgramFiles%放入其中,由64位进程读取。这个字符串指的是环境变量 %ProgramFiles%,它从注册表值 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramW6432Dir获取数据... ... 除非某个程序先验地改变了这个环境变量的值。

我编写了一个小实用程序,用于显示64位和32位进程的这些环境变量。你可以下载 here
其中包含 VisualStudio2017的源代码,已编译的64位和32位二进制可执行文件分别位于 ..\x64\Release..\x86\Release目录中。