wake-up-neo.com

Wie führe ich ein VBScript im 32-Bit-Modus auf einem 64-Bit-Computer aus?

Ich habe eine Textdatei, die mit .vbs endet und in der ich Folgendes geschrieben habe:

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
  • Wenn ich dies auf einem 32-Bit-Windows-Computer ausführe, wird es ausgeführt und ohne Vorbehalt beendet (erwartet).
  • Wenn ich dies auf einem Windows 64-Bit-Computer ausführe, wird der Fehler Angezeigt.

    Anbieter kann nicht gefunden werden. Möglicherweise ist es nicht richtig installiert.

Aber es ist installiert. Ich denke, die Wurzel des Problems ist, dass der Provider ein 32-Bit-Provider ist, soweit ich weiß, dass er nicht als 64-Bit-Provider existiert.

Wenn ich das VBScript über IIS auf meinem 64-Bit-Computer (als ASP Datei)) ausführe, kann ich auswählen, dass es im 32-Bit-Modus ausgeführt werden soll. Es kann dann den Anbieter finden.

Wie kann ich den Anbieter unter Windows 64-Bit finden lassen? Kann ich CScript (das die .vbs-Textdatei ausführt) anweisen, irgendwie im 32-Bit-Modus zu arbeiten?

45
Peter

folgen Sie http://support.Microsoft.com/kb/896456

Gehen Sie folgendermaßen vor, um eine 32-Bit-Eingabeaufforderung zu starten:

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

Dann tippe

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

Wenn Sie die Kontrolle über die Ausführung der ausführbaren Datei cscript haben, führen Sie den Befehl X:\windows\syswow64\cscript.exe Version, die die 32-Bit-Implementierung ist.

14
tyranid

Wir können erzwingen, dass VBScript immer im 32-Bit-Modus ausgeführt wird, indem wir "system32" in "sysWOW64" im Standardwert des Schlüssels "Computer\HKLM\SOFTWARE]\Classes\VBSFile\Shell\Open\Command" ändern.

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
   ' *******************

Stellen Sie den obigen Code an den Anfang Ihres Skripts, und der nachfolgende Code wird im 32-Bit-Modus mit Zugriff auf die 32-Bit-Treiber ODBC ausgeführt. Quelle .

2
user2759843

Alternative Methode zum Ausführen von 32-Bit-Skripten auf einem 64-Bit-Computer:% windir%\syswow64\cscript.exe vbscriptfile.vbs

1
Divyanand M S

Im Launcher-Skript können Sie es erzwingen. Es erlaubt, dasselbe Skript und denselben Launcher für beide Architekturen beizubehalten

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