10


7

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

ビットネス(32ビットvs. 64ビット)VBScriptのWindows OS?

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

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

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

set fileSys=CreateObject("Scripting.FileSystemObject")

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

7 Answer


19


先日、職場でこの同じ問題に遭遇しました。 この天才的なvbscriptにつまずいて、共有できないのはいいことだと思いました。

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

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


14


`PROCESSOR_ARCHITECTURE`をクエリできます。 説明されているhttp://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx[here]では、値を追加する必要があります。 64ビットOSで実行されている場合でも、32ビットプロセスの場合、「PROCESSOR_ARCHITECTURE」の「x86」になります。 その場合、変数 `PROCESSOR_ARCHITEW6432`にはOSビットが含まれます。 詳細については、http://msdn.microsoft.com/en-us/library/aa384274%28VS.85%29.aspx [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."


4


@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つの関数は、次のように簡潔に記述できます。

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」条件を囲む括弧は不要であることに注意してください。ただし、演​​算子の優先順位に関する明確さを追加すると考えています。 また、改訂された実装で使用される単一行の構文は、 `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


4


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

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


3


Brunoの答えへの補遺:新しいCPUに古いOSをインストールできるので、プロセッサ自体ではなくOSをチェックすることをお勧めします。

strOSArch = GetObject("winmgmts:root\cimv2:[email protected]").OSArchitecture

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


2


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

この:

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

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


0


フォルダ `C:\ Windows \ sysnative`が存在するかどうかも確認できます。 このフォルダー(またはより良いエイリアス)は32ビットプロセスにのみ存在します。https://docs.microsoft.com/en-us/windows/desktop/WinProg64/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