获取包含32位程序的“程序文件”文件夹的路径
如何确定包含使用VBA的32位程序的文件夹的完整路径?它在32位Windows系统上称为“程序文件”,但在64位系统上称为“Program Files(x86)”。获取包含32位程序的“程序文件”文件夹的路径
ENVIRON将这样的伎俩:
debug.print Environ("ProgramFiles")
debug.print Environ("PROGRAMFILES(X86)")
'If you want to check if current PC is x64
debug.print Environ("PROCESSOR_IDENTIFIER")
环境变量列表可以发现here。
UPDATE:基于谈话我已经受够了基督教,并根据我的意见,我看着这个多一点。
我有我上测试了两种机器:
- 机1:Win 7的极限,64位,Office 2010的64位
- 机2:Win 7的极限,32位,办公2007年32位
我跑在即时窗口下面的语句:
? Environ("ProgramFiles")
? Environ("PROGRAMFILES(X86)")
? Environ("ProgramW6432")
个
结果
机1:
C:\Program Files
C:\Program Files (x86)
C:\Program Files
机2:
C:\Program Files
//Blank//
//Blank//
因此,基于这些有限的研究结果,您可能希望看到的,如果ProgramW6432有一个值。如果不是,则假定32位并使用ProgramFiles。
IF Environ("ProgramW6432") <> "" THEN
'I'm 64 bit so check both ProgramW6432 and PROGRAMFILES(X86)
ELSE
'I'm 32 bit so check ProgramFiles
END IF
相反,您可以使用PROCESSOR_IDENTIFIER来确定x64与x86并执行相同的操作。
我不会说任何一种方法都是万无一失的,但应该让你走上正轨。
伟大的解决方案;快速的问题,如果我们在32位机器上运行,会发生什么,Environ(“PROGRAMFILES(X86)”)只是返回空白?对不起,我没有一个人。 – James 2012-01-02 15:30:26
我还没有一个方便,但environ(“HELLO_WORLD”)返回一个空字符串,所以我会想象你会得到相同的结果,如果该变量只用于64位机器。虚拟PC(和其他操作系统模拟器)是免费的。如果你有一个x86操作系统躺着,把灰尘吹掉,在虚拟环境中安装,看看会发生什么。 :) – ray 2012-01-02 17:33:24
另外,我刚刚看到Christian的回答,我应该注意到,在我的机器上,我得到了var“ProgramFiles”与“PROGRAMFILES(X86)”的不同文件夹。您可能最好使用他的建议获取x64文件夹;并且在这里推测,如果“PROGRAMFILES(X86)”和“ProgramW6432”都返回空白值,那么“ProgramFiles”将适用。 – ray 2012-01-02 17:36:44
下面是文章向您展示如何从注册表中读取信息:
在这篇文章的评论也暗示如何从环境变量中的信息“PROGRAMFILES” 。但要小心,如果你有不同的分区,可能会有多个“Program Files”文件夹,例如"C:\Program Files"
和"D:\Program Files"
。
ray023's answer基本上是正确的,但一个加法:
至少在我的机器上(Win 7的家庭高级版64位,Access 2000中安装),都Environ("ProgramFiles")
和Environ("PROGRAMFILES(X86)")
...返回相同的文件夹,C:\Program Files (x86)
。
要在我的64位Windows上获得“非x86文件夹”(C:\Program Files
),我需要使用Environ("ProgramW6432")
。
Here's another link关于Environ
函数,包括代码如何列出所有环境变量(这就是我如何找到ProgramW6432
)。
编辑:
正如我已经评论说,我只是测试它在我的另一台机器上的结果似乎不仅依赖于操作系统,但在安装微软Office版本还有:
本机运行在Win XP SP3 32位,和Access 2000安装:
Environ("ProgramFiles")
回报C:\Programme
。
(这是“程序文件”的德文 - 我在德国和我的Windows是德语)
Environ("PROGRAMFILES(X86)")
和Environ("ProgramW6432")
返回一个空字符串。
- >因此,确定“x86文件夹”(无论是在Win XP还是Win 7上)最安全的方式似乎是Environ("ProgramFiles")
。
我无法证实这一点;我得到了预期的结果?我使用的是64位版本的办公软件,我可以确认您是否正确,因为我怀疑您不是?尽管感谢帮助。 – James 2012-01-02 16:37:33
不,我使用的是32位版本(Access 2000,具体 - 这是安装在此机器上的MS Office的唯一部分)。 – 2012-01-02 16:48:44
@ChristianSpecht这是有趣的B/C我有64位的单词,我使用ProgramFiles与PROGRAMFILES(X86)获得不同的文件夹。我不知道这个命令在使用时是否起作用;而不是我想花时间去测试它,但可能是詹姆斯的一些事情。 :P – ray 2012-01-02 17:44:15
我想我会总结这次讨论的结论。
的Environ
对于任何给定“程序文件”相关的环境变量将取决于视窗(32或64位),以及办公室(32或64位)而变化如下输出:
Windows Office ProgramFiles PROGRAMFILES(X86) ProgramW6432
------- ------ ---------------------- --------------------- ----------------
32-bit 32-bit C:\Program Files [empty string] [empty string]
64-bit 32-bit C:\Program Files (x86) C:\Program Files (x86) C:\Program Files
64-bit 64-bit C:\Program Files C:\Program Files (x86) C:\Program Files
请注意,对于Windows 64位+ Office 32位设置,Environ("ProgramFiles")
的输出确实是而不是与Windows中的ProgramFiles
环境变量的实际值匹配!在命令提示符处,echo %ProgramFiles%
返回C:\Program Files
,而不是C:\Program Files (x86)
。
如果需要(64位Windows C:\Program Files
32位Windows和C:\Program Files (x86)
)的路径,32位程序文件的文件夹,那么你可以使用这个功能:
Function Get32BitProgramFilesPath() As String
If Environ("ProgramW6432") = "" Then
'32 bit Windows
Get32BitProgramFilesPath = Environ("ProgramFiles")
Else
'64 bit Windows
Get32BitProgramFilesPath = Environ("ProgramFiles(x86)")
End If
End Function
您切换32和64位 – rene 2012-01-02 14:31:27
在特定的操作系统上? – rene 2012-01-02 14:33:26
@rene:这取决于他的意思。在32位的Win XP上,只有一个“Program Files”文件夹。 “程序文件(x86)”通常只在64位窗口下可用。 – 2012-01-02 14:40:11