2010-05-10 22 views
37

Ho un file di testo che termina con vbs che ho scritto quanto segue in:Come si esegue un VBScript in modalità a 32 bit su un computer a 64 bit?

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 
  • Quando eseguo questo su una macchina Windows a 32 bit viene eseguito e termina senza alcuna nozione (expected) .
  • Quando eseguo questo su una macchina Windows a 64 bit ottiene l'errore

    Provider non può essere trovato. Potrebbe non essere installato correttamente.

Ma è installato. Penso che la radice del problema è che il provider è un provider a 32 bit, per quanto ne so non esiste come 64-bit.

Se eseguo VBScript tramite IIS sulla mia macchina a 64 bit (come file ASP) posso selezionare che debba essere eseguito in modalità a 32 bit. Può quindi trovare il provider.

Come posso trovare il provider su Windows 64-bit? Posso dire a CScript (che esegue il file di testo .vbs) per funzionare in qualche modo in modalità 32-bit?

+0

Si noti che anche utilizzando 32 bit Cscript non funzionerà tutti i provider di database. Se il provider è un driver (esempio: SQLite) non funziona. È necessario installare i driver SQLite a 64 bit su Windows 64-bit, in modo che il provider funzioni in Cscript a 64 bit (e Cscript a 32 bit su 64 bit). – jaysponsored

+0

I driver ODBC non sono affatto provider OLEDB. Questi sono normalmente usati con ADO tramite lo shim Provider 'MSDASQL' che è il Provider predefinito per la compatibilità. Ovviamente se si introducono i DSN di sistema ancora più obsoleti nel mix, le cose si complicano a causa dei problemi di visibilità del registro. – Bob77

risposta

58

seguire http://support.microsoft.com/kb/896456

Per avviare un prompt dei comandi a 32 bit, attenersi alla seguente procedura:

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

Quindi digitare

cscript vbscriptfile.vbs 
+0

Grazie mille, ha funzionato.:) Non sapevo che SysWoW64 conteneva un prompt dei comandi a 32 bit, perché è chiamato "SysWoW64"? – Peter

+10

WoW è l'acronimo di Windows su Windows. È un livello di compatibilità che fa sì che Windows a 64 bit funzioni come Windows a 32 bit in modo che possa eseguire programmi a 32 bit. – Tmdean

+0

Molto utile e interessante, non lo sapevo. Sempre bello avvicinarsi alla comprensione del funzionamento interno di Windows, grazie mille. – Peter

11

Se si ha il controllo dell'esecuzione dell'eseguibile cscript, eseguire la versione X:\windows\syswow64\cscript.exe che è l'implementazione a 32 bit.

+0

Grazie mille, ha funzionato. :) – 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

Aggiungi una piccola spiegazione per favore –

+1

Quanto sopra funziona davvero molto bene. Basta aggiungere il tuo script alla fine di esso (dopo l'End If) e verrà eseguito su un sistema operativo a 64 bit lo stesso che viene eseguito su un sistema operativo a 32 bit e farlo in modo trasparente. I miei ringraziamenti. –

+1

Questa è una pepita d'oro. Racchiudilo in un sottotitolo 'VerifyArchitecture', getta il sottotitolo nella parte inferiore del tuo script e chiamalo sulla prima riga. Merita molto più amore di quanto non sia ottenuto! – 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 
    ' ******************* 

Inserire il codice di cui sopra a l'inizio della tua sceneggiatura e il codice successivo verrà eseguito in modalità 32 bit con accesso ai driver ODBC a 32 bit. Source.

+0

Wow, quanto sopra funziona alla grande, ed è magico! – Jonesome

0

metodo alternativo per eseguire script a 32 bit in computer a 64 bit: % windir% \ syswow64 \ cscript.exe vbscriptfile.vbs

1

possiamo costringere VBScript eseguito sempre con la modalità a 32 bit cambiando "system32" a "sysWOW64" nel valore predefinito della chiave "Computer \ HKLM \ SOFTWARE] \ Classes \ VBSFile \ Shell \ Open \ Command"

+0

Questo non è affatto corretto. Vedo sotto MS Windows 7 a 64 bit seguendo '"% SystemRoot% \ System32 \ WScript.exe ""% 1 "% *' al posto del valore di 'Command'. –

+0

(@ Academy of Programmer): giusto per chiarire 2,5 anni dopo ... Cambiare la chiave di registro su un computer a 64 bit da "System32" a "SysWow64" porterà infatti VBScript a eseguire script GUI a 32 bit. Hai ragione sul fatto che la chiave di registro predefinita punta a System32 \ WScript.exe che è il binario a 64 bit. Grazie Ronie Do per il contributo. – Page2PagePro

1

Nello script di avvio è possibile forzarlo, consente di mantenere lo stesso script e lo stesso programma di avvio per entrambe le architetture

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