2010-08-27 14 views
9

¿Cómo puedo detectar la bitness (32 bits frente a 64 bits) del sistema operativo Windows en VBScript?¿Cómo puedo usar VBScript para determinar si estoy ejecutando un sistema operativo Windows de 32 o 64 bits?

Intenté este enfoque pero no funciona; Supongo que el (x86) está causando algún problema al verificar la carpeta ...

¿Hay alguna otra alternativa?

progFiles = "c: \ archivos de programa" & "(" & "x 86" & ")"

establecen FileSys = CreateObject ("Scripting.FileSystemObject")

Si FileSys .FolderExists (progFiles) Entonces

WScript.Echo "Folder Exists" 

final si

+0

No, creo que quiere saber si está ejecutando un sistema operativo de 32 o 64 bits. Por lo tanto, un duplicado de http://stackoverflow.com/questions/191873 – Treb

+0

posible duplicado de [Determinación de 64 bits frente a Windows de 32 bits] (http://stackoverflow.com/questions/191873/determining-64-bit- vs-32-bit-windows) – Treb

+0

@Treb: No hay respuesta de VBScript. Pensándolo bien, es probable que sea un duplicado de http://stackoverflow.com/questions/556283/how-do-i-check-if-wscript-cscript-runs-on-x64-host-os – Helen

Respuesta

13

Puede consultar el PROCESSOR_ARCHITECTURE. A describe here, debe agregar algunas comprobaciones adicionales, porque el valor de PROCESSOR_ARCHITECTURE será x86 para cualquier proceso de 32 bits, incluso si se ejecuta en un sistema operativo de 64 bits. En ese caso, la variable PROCESSOR_ARCHITEW6432 contendrá el bitness del sistema operativo. Más detalles en 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

Tengo que agregar un Nota bastante importante para esto ... Si ejecuta un shell CMD de 32 bits y ejecuta los ejecutables wscript/cscript de 64 bits dentro de ese shell, esta comprobación en su código devuelve correctamente 'x86'. SIN EMBARGO, si va a cargar DLL COM o similar dentro de su código, el host los carga como si fueran DLL de 64 bits. Pasé cuatro horas golpeando mi cabeza contra esto antes de probar el comando manualmente y funcionó, y sabía que algo no funcionaba. – henry700

19

El otro día se encontró con este mismo problema en el trabajo. Tropecé con esta genial pieza de vbscript y pensé que era demasiado bueno para no compartirlo.

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

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

+2

+1.49 - buena solución - pero - por desgracia - funciona en el tiempo de WMI (medido en tazas de té). –

4

Aquí es un par de funciones de VBScript en base a la respuesta muy concisa por @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 

ACTUALIZACIÓN: por el consejo de @ Ekkehard.Horner , estas dos funciones se pueden escribir más sucintamente using single-line syntax de la siguiente manera:

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 

(Tenga en cuenta que los paréntesis que rodean la condición GetObject(...) = 32 no son necesarios, pero creo que añaden claridad con respecto a la precedencia del operador. También tenga en cuenta que la sintaxis de una sola línea utilizado en las implementaciones revisadas evita el uso de la construcción If/Then)

ACTUALIZACIÓN 2: por la realimentación adicional de @ Ekkehard.Horner, algunos pueden encontrar que estas implementaciones más revisadas ofrecen tanto concisión como legibilidad mejorada:

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

A Poeple pagado por LOC u hora le gustará esto; todos los demás reconocerán "Función F(): Si la condición es entonces F = Verdadero Else F = Falso: Finalice la función" como adiposidad. –

+0

La versión pobre sería: "Función F(): F = Condición: Función final" - no operador ternario, sin considerar si las asignaciones están conmutadas, y 4 líneas menos. –

+0

Una expresión condicional (por ejemplo, "GetObject (...). AdressWidth = 64" evalúa un valor booleano que se puede asignar sin más preámbulos al nombre de la función (la forma en que VBScript devuelve algo de una función). –

3

Las consultas de WMIC pueden ser lentas.Utilizar las cadenas de entorno:

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

Adenda a la respuesta de Bruno: Es posible que desee comprobar el sistema operativo en lugar del propio procesador, ya que es posible instalar un sistema operativo más antiguo en una nueva CPU:

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

devoluciones cadena "32 bits" o "64 bits".

+0

Addendum a Addendum: '.OSArchitecture' no existe en XP. – amonroejj

1

Determinar si la CPU es de 32 bits o de 64 bits es fácil, pero la pregunta es cómo determinar si el sistema operativo es de 32 bits o de 64 bits. Cuando se ejecuta Windows de 64 bits, se define la variable de entorno ProgramW6432.

Este:

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

volverá cierto para un sistema operativo de 32 bits y falso para un sistema operativo de 64 bits y funcionará para todas las versiones de Windows, incluyendo los muy viejos.

Cuestiones relacionadas