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
8 Réponses :
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."
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 code>. 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.
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. Source: http://csi-windows.com/toolkit/csi-getosbits p> p>
+1.49 - Belle solution - mais - hélas - fonctionne sur l'heure de l'ISM (mesurée en tasses de thé).
Voici une paire de fonctions VBScript basées sur la réponse très concise de @bruno: 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> (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>
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
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).
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
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
Addendum à l'addenda: .Oarchitecture code> n'existe pas sur XP.
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 em> est définie. Ceci: p> 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. p> p>
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 code> 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 code> est supprimé, etc.
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
' 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
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.
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/...