Как я могу использовать VBScript, чтобы определить, работает ли у меня 32-битная или 64-битная ОС Windows? - PullRequest
12 голосов
/ 27 августа 2010

Как определить битовую (32-битную или 64-битную) ОС Windows в VBScript?

Я пробовал этот подход, но он не работает;Я полагаю, что (x86) вызывает некоторые проблемы, связанные с проверкой папки ..

Есть ли другая альтернатива?

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

set fileSys=CreateObject("Scripting.FileSystemObject")

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

Ответы [ 7 ]

19 голосов
/ 14 октября 2011

Столкнулся с этой же проблемой на работе на днях. Наткнулся на этот гениальный кусок vbscript и подумал, что это слишком хорошо, чтобы не делиться.

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

Источник: http://csi -windows.com / toolkit / csi-getosbits

15 голосов
/ 27 августа 2010

Вы можете запросить PROCESSOR_ARCHITECTURE. Описанный здесь , вам необходимо добавить несколько дополнительных проверок, поскольку значение PROCESSOR_ARCHITECTURE будет равно x86 для любого 32-разрядного процесса, даже если он выполняется в 64-разрядной ОС. В этом случае переменная PROCESSOR_ARCHITEW6432 будет содержать битность ОС. Более подробная информация в 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."
5 голосов
/ 20 декабря 2012

Вот пара функций VBScript, основанная на очень кратком ответе @Bruno:

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

ОБНОВЛЕНИЕ: По совету @ Ekkehard.Horner, эти две функции могутнаписать более кратко , используя однострочный синтаксис следующим образом:

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!)

ОБНОВЛЕНИЕ 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 голосов
/ 08 ноября 2015

Запросы 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 голосов
/ 04 октября 2016

Добавление к ответу Бруно: Вы можете проверить ОС, а не сам процессор, поскольку вы можете установить более старую ОС на более новый ЦП:

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

Возвращает строку «32-разрядная» или"64-бит".

2 голосов
/ 12 января 2018

Определить, является ли ЦП 32-битным или 64-битным, легко, но задается вопрос, как определить, является ли ОС 32-битной или 64-битной. Когда работает 64-разрядная версия Windows, определяется переменная среды ProgramW6432 .

Это:

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

вернет true для 32-битной ОС и false для 64-битной ОС и будет работать для всех версий Windows, включая очень старые.

0 голосов
/ 27 августа 2018

Вы также можете проверить, существует ли папка 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
...