5

x64 Windows で実行できる VBScript を実行しています。レジストリの 32 ビット部分からレジストリ キーを読み取る必要があります。そのために、HKLM\Software\Wow6432Node\xyzの代わりにパスを使用しますHKLM\Software\xyz。スクリプトが x64 で実行されるかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

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
于 2011-10-14T04:57:45.683 に答える
3

スクリプトが x64 で実行されているかどうかを確認する必要があるかどうかはわかりません。

からの読み取りをHKLM\Software\Wow6432Node\xyz試みます。それが失敗した場合は、からの読み取りを試みますHKLM\Software\xyz。失敗した場合は、レジストリ キーが存在しません。適切なアクションを実行してください。

もちろん、設計がより複雑な場合 (たとえば、レジ​​ストリ キーが存在しない場合に値を書き込むなど)、その提案は機能しません。

オペレーティング システムを調べるための VBScript を次に示します。おそらく、Win32_OperatingSystem クラスから利用できるプロパティの説明も必要になるでしょう。

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を使用できないことに注意してください。その場合、 または を調べてCaptionVersionOS が 64 ビットかどうかを判断する必要があります。

必要な複雑さのレベルに応じて、このようなものを使用することもできます。

于 2009-02-17T17:57:28.663 に答える
2

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を使用する代替のより簡潔なソリューションは、ここにあります。

于 2012-12-20T19:17:13.447 に答える
1

これは、システム アーキテクチャとプロセス アーキテクチャの両方を示しています。

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"

于 2015-06-04T10:34:56.100 に答える
1

レジストリから読み取るために使用する API については言及していません。たとえば、WMIStdRegProvクラスを使用する場合__ProviderArchitecture、スクリプトが 32 ビットまたは 64 ビットの Windows スクリプト ホストで実行されているかどうかに関係なく、フラグを使用して 32 ビット レジストリ ハイブへのアクセスを要求できます。この手法については、MSDN の記事「64 ビット プラットフォームでの WMI データの要求」で説明されています。

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

于 2010-07-09T16:31:41.633 に答える