VBScript 中是否有一个函数可以告诉您脚本解释器(CScript / WScript)是作为 32 位还是 64 位进程运行的?
我从其他答案中看到,在 .NET 中您可以使用 .Environment.Is64BitProcess ,它的功能与 tin 上所说的完全一致。
编辑:我现在很满意没有简单的方法可以做到这一点。幸运的是,我从脚本中使用了我用 C++ 编写的 COM 对象;所以我可以简单地添加一个功能。这就是我现在要做的。但如果可能的话,我宁愿使用更原生的解决方案。
一开始我以为你可以看看PROCESSOR_ARCHITECTURE
环境变量:
Set objShell = WScript.CreateObject("WScript.Shell")
Set colSystemEnvVars = objShell.Environment("System")
WSCript.Echo "System = " & colSystemEnvVars("PROCESSOR_ARCHITECTURE")
在 64 位操作系统(即 CMD.EXE 从 SysWow64 启动)上的 32 位命令提示符上,它返回 x86 而不是 AMD64。但是,从 64 位 CMD.EXE 开始的 32 位 CSCRIPT 中,它似乎仍然返回 AMD64。
因此,唯一的另一种方法(在我看来这有点像 hack - 主要是因为假设路径中的东西总是看起来很糟糕,但这可能是静态的足以可靠)是将其与查看 CSCRIPT 的启动位置相结合:
WScript.Echo WScript.FullName
...如果WScript.FullName
包含 SysWOW64,那么它是 64 位机器上的 32 位 cscript(很可能)。如果它包含 System32,那么您可以回退到 PROCESSOR_ARCHITECTURE 环境变量。
附录
我最近有一台运行 Windows 7 64 位的新机器,这提供了更多可能性(最初的答案是基于 64 位 Server 2008 机器)。现在有一个新的环境变量PROCESSOR_ARCHITEW6432
。快速实验表明:
PROCESSOR_ARCHITECTURE=AMD64
并且PROCESSOR_ARCHITEW6432
未设置PROCESSOR_ARCHITECTURE=x86
和PROCESSOR_ARCHITEW6432=AMD64
如果您在“进程”(而不是“系统”)组中询问“PROCESSOR_ARCHITECTURE”:
Set objShell = WScript.CreateObject("WScript.Shell")
Set colSystemEnvVars = objShell.Environment("Process")
WSCript.Echo "System = " & colSystemEnvVars("PROCESSOR_ARCHITECTURE")
WScript.Echo WScript.FullName
你得到(32位外壳)
System = x86
Host = C:\Windows\SysWOW64\CScript.exe
或(64 位外壳)
System = AMD64
Host = C:\Windows\System32\CScript.exe
最后我写了这个(连同一些 COM 样板):
unsigned Environment::GetProcessBits()
{
return sizeof(std::ptrdiff_t) /*size in bytes*/ * 8U;
}
我喜欢它,因为它避免了预处理器,constexpr
如果 msvc2012 支持它,我什至可以使用它。