web-dev-qa-db-ja.com

VBScriptを使用して、32ビットまたは64ビットのWindows OSを実行しているかどうかを確認するにはどうすればよいですか?

VBScriptでWindowsOSのビット数(32ビットと64ビット)を検出するにはどうすればよいですか?

私はこのアプローチを試しましたが、うまくいきません。 (x86)がフォルダのチェックに問題を引き起こしていると思います。

他に選択肢はありますか?

progFiles="c:\program files" & "(" & "x86" & ")"

set fileSys=CreateObject("Scripting.FileSystemObject")

If fileSys.FolderExists(progFiles) Then    
   WScript.Echo "Folder Exists"    
End If
12
Santhosh

PROCESSOR_ARCHITECTUREを照会できます。説明 ここ 、64で実行されている場合でも、32ビットプロセスのPROCESSOR_ARCHITECTUREの値はx86になるため、いくつかのチェックを追加する必要があります。 -ビットOS。その場合、変数PROCESSOR_ARCHITEW6432にはOSのビット数が含まれます。詳細については、 [〜#〜] msdn [〜#〜] を参照してください。

Dim WshShell
Dim WshProcEnv
Dim system_architecture
Dim process_architecture

Set WshShell =  CreateObject("WScript.Shell")
Set WshProcEnv = WshShell.Environment("Process")

process_architecture= WshProcEnv("PROCESSOR_ARCHITECTURE") 

If process_architecture = "x86" Then    
    system_architecture= WshProcEnv("PROCESSOR_ARCHITEW6432")

    If system_architecture = ""  Then    
        system_architecture = "x86"
    End if    
Else    
    system_architecture = process_architecture    
End If

WScript.Echo "Running as a " & process_architecture & " process on a " _ 
    & system_architecture & " system."
15
Dirk Vollmar

先日、職場でこの同じ問題に直面しました。この天才的なvbscriptに出くわし、共有しないのは良すぎると思いました。

Bits = GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth

ソース: http://csi-windows.com/toolkit/csi-getosbits

19
Bruno

これは、@ Brunoによる非常に簡潔な回答に基づいたVBScript関数のペアです。

_Function Is32BitOS()
    If GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth _
       = 32 Then
        Is32BitOS = True
    Else
        Is32BitOS = False
    End If
End Function

Function Is64BitOS()
    If GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth _
       = 64 Then
        Is64BitOS = True
    Else
        Is64BitOS = False
    End If
End Function
_

UPDATE:@ Ekkehard.Hornerからのアドバイスによると、これら2つの関数はより簡潔に記述できます 1行の構文を使用 as次のとおりです。

_Function Is32BitOS() : Is32BitOS = (GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth = 32) : End Function

Function Is64BitOS() : Is64BitOS = (GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth = 64) : End Function
_

GetObject(...) = 32条件を囲む括弧は必要ありませんが、演算子の優先順位に関する明確さを追加すると思います。また、改訂された実装で使用される1行の構文にも注意してください。 _If/Then_構文の使用を回避します!)

UPDATE 2:@ Ekkehard.Hornerからの追加のフィードバックによると、これらのさらに改訂された実装が簡潔さと読みやすさの向上の両方を提供することに気付く人もいるかもしれません。

_Function Is32BitOS()
    Const Path = "winmgmts:root\cimv2:Win32_Processor='cpu0'"
    Is32BitOS = (GetObject(Path).AddressWidth = 32)
End Function

Function Is64BitOS()
    Const Path = "winmgmts:root\cimv2:Win32_Processor='cpu0'"
    Is64BitOS = (GetObject(Path).AddressWidth = 64)
End Function
_
5
DavidRR

WMICクエリは遅い場合があります。環境文字列を使用します。

Function GetOsBits()
   Set Shell = CreateObject("WScript.Shell")
   If Shell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") = "AMD64" Then
      GetOsBits = 64
   Else
      GetOsBits = 32
   End If
End Function
4
Burak Kalkan

ブルーノの回答の補遺:古いOSを新しいCPUにインストールできるため、プロセッサ自体ではなくOSを確認することをお勧めします。

strOSArch = GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").OSArchitecture

文字列「32ビット」または「64ビット」を返します。

3
amonroejj

CPUが32ビットか64ビットかを判断するのは簡単ですが、質問されるのは、OSが32ビットか64ビットかを判断する方法です。 64ビットWindowsが実行されている場合、ProgramW6432環境変数が定義されます。

この:

CreateObject("WScript.Shell").Environment("PROCESS")("ProgramW6432") = ""

32ビットOSの場合はtrueを返し、64ビットOSの場合はfalseを返し、非常に古いバージョンを含むすべてのバージョンのWindowsで機能します。

2

フォルダC:\Windows\sysnativeが存在するかどうかを確認することもできます。このフォルダ(またはより適切なエイリアス)は32ビットプロセスにのみ存在します。 ファイルシステムリダイレクタ を参照してください。

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

注:このスクリプトは、現在のプロセスが32ビットモードと64ビットモードのどちらで実行されているかを示します。Windowsのアーキテクチャは示していません。

0