How can I use VBScript to determine whether I am running a 32-bit or 64-bit Windows OS? How can I use VBScript to determine whether I am running a 32-bit or 64-bit Windows OS? windows windows

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

Source: http://csi-windows.com/toolkit/csi-getosbits


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