web-dev-qa-db-fra.com

Comment exécuter un VBScript en mode 32 bits sur une machine 64 bits?

J'ai un fichier texte qui se termine par .vbs dans lequel j'ai écrit ce qui suit:

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 cela sur une machine Windows 32 bits, il s'exécute et se termine sans aucune notion (attendue).
  • Lorsque j'exécute ceci sur une machine Windows 64 bits, il obtient l'erreur

    Le fournisseur est introuvable. Il n'est peut-être pas installé correctement.

Mais il 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 64 bits.

Si j'exécute le VBScript via IIS sur ma machine 64 bits (en tant que fichier ASP), je peux sélectionner qu'il doit s'exécuter en mode 32 bits). Il peut alors trouver le fournisseur.

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

45
Peter

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.

Tapez ensuite

cscript vbscriptfile.vbs
68
volody
' 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
17
Vozzie

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

14
tyranid

Nous pouvons forcer l'exécution continue de vbscript en mode 32 bits en remplaçant "system32" par "sysWOW64" dans la valeur par défaut de la clé "Computer\HKLM\SOFTWARE]\Classes\VBSFile\Shell\Open\Command"

2
Ronie Do
   ' ***************
   ' *** 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 au début de votre script et le code suivant s'exécutera en mode 32 bits avec accès aux pilotes 32 bits ODBC. Source .

2
user2759843

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

1
Divyanand M S

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 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
1
Guilhem Hoffmann