1

VBScript 中是否有一个函数可以告诉您脚本解释器(CScript / WScript)是作为 32 位还是 64 位进程运行的?

我从其他答案中看到,在 .NET 中您可以使用 .Environment.Is64BitProcess ,它的功能与 tin 上所说的完全一致

编辑:我现在很满意没有简单的方法可以做到这一点。幸运的是,我从脚本中使用了我用 C++ 编写的 COM 对象;所以我可以简单地添加一个功能。这就是我现在要做的。但如果可能的话,我宁愿使用更原生的解决方案。

4

3 回答 3

4

一开始我以为你可以看看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。快速实验表明:

  • 64 位 cmd.exe:PROCESSOR_ARCHITECTURE=AMD64并且PROCESSOR_ARCHITEW6432未设置
  • 32 位 cmd.exe:PROCESSOR_ARCHITECTURE=x86PROCESSOR_ARCHITEW6432=AMD64
于 2013-08-19T08:02:49.320 回答
2

如果您在“进程”(而不是“系统”)组中询问“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
于 2016-06-13T18:56:14.427 回答
1

最后我写了这个(连同一些 COM 样板):

unsigned Environment::GetProcessBits()
    {
        return sizeof(std::ptrdiff_t) /*size in bytes*/ * 8U;
    }

我喜欢它,因为它避免了预处理器,constexpr如果 msvc2012 支持它,我什至可以使用它。

于 2013-08-19T09:56:32.817 回答