VBScript是否有可用的函数告诉您脚本解释器(CScript / WScript)是以32位还是64位进程运行?
我从其他答案中看到,在.NET中你可以使用.Environment.Is64BitProcess,其中完全按照它所说的那样。
编辑:我现在感到满意的是,没有什么可以做到的。幸运的是,我从脚本中使用了我用C ++编写的COM对象;所以我可以轻而易举地添加一个功能。这就是我现在要做的事情。但如果可能的话,我宁愿使用更原生的解决方案。
答案 0 :(得分:4)
起初我以为你可以查看PROCESSOR_ARCHITECTURE
环境变量:
Set objShell = WScript.CreateObject("WScript.Shell")
Set colSystemEnvVars = objShell.Environment("System")
WSCript.Echo "System = " & colSystemEnvVars("PROCESSOR_ARCHITECTURE")
在64位操作系统上的32位命令提示符下(即从SysWow64启动的CMD.EXE),它返回x86而不是AMD64。但是,从32位CSCRIPT开始,它从64位CMD.EXE开始,它仍然返回AMD64。
所以唯一的另一种方式(在我看来这是一个黑客攻击 - 主要是因为假设路径中的东西看起来总是很糟糕,但这可能是静态的,足以让它变得可靠)是将它与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
答案 1 :(得分:1)
最后我写了这篇文章(以及一些COM样板文件):
unsigned Environment::GetProcessBits()
{
return sizeof(std::ptrdiff_t) /*size in bytes*/ * 8U;
}
我喜欢它,因为它避免了预处理器,如果msvc2012支持它,我甚至可以使用constexpr
获得资格。
答案 2 :(得分:1)
如果您在“处理”(而不是“系统”)组中要求“PROCESSOR_ARCHITECTURE”:
Set objShell = WScript.CreateObject("WScript.Shell")
Set colSystemEnvVars = objShell.Environment("Process")
WSCript.Echo "System = " & colSystemEnvVars("PROCESSOR_ARCHITECTURE")
WScript.Echo WScript.FullName
你得到(32位shell)
System = x86
Host = C:\Windows\SysWOW64\CScript.exe
或(64位shell)
System = AMD64
Host = C:\Windows\System32\CScript.exe