2010-08-27 15 views
9

Jak wykryć bitness (32-bit vs. 64-bit) systemu operacyjnego Windows w VBScript?Jak używać VBScript do określenia, czy uruchamiam 32-bitowy, czy 64-bitowy system operacyjny Windows?

Próbowałem tego podejścia, ale to nie działa; Domyślam się, że (x86) powoduje pewien problem, który sprawdza folder ..

Czy jest jakaś inna alternatywa?

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

ustawić filesys = CreateObject ("Scripting.FileSystemObject")

Jeśli filesys .FolderExists (progFiles) Następnie

WScript.Echo "Folder Exists" 

End If

+0

Nie, myślę, że chce się dowiedzieć, czy działa na 32- lub 64-bitowym systemie operacyjnym. W związku z tym duplikat http://stackoverflow.com/questions/191873 – Treb

+0

możliwy duplikat [Ustalanie 64-bitowych vs. 32-bitowych Windows] (http://stackoverflow.com/questions/191873/determining-64-bit- vs-32-bitowe-okna) – Treb

+0

@ Treb: Nie ma odpowiedzi VBScript. Po drugie, prawdopodobnie jest to duplikat http://stackoverflow.com/questions/556283/how-do-i-check-if-wscript-cscript-runs-on-x64-host-os – Helen

Odpowiedz

13

Możesz wysłać zapytanie do PROCESSOR_ARCHITECTURE. Opisany here, musisz dodać kilka dodatkowych kontroli, ponieważ wartość PROCESSOR_ARCHITECTURE będzie x86 dla dowolnego procesu 32-bitowego, nawet jeśli działa na 64-bitowym systemie operacyjnym. W takim przypadku zmienna PROCESSOR_ARCHITEW6432 będzie zawierała OS bitness. Dalsze szczegóły w 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." 
+0

. Muszę dodać dość ważna uwaga do tego ... Jeśli uruchomisz 32-bitową powłokę CMD i uruchomisz 64-bitowe pliki wykonywalne skryptu wscript/cscript w tej powłoce, to sprawdzenie w kodzie poprawnie zwróci 'x86'. JEDNAKŻE, jeśli zamierzasz załadować biblioteki DLL COM lub podobne w swoim kodzie, host ładuje je tak, jakby były 64-bitowymi plikami DLL. Spędziłem cztery godziny, waląc głową w to, zanim ręcznie przetestowałem polecenie i zadziałało, i wiedziałem, że coś jest nie tak. – henry700

19

Wczoraj wystąpił ten sam problem w pracy. Natknąłem się na ten genialny kawałek vbscript i uważałem, że nie można się nim dzielić.

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

Źródło: http://csi-windows.com/toolkit/csi-getosbits

+2

+1.49 - dobre rozwiązanie - ale - niestety - działa na czas WMI (mierzony w filiżankach herbaty). –

4

Oto parę funkcji VBScript na podstawie odpowiedzi bardzo zwięzły przez @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 

UPDATE: Za radą od @ Ekkehard.Horner , te dwie funkcje mogą być napisane bardziej zwięźle using single-line syntax w następujący sposób:

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 

(Należy pamiętać, że nawiasy otaczające warunek GetObject(...) = 32 nie są konieczne, ale uważam, że dodają one przejrzystości w odniesieniu do pierwszeństwa operatora. Należy również zauważyć, że składnia jednoliniowy stosowane w zmienionych wdrożeń unika używania If/Then konstruktu)

UPDATE 2: Per dodatkowej informacji zwrotnej od @ Ekkehard.Horner, niektórzy mogą uznać, że te dodatkowo poprawione implementacje Oferujemy zarówno zwięzłość i zwiększoną czytelność:

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 
+1

Osoby opłacane przez LOC lub godzinę to lubią; wszyscy inni rozpoznają "Funkcję F(): Jeśli Warunek Wtedy F = Prawda Inna F = Fałsz: Koniec Funkcja" jako otyłość. –

+0

Wersja uproszczona to: "Funkcja F(): F = Warunek: funkcja końcowa" - brak operatora trójskładnikowego, nie rozważanie, czy przypisania są przełączane, a 4 linie mniej. –

+0

Wyrażenie warunkowe (np. "GetObject (...) .Adres AdressWidth = 64" jest wartością boolowską, która może zostać przypisana bez dodatkowej nazwy funkcji (sposób zwracania przez VBScript czegoś z funkcji). –

3

aplikacji WMIC zapytania mogą być powolne.Użyj ciągi środowiskowe:

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

Uzupełnienie do odpowiedzi Bruna: Możesz sprawdzić OS zamiast samego procesora, ponieważ można zainstalować starszą OS na nowszy Procesor:

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

powrotów ciąg "32-bitowy" lub "64-bitowy".

+0

Dodatek do addendum: '.OSArchitecture' nie istnieje w XP. – amonroejj

1

Ustalenie, czy procesor jest 32-bitowy lub 64-bitowy, jest łatwe, ale pytanie brzmi, jak ustalić, czy system operacyjny jest 32-bitowy czy 64-bitowy. Gdy działa 64-bitowy system Windows, zdefiniowana jest zmienna środowiskowa ProgramW6432 .

to:

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

zwróci true dla 32-bitowego systemu operacyjnego i false dla 64-bitowego systemu operacyjnego i będzie działać dla wszystkich wersji systemu Windows, w tym bardzo starych.

Powiązane problemy