How can I use VBScript to determine whether I am running a 32-bit or 64-bit Windows OS?
Came up against this same problem at work the other day. Stumbled on this genius piece of vbscript and thought it was too good not to share.
Bits = GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth
You can query the PROCESSOR_ARCHITECTURE
. A described here, you have to add some extra checks, because the value of PROCESSOR_ARCHITECTURE
will be x86
for any 32-bit process, even if it is running on a 64-bit OS. In that case, the variable PROCESSOR_ARCHITEW6432
will contain the OS bitness. Further details in MSDN.
Dim WshShellDim WshProcEnvDim system_architectureDim process_architectureSet 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 IfWScript.Echo "Running as a " & process_architecture & " process on a " _ & system_architecture & " system."
Here is a pair of VBScript functions based on the very concise answer by @Bruno:
Function Is32BitOS() If GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth _ = 32 Then Is32BitOS = True Else Is32BitOS = False End IfEnd FunctionFunction Is64BitOS() If GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth _ = 64 Then Is64BitOS = True Else Is64BitOS = False End IfEnd Function
UPDATE: Per the advice from @Ekkehard.Horner, these two functions can be written more succinctly using single-line syntax as follows:
Function Is32BitOS() : Is32BitOS = (GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth = 32) : End FunctionFunction Is64BitOS() : Is64BitOS = (GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth = 64) : End Function
(Note that the parentheses that surround the GetObject(...) = 32
condition are not necessary, but I believe they add clarity regarding operator precedence. Also note that the single-line syntax used in the revised implementations avoids the use of the If/Then
construct!)
UPDATE 2: Per the additional feedback from @Ekkehard.Horner, some may find that these further revised implementations offer both conciseness and enhanced readability:
Function Is32BitOS() Const Path = "winmgmts:root\cimv2:Win32_Processor='cpu0'" Is32BitOS = (GetObject(Path).AddressWidth = 32)End FunctionFunction Is64BitOS() Const Path = "winmgmts:root\cimv2:Win32_Processor='cpu0'" Is64BitOS = (GetObject(Path).AddressWidth = 64)End Function