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
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."
先日、職場でこの同じ問題に直面しました。この天才的なvbscriptに出くわし、共有しないのは良すぎると思いました。
Bits = GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth
これは、@ 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
_
WMICクエリは遅い場合があります。環境文字列を使用します。
Function GetOsBits()
Set Shell = CreateObject("WScript.Shell")
If Shell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") = "AMD64" Then
GetOsBits = 64
Else
GetOsBits = 32
End If
End Function
ブルーノの回答の補遺:古いOSを新しいCPUにインストールできるため、プロセッサ自体ではなくOSを確認することをお勧めします。
strOSArch = GetObject("winmgmts:root\cimv2:Win32_OperatingSystem=@").OSArchitecture
文字列「32ビット」または「64ビット」を返します。
CPUが32ビットか64ビットかを判断するのは簡単ですが、質問されるのは、OSが32ビットか64ビットかを判断する方法です。 64ビットWindowsが実行されている場合、ProgramW6432環境変数が定義されます。
この:
CreateObject("WScript.Shell").Environment("PROCESS")("ProgramW6432") = ""
32ビットOSの場合はtrueを返し、64ビットOSの場合はfalseを返し、非常に古いバージョンを含むすべてのバージョンのWindowsで機能します。
フォルダ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のアーキテクチャは示していません。