2010-05-10 10 views
37

Ich habe eine Textdatei, die mit vbs endet, die ich folgend in geschrieben habe:Wie führe ich ein VBScript im 32-Bit-Modus auf einem 64-Bit-Rechner aus?

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 ausführen dieses auf einem Windows 64-Bit-Maschine es den Fehler

    Provider bekommt kann nicht gefunden werden. Es ist möglicherweise nicht richtig installiert.

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

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

Wie kann ich den Provider unter Windows 64-Bit finden? Kann ich CScript (das die .vbs-Textdatei ausführt) irgendwie im 32-Bit-Modus ausführen?

+0

Bitte beachten Sie, dass auch mit 32-Bit Cscript nicht alle Datenbankanbieter werden arbeiten. Wenn der Anbieter ein Treiber ist (Beispiel: SQLite), funktioniert es nicht. Sie müssen 64-Bit-SQLite-Treiber stattdessen auf Windows 64-Bit installieren, damit der Anbieter in Cscript 64-Bit (und 32-Bit-Cscript auf 64-Bit) funktioniert. – jaysponsored

+0

ODBC-Treiber sind überhaupt keine OLEDB-Provider. Diese werden normalerweise mit ADO über den Shim-Provider "MSDASQL" verwendet, der aus Kompatibilitätsgründen der Standardanbieter ist. Natürlich, wenn Sie die noch mehr veralteten System-DSNs in den Mix einbringen, werden die Dinge aufgrund von Sichtbarkeitsproblemen in der Registry heikel. – Bob77

Antwort

58

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

Dann

cscript vbscriptfile.vbs 
+0

Vielen Dank, es hat funktioniert.:) Wusste nicht, dass SysWoW64 eine 32-Bit-Eingabeaufforderung enthielt, warum heißt es eigentlich "SysWoW64"? – Peter

+10

WoW steht für Windows unter Windows. Es ist eine Kompatibilitätsschicht, die bewirkt, dass 64-Bit-Windows wie 32-Bit-Windows funktioniert, so dass 32-Bit-Programme ausgeführt werden können. – Tmdean

+0

Sehr hilfreich und interessant, das wusste ich nicht. Es ist immer schön, dem inneren Verständnis von Windows näher zu kommen, vielen Dank. – Peter

11

Wenn Sie die Ausführung der cscript-Datei steuern können, führen Sie die X:\windows\syswow64\cscript.exe-Version aus, bei der es sich um die 32-Bit-Implementierung handelt.

+0

Vielen Dank, es hat funktioniert. :) – 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

Fügen Sie bitte eine kleine Erklärung hinzu –

+1

Das oben genannte funktioniert tatsächlich extrem gut. Fügen Sie einfach Ihr Skript an den unteren Rand (nach dem Ende If) und es wird auf einem 64-Bit-Betriebssystem das gleiche wie es auf einem 32-Bit-Betriebssystem ausgeführt wird und tun dies transparent. Meinen Dank. –

+1

Dies ist ein goldener Nugget. Wickeln Sie es in einen 'VerifyArchitecture'-Unterordner, werfen Sie den Unterpunkt am unteren Rand Ihres Skripts und rufen Sie ihn in der ersten Zeile auf. Verdient viel mehr Liebe als es bekommen hat! – 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 
    ' ******************* 

Setzen Sie den obigen Code eingeben an der Anfang Ihres Skripts und der folgende Code wird im 32-Bit-Modus mit Zugriff auf die 32-Bit-ODBC-Treiber ausgeführt. Source.

+0

Wow, das oben genannte funktioniert großartig und ist magisch! – Jonesome

0

Alternative Methode 32-Bit-Skripte auf 64-Bit-Maschine laufen zu lassen: % windir% \ syswow64 \ cscript.exe vbscriptfile.vbs

1

Wir Vbscript zwingen können, immer mit 32-Bit-Modus ausgeführt werden, indem "system32" "sysWOW64" im Standardwert des Schlüssels "Computer \ HKLM \ SOFTWARE" \ Klassen \ VBSFile \ Shell \ Öffnen \ Befehl "

+0

Das ist überhaupt nicht richtig. Ich sehe unter MS Windows 7 64bit nach "% SystemRoot% \ System32 \ WScript.exe" "% 1"% * 'anstelle des Wertes für' Command'. –

+0

(@ Academy of Programmer): Nur um 2,5 Jahre später zu klären ... Das Ändern des Registrierungsschlüssels auf einem 64-Bit-Computer von "System32" zu "SysWow64" führt VBScript in der Tat dazu, GUI-Skripte in 32-Bit auszuführen. Sie haben Recht, dass der Standardregistrierungsschlüssel auf System32 \ WScript.exe verweist, das die 64-Bit-Binärdatei ist. Danke Ronie Do für den Beitrag. – Page2PagePro

1

Im Launcher-Skript können Sie es erzwingen, es erlaubt, das gleiche Skript und den gleichen Launcher zu behalten für beide Architektur

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