Comment exécuter un script VBScript en mode 32 bits sur un ordinateur 64 bits?

J’ai un fichier texte qui se termine par .vbs que j’ai écrit dans:

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 je l’exécute sur un ordinateur Windows 32 bits, il s’exécute et se termine sans aucune notion (attendue).
  • Lorsque je l’exécute sur un ordinateur Windows 64 bits, il reçoit l’erreur

    Fournisseur introuvable. Il n’est peut-être pas correctement installé.

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

Si je lance VBScript via IIS sur mon ordinateur 64 bits (en tant que fichier ASP), je peux choisir de l’exécuter en mode 32 bits. Il peut alors trouver le fournisseur.

Comment puis-je lui faire trouver le fournisseur sous Windows 64 bits? Puis-je demander à CScript (qui exécute le fichier texte .vbs) de fonctionner en mode 32 bits d’une manière ou d’une autre?

suivez 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. 

Puis tapez

 cscript vbscriptfile.vbs 

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.

 ' 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 
  ' *************** ' *** 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.ExpandEnvironmentSsortingngs("%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.ExpandEnvironmentSsortingngs("%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 au début de votre script et le code suivant s’exécutera en mode 32 bits avec access aux pilotes ODBC 32 bits. Source

Nous pouvons forcer vbscript à toujours s’exécuter en mode 32 bits en modifiant “system32” en “sysWOW64” dans la valeur par défaut de la clé “Ordinateur \ HKLM \ SOFTWARE] \ Classes \ VBSFile \ Shell \ Open \ Command”

Autre méthode pour exécuter des scripts 32 bits sur un ordinateur 64 bits:% windir% \ syswow64 \ cscript.exe vbscriptfile.vbs

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

 :: 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