我正在运行可能在x64 Windows下运行的VBScript。我需要从注册表的32位部分读取注册表项。为此,我使用路径HKLM\Software\Wow6432Node\xyz
而不是HKLM\Software\xyz
。如何检查脚本是否在x64下执行?
答案 0 :(得分:4)
即使在64位版本的Windows上,您的脚本也可以在32位模式下执行。
您可以使用以下代码确定实际位模式,您可以在脚本上运行:
option explicit
function Determine64BitMode
dim Shell, Is64BitOs
set Shell = CreateObject("WScript.Shell")
on error resume next
Shell.RegRead "HKLM\Software\Microsoft\Windows\CurrentVersion\ProgramFilesDir (x86)"
Is64BitOs = Err.Number = 0
on error goto 0
if Is64BitOs then
Determine64BitMode = InStr(Shell.RegRead("HKLM\Software\Microsoft\Windows\CurrentVersion\ProgramFilesDir"), "(x86)") = 0
else
Determine64BitMode = false
end if
end function
dim ExecutingIn64BitMode
ExecutingIn64BitMode = Determine64BitMode
if ExecutingIn64BitMode then
MsgBox "64 bit"
else
MsgBox "32 bit"
end if
答案 1 :(得分:3)
我不确定您是否需要检查脚本是否在x64下执行。
尝试从HKLM\Software\Wow6432Node\xyz
读取,如果失败,请尝试从HKLM\Software\xyz
读取,如果失败,则您的注册表项不存在,请采取适当的操作。
当然,如果您的设计更复杂(例如,如果它不存在,则将值写入该注册表项),那么该建议将不起作用。
这是用于检查操作系统的VBScript。您可能还需要解释Properties available from the Win32_OperatingSystem Class
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
msg = objOperatingSystem.Caption & " " & _
objOperatingSystem.Version & " " & _
objOperatingSystem.OSArchitecture
msgbox msg
Next
请注意,对于Windows XP和2003,OSArchitecture
不可用,在这种情况下,您可能需要检查Caption
或Version
以确定您的操作系统是否为64-位。
您还可以使用this之类的内容,具体取决于您需要的复杂程度。
答案 2 :(得分:1)
您没有提到用于从注册表中读取的API。例如,如果使用WMI StdRegProv
类,则可以使用__ProviderArchitecture
标志来请求访问32位注册表配置单元,无论脚本是在32位还是64位下运行Windows脚本宿主。 MSDN中的Requesting WMI Data on a 64-bit Platform文章对此技术进行了描述。
以下是从32位注册表中读取的示例:
strComputer = "."
Const HKLM = &h80000002
''# Specify the required registry bitness
Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
oCtx.Add "__ProviderArchitecture", 32
oCtx.Add "__RequiredArchitecture", True
''# Load the 32-bit registry provider
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
Set oWMI = oLocator.ConnectServer(strComputer, "root\default",,,,,, oCtx)
Set oReg = oWMI.Get("StdRegProv")
''# Specify input parameters for the GetStringValue method call
Set oInParams = oReg.Methods_("GetStringValue").InParameters
oInParams.hDefKey = HKLM
oInParams.sSubKeyName = "Software\xyz"
oInParams.sValueName = "foobar"
''# Read a string value from the registry
Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams,, oCtx)
WScript.Echo oOutParams.sValue
另请注意,在这种情况下,32位密钥名称应以通常的方式指定为HKLM\Software\xyz
而不是HKLM\Software\Wow6432Node\xyz
。
答案 3 :(得分:1)
以下是基于Microsoft知识库文章How To Check If Computer Is Running A 32 Bit or 64 Bit Operating System的解决方案:
Function Is64BitOS()
Is64BitOS = Not(Is32BitOS())
End Function
Function Is32BitOS()
Const sRegKey = "HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0"
Const sIdentifierValue = "Identifier"
Const sPlatformIDValue = "Platform ID"
Dim oSh : Set oSh = CreateObject("WScript.Shell")
Dim sIdentifier, nPlatformID
sIdentifier = oSh.RegRead(sRegKey & "\" & sIdentifierValue)
nPlatformID = oSh.RegRead(sRegKey & "\" & sPlatformIDValue)
Set oSh = Nothing
If InStr(sIdentifier, "x86") > 0 And nPlatformID = 32 Then
Is32BitOS = True
Else
Is32BitOS = False
End if
End Function
替代解决方案
可以找到使用 WMI 的替代且更简洁的解决方案here。
答案 4 :(得分:1)
一个非常简单的解决方案是检查(虚拟)文件夹C:\Windows\sysnative
是否存在。此文件夹仅存在于32位进程中,请参见File System Redirector
Set fso = CreateObject("Scripting.FileSystemObject")
Set wshShell = CreateObject( "WScript.Shell" )
If fso.FolderExists(wshShell.ExpandEnvironmentStrings("%windir%") & "\sysnative" ) Then
WScript.Echo "You are running in 32-Bit Mode"
Else
WScript.Echo "You are running in 64-Bit Mode"
End if
注意,仅适用于Windows Server 2003和Windows XP或更高版本。
答案 5 :(得分:0)
这显示了系统和流程架构:
Option Explicit
Dim WshShell, WshEnv
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment("System")
MsgBox "System: " & WshEnv("PROCESSOR_ARCHITECTURE")
Set WshEnv = WshShell.Environment("Process")
MsgBox "Process: " & WshEnv("PROCESSOR_ARCHITECTURE")
只需检查<> "x86"
所需的那个。