12
votes

Comment utiliser VBScript pour déterminer si je passe un système d'exploitation Windows 32 bits ou 64 bits?

Comment puis-je détecter la bitness (32 bits vs. 64 bits) du système d'exploitation Windows dans VBScript?

J'ai essayé cette approche, mais cela ne fonctionne pas; Je suppose que le (x86) provoque un problème qui vérifie le dossier. P>

existe une autre alternative? P>

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

set fileSys=CreateObject("Scripting.FileSystemObject")

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


3 commentaires

Non, je pense qu'il veut savoir s'il est en cours d'exécution sur un système d'exploitation 32 ou 64 bits. Par conséquent, un duplicata de Stackoverflow.com/questions/191873


Dupliqué possible de Détermination des fenêtres de 64 bits contre 32 bits


@TREB: Il n'y a pas de réponse VBScript. À la deuxième pensée, c'est probablement un duplicata de Stackoverflow.com/Questtions/556283/...


8 Réponses :


16
votes

Vous pouvez interroger le processor_architecture code>. A décrit ici a>, vous devez ajouter des contrôles supplémentaires, car la valeur de processor_architecture code> sera x86 code> pour tout processus 32 bits, même s'il s'exécute sur un 64 bits OS. Dans ce cas, la variable processor_architew6432 code> contiendra l'anchement du système d'exploitation. Plus de détails dans 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."


1 commentaires

Je dois ajouter une note assez importante à cela ... Si vous exécutez une coque CMD 32 bits et que vous exécutez les exécutables Wscript / Cscript 64 bits à l'intérieur de cette coque, cette vérification de votre code renvoie correctement x86 . Toutefois, si vous allez charger des dlls com ou similaires dans votre code, l'hôte les charge comme s'il s'agissait de DLL 64 bits. J'ai passé quatre heures à me frapper la tête avant d'avoir testé la commande manuellement et cela a fonctionné, et je savais que quelque chose était éteint.



21
votes

est venu contre ce même problème au travail l'autre jour. Trébuché sur ce morceau de Genius de VBScript et pensait qu'il était trop bon de ne pas partager. xxx

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


1 commentaires

+1.49 - Belle solution - mais - hélas - fonctionne sur l'heure de l'ISM (mesurée en tasses de thé).



6
votes

Voici une paire de fonctions VBScript basées sur la réponse très concise de @bruno: xxx pré>

mise à jour: strong> par le conseil de @ ekkehard.horner, ces Deux fonctions peuvent être écrites plus succinctement Utilisation de la syntaxe à une seule ligne comme suit: p> xxx pré>

(Notez que les parenthèses qui entourent le getObject (...) = 32 code> ne sont pas nécessaires, mais je crois qu'ils Ajout de la clarté concernant la priorité de l'opérateur. Notez également que la syntaxe d'une ligne utilisée dans les implémentations révisées évite l'utilisation du si / alors code> construction!) p>

Mise à jour 2: strong> selon les commentaires supplémentaires de @ ekkehard.horner, certains peuvent constater que ces nouvelles implémentations révisées offrent à la fois la concision et la lisibilité améliorée: P>

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


5 commentaires

Les personnes payées par localité ou heure aimeront ceci; Tous les autres reconnaîtront "Fonction F (): Si condition alors f = true sinon f = FAUX: FONCTION FINALE" À titre d'adiposité.


La version maigre serait la suivante: "Fonction F (): F = Condition: Fonction d'extrémité" - Pas d'opérateur ternaire, sans réfléchir si les missions sont commutées et 4 lignes de moins.


Une expression conditionnelle (par exemple "getObject (...). Adresswidth = 64" Évalue à une valeur booléenne pouvant être attribuée sans plus tarder sur le nom de la fonction (mode de retour de VBScript de quelque chose d'une fonction).


Laissez-nous Continuez cette discussion en chat


+1 pour la version maigre (qui est tout aussi maigre si vous utilisez 3 lignes; le point est l'affectation directe de l'expression conditionnelle (résultat de la fonction) au nom de la fonction).



5
votes

Les requêtes WMIC peuvent être lentes. Utilisez les chaînes d'environnement:

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


0 commentaires

3
votes

Addendadum à la réponse de Bruno: Vous voudrez peut-être vérifier le système d'exploitation plutôt que le processeur lui-même, puisque vous pouvez installer un système d'exploitation plus ancien sur une CPU plus récente:

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


1 commentaires

Addendum à l'addenda: .Oarchitecture n'existe pas sur XP.



4
votes

Déterminer si la CPU est 32 bits ou 64 bits est facile, mais la question posée est de savoir comment déterminer si le système d'exploitation est 32 bits ou 64 bits. Lorsqu'une Windows 64 bits est en cours d'exécution, la variable programmew6432 est définie.

Ceci: xxx

retourne true pour un système d'exploitation 32 bits et false pour un système d'exploitation 64 bits et fonctionnera pour toutes les versions de Windows, y compris les très anciennes.


4 commentaires

Donc, si vous exécutez VBS par lui-même, il utiliserait un script 32 bits par défaut, vous devez donc utiliser C: \ Windows \ SYSWOW64 \ cscript pour exécuter cela, puis il renvoie 64 bits


Vous apportez un bon point. Honnêtement, j'ai utilisé cette technique et cela a bien fonctionné sur Windows 2000, XP 32 bits, Windows 7, 8 et 10, mais je ne l'ai pas testé sur tous les OSES. Donc ... c'est une solution simple qui peut ne pas fonctionner sur toutes les versions de Windows comme Server 2003.


J'ai trouvé une solution simple vient de regarder C: \ windows \ sswow64 \ cacript existe si elle ne fait pas 32 bits


@Seanclt: % windir% \ sswow64 \ cscript existe ... Sauf lorsque vous exécutez une version dépouillée de X64 Windows dans laquelle le système WOW64 n'est pas présent: comme Windows PE, Server Core quand Wow64-support est supprimé, etc.



1
votes

Vous pouvez également vérifier si le dossier c: \ windows \ sysnative code> existe. Ce dossier (ou meilleur alias) n'existe que dans un processus 32 bits, voir Redirecteur de système de fichiers

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


0 commentaires

0
votes
' performance should be good enough
' Example usage for console:
' CSript //NoLogo *ScriptName*.vbs
' If ErrorLevel 1 Echo.Win32
' VBScript:
On Error Resume Next
Const TargetWidth = 32
Set WMI = GetObject("winMgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set Query = WMI.ExecQuery("SELECT AddressWidth FROM Win32_Processor")
For Each Item in Query
  If Item.AddressWidth = TargetWidth Then
    WScript.Quit 1
  End If
Next
WScript.Quit 0

1 commentaires

Tandis que cet extrait de code peut être la solution, y compris un L'explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.