Wie führe ich eine VBScript in 32-Bit-Modus auf einem 64-Bit-Maschine?
Frage
Ich habe eine Textdatei, die Enden mit vbs, dass ich folgendes geschrieben haben, in:
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 ausführen diese auf einer Windows 32-Bit-Maschine läuft und endet ohne jede Vorstellung (erwartet).
- Wenn ich dies ausführen auf einem Windows 64-Bit-Rechner wird es den Fehler
Provider kann nicht gefunden werden. Es kann nicht richtig installiert werden.
Aber es ist installiert. Ich denke, die Wurzel des Problems ist, dass der Anbieter ein 32-Bit-Provider sind, soweit ich es weiß nicht, wie 64-Bit vorhanden ist.
Wenn ich das VBScript über IIS auf meinem 64-Bit-Rechner (als ASP-Datei) ausführen kann ich wählen, dass er in 32-Bit-Modus ausgeführt werden soll. Es kann dann den Provider finden.
Wie kann ich es den Provider auf Windows 64-Bit machen finden? Kann ich sagen, CScript (die die VBS-Textdatei ausführt) irgendwie in 32-Bit-Modus laufen zu lassen?
Lösung
http://support.microsoft.com/kb/896456
Um eine 32-Bit-Eingabeaufforderung zu starten, gehen Sie folgendermaßen vor:
* Click Start, click Run, type %windir%\SysWoW64\cmd.exe, and then click OK.
Geben Sie dann
cscript vbscriptfile.vbs
Andere Tipps
' 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
Wenn Sie die Kontrolle über die cscript ausführbaren dann die X:\windows\syswow64\cscript.exe
Version laufen, die die 32-Bit-Implementierung.
' ***************
' *** 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
' *******************
Setzen Sie den obigen Code am Anfang des Skripts und der nachfolgenden Code wird mit Zugang zu den 32-Bit-ODBC-Treiber in 32-Bit-Modus ausgeführt werden. Quelle .
Wir zwingen Vbscript immer mit 32-Bit-Modus laufen durch "system32" auf "sysWOW64" in Standardwert Schlüssel "Computer \ HKLM \ SOFTWARE] \ Classes \ VBSFile \ Shell \ Open \ Command"
ÄndernAlternative Methode 32-Bit-Skripte auf 64-Bit-Maschine laufen zu lassen: % Windir% \ syswow64 \ cscript.exe vbscriptfile.vbs
Im Launcher-Skript Sie es erzwingen kann, ist es erlaubt, das gleiche Skript und derselben Trägerrakete für beide Architektur zu halten
:: 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