2010-05-10 14 views
37

Je dispose d'un fichier texte qui se termine par .vbs que j'ai écrit ce qui suit dans:Comment exécuter un VBScript en mode 32 bits sur une machine 64 bits?

Set Conn = CreateObject("ADODB.Connection") 
Conn.Provider = "Microsoft.ACE.OLEDB.12.0" 
Conn.Properties("Data Source") = "C:\dummy.accdb" 
Conn.Properties("Jet OLEDB:Database Password") = "pass" 
Conn.Open 
Conn.Close 
Set Conn = Nothing 
  • Lorsque j'exécute ceci sur une machine 32 bits de Windows il fonctionne et se termine sans aucune notion (attendue) .
  • Lorsque j'exécute ceci sur une machine 64 bits de Windows, il obtient l'erreur

    fournisseur ne peut pas être trouvé. Il se peut qu'il ne soit pas correctement installé.

Mais il est installé. Je pense que la racine du problème est que le fournisseur est un fournisseur 32 bits, autant que je sache, il n'existe pas en 64 bits.

Si j'exécute VBScript via IIS sur mon ordinateur 64 bits (sous la forme d'un fichier ASP), je peux choisir de l'exécuter en mode 32 bits. Il peut ensuite trouver le fournisseur.

Comment puis-je le faire trouver le fournisseur sur Windows 64 bits? Puis-je dire à CScript (qui exécute le fichier texte .vbs) de fonctionner en mode 32 bits en quelque sorte?

+0

Veuillez noter que même en utilisant 32 bits Cscript tous les fournisseurs de bases de données ne vont pas fonctionner. Si le fournisseur est un pilote (exemple: SQLite), cela ne fonctionne pas. Vous devez installer des pilotes SQLite 64 bits sur Windows 64 bits à la place, de sorte que le fournisseur fonctionnera en 64 bits de cscript (et 32 ​​bits en cscript sur 64 bits). – jaysponsored

+0

Les pilotes ODBC ne sont pas du tout des fournisseurs OLEDB. Ceux-ci sont normalement utilisés avec ADO via le fournisseur de shim 'MSDASQL' qui est le fournisseur par défaut pour la compatibilité. Bien sûr, si vous amenez les DSN système encore plus obsolètes dans le mix, les choses deviennent risibles en raison des problèmes de visibilité du registre. – Bob77

Répondre

58

suivre http://support.microsoft.com/kb/896456

Pour démarrer une invite de commande 32 bits, procédez comme suit:

* Click Start, click Run, type %windir%\SysWoW64\cmd.exe, and then click OK. 

Ensuite, tapez

cscript vbscriptfile.vbs 
+0

Merci beaucoup, ça a marché.:) Je ne savais pas SysWoW64 contenait une invite de commande 32 bits, pourquoi est-il nommé "SysWoW64" de toute façon? – Peter

+10

WoW est l'abréviation de Windows sous Windows. C'est une couche de compatibilité qui fait en sorte que Windows 64 bits se comporte comme Windows 32 bits afin de pouvoir exécuter des programmes 32 bits. – Tmdean

+0

Très utile et intéressant, je ne le savais pas. Toujours agréable de se rapprocher de la compréhension du fonctionnement interne de Windows, merci beaucoup. – Peter

11

Si vous avez le contrôle sur l'exécution de l'exécutable cscript, exécutez la version X:\windows\syswow64\cscript.exe qui est l'implémentation 32 bits.

+0

Merci beaucoup, ça a marché. :) – Peter

12
' C:\Windows\System32\WScript.exe = WScript.exe 
Dim ScriptHost : ScriptHost = Mid(WScript.FullName, InStrRev(WScript.FullName, "\") + 1, Len(WScript.FullName)) 

Dim oWs : Set oWs = CreateObject("WScript.Shell") 
Dim oProcEnv : Set oProcEnv = oWs.Environment("Process") 

' Am I running 64-bit version of WScript.exe/Cscript.exe? So, call script again in x86 script host and then exit. 
If InStr(LCase(WScript.FullName), LCase(oProcEnv("windir") & "\System32\")) And oProcEnv("PROCESSOR_ARCHITECTURE") = "AMD64" Then 
    ' rebuild arguments 
    If Not WScript.Arguments.Count = 0 Then 
     Dim sArg, Arg 
     sArg = "" 
     For Each Arg In Wscript.Arguments 
       sArg = sArg & " " & """" & Arg & """" 
     Next 
    End If 

    Dim sCmd : sCmd = """" & oProcEnv("windir") & "\SysWOW64\" & ScriptHost & """" & " """ & WScript.ScriptFullName & """" & sArg 
    WScript.Echo "Call " & sCmd 
    oWs.Run sCmd 
    WScript.Quit 
End If 
+3

Ajouter une petite explication s'il vous plaît –

+1

Ce qui précède fonctionne vraiment très bien. Il suffit d'ajouter votre script au bas de la page (après la fin de l'exécution) et il fonctionnera sur un système d'exploitation 64 bits de la même manière que sur un système d'exploitation 32 bits et le fera de manière transparente. Mes remerciements. –

+1

Ceci est une pépite d'or. Enveloppez-le dans un sous-élément 'VerifyArchitecture', lancez le sous en bas de votre script et appelez-le sur la première ligne. Mérite bien plus d'amour que c'est acquis! – jleach

1
' *************** 
    ' *** 64bit check 
    ' *************** 
    ' check to see if we are on 64bit OS -> re-run this script with 32bit cscript 
    Function RestartWithCScript32(extraargs) 
    Dim strCMD, iCount 
    strCMD = r32wShell.ExpandEnvironmentStrings("%SYSTEMROOT%") & "\SysWOW64\cscript.exe" 
    If NOT r32fso.FileExists(strCMD) Then strCMD = "cscript.exe" ' This may not work if we can't find the SysWOW64 Version 
    strCMD = strCMD & Chr(32) & Wscript.ScriptFullName & Chr(32) 
    If Wscript.Arguments.Count > 0 Then 
    For iCount = 0 To WScript.Arguments.Count - 1 
    if Instr(Wscript.Arguments(iCount), " ") = 0 Then ' add unspaced args 
     strCMD = strCMD & " " & Wscript.Arguments(iCount) & " " 
    Else 
     If Instr("/-\", Left(Wscript.Arguments(iCount), 1)) > 0 Then ' quote spaced args 
     If InStr(WScript.Arguments(iCount),"=") > 0 Then 
     strCMD = strCMD & " " & Left(Wscript.Arguments(iCount), Instr(Wscript.Arguments(iCount), "=")) & """" & Mid(Wscript.Arguments(iCount), Instr(Wscript.Arguments(iCount), "=") + 1) & """ " 
     ElseIf Instr(WScript.Arguments(iCount),":") > 0 Then 
     strCMD = strCMD & " " & Left(Wscript.Arguments(iCount), Instr(Wscript.Arguments(iCount), ":")) & """" & Mid(Wscript.Arguments(iCount), Instr(Wscript.Arguments(iCount), ":") + 1) & """ " 
     Else 
     strCMD = strCMD & " """ & Wscript.Arguments(iCount) & """ " 
     End If 
     Else 
     strCMD = strCMD & " """ & Wscript.Arguments(iCount) & """ " 
     End If 
    End If 
    Next 
    End If 
    r32wShell.Run strCMD & " " & extraargs, 0, False 
    End Function 

    Dim r32wShell, r32env1, r32env2, r32iCount 
    Dim r32fso 
    SET r32fso = CreateObject("Scripting.FileSystemObject") 
    Set r32wShell = WScript.CreateObject("WScript.Shell") 
    r32env1 = r32wShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") 
    If r32env1 <> "x86" Then ' not running in x86 mode 
    For r32iCount = 0 To WScript.Arguments.Count - 1 
    r32env2 = r32env2 & WScript.Arguments(r32iCount) & VbCrLf 
    Next 
    If InStr(r32env2,"restart32") = 0 Then RestartWithCScript32 "restart32" Else MsgBox "Cannot find 32bit version of cscript.exe or unknown OS type " & r32env1 
    Set r32wShell = Nothing 
    WScript.Quit 
    End If 
    Set r32wShell = Nothing 
    Set r32fso = Nothing 
    ' ******************* 
    ' *** END 64bit check 
    ' ******************* 

Placez le code ci-dessus à le début de votre script et le code suivant fonctionnera en mode 32 bits avec accès aux pilotes ODBC 32 bits. Source.

+0

Wow, ce qui précède fonctionne très bien, et c'est magique! – Jonesome

0

Autre méthode pour exécuter des scripts 32 bits sur la machine 64 bits: % windir% \ SysWOW64 \ cscript.exe vbscriptfile.vbs

1

Nous pouvons forcer vbscript toujours courir avec le mode 32 bits en changeant "system32" à "sysWOW64" dans la valeur par défaut de la clé "Computer \ HKLM \ SOFTWARE] \ Classes \ VBSFile \ Shell \ Open \ Command"

+0

Ce n'est pas correct du tout. Je vois sous MS Windows 7 64bit après ''% SystemRoot% \ System32 \ WScript.exe ""% 1 "% *' à la place de la valeur de 'Command'. –

+0

(@ Academy of Programmer): Juste pour clarifier 2.5 ans plus tard ... Changer la clé de registre sur un ordinateur 64 bits de "System32" à "SysWow64" conduira en effet VBScript à exécuter des scripts GUI en 32 bits. Vous avez raison que la clé de Registre par défaut pointe vers System32 \ WScript.exe qui est le binaire 64 bits. Merci Ronie Do pour la contribution. – Page2PagePro

1

Dans le script de lancement, vous pouvez le forcer, il permet de conserver le même script et le même lanceur pour les deux architecture

:: For 32 bits architecture, this line is sufficent (32bits is the only cscript available) 
set CSCRIPT="cscript.exe" 
:: Detect windows 64bits and use the expected cscript (SysWOW64 contains 32bits executable) 
if exist "C:\Windows\SysWOW64\cscript.exe" set CSCRIPT="C:\Windows\SysWOW64\cscript.exe" 
%CSCRIPT% yourscript.vbs