2010-05-10 19 views
37

Tengo un archivo de texto que termina con .vbs que he escrito lo siguiente en:¿Cómo ejecuto un VBScript en modo de 32 bits en una máquina de 64 bits?

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 
  • Cuando ejecuto esto en una máquina de 32 bits de Windows que se ejecuta y termina sin ninguna noción (esperado) .
  • Cuando ejecuto esto en una máquina de 64 bits de Windows aparece el error

    proveedor no se puede encontrar. Puede que no esté instalado correctamente.

Pero está instalado. Creo que la raíz del problema es que el proveedor es un proveedor de 32 bits, hasta donde sé que no existe como de 64 bits.

Si ejecuto VBScript a través de IIS en mi máquina de 64 bits (como un archivo ASP), puedo seleccionar que se ejecute en modo de 32 bits. A continuación, puede encontrar el proveedor.

¿Cómo puedo hacer que encuentre el proveedor en Windows de 64 bits? ¿Puedo decirle a CScript (que ejecuta el archivo de texto .vbs) que se ejecute en modo de 32 bits de alguna manera?

+0

Tenga en cuenta que incluso con 32 bits Cscript no todos los proveedores de bases de datos van a funcionar. Si el proveedor es un controlador (ejemplo: SQLite), no funciona. En su lugar, debe instalar los controladores SQLite de 64 bits en Windows de 64 bits, por lo que el proveedor funcionará en cscript de 64 bits (y en cscript de 32 bits en 64 bits). – jaysponsored

+0

Los controladores ODBC no son proveedores OLEDB en absoluto. Estos se usan normalmente con ADO a través del proveedor de cuñas 'MSDASQL' que es el proveedor predeterminado para la compatibilidad. Por supuesto, si traes los DSN del sistema aún más obsoletos a la mezcla, las cosas se ponen feas debido a problemas de visibilidad del registro. – Bob77

Respuesta

58

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

Para iniciar un símbolo del sistema de 32 bits, siga estos pasos:

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

A continuación, escriba

cscript vbscriptfile.vbs 
+0

Muchas gracias, funcionó.:) No sabía que SysWoW64 contenía un símbolo del sistema de 32 bits, ¿por qué se llama "SysWoW64" de todos modos? – Peter

+10

WoW significa Windows en Windows. Es una capa de compatibilidad que hace que Windows de 64 bits actúe como Windows de 32 bits para que pueda ejecutar programas de 32 bits. – Tmdean

+0

Muy útil e interesante, no lo sabía. Siempre es bueno acercarse a la comprensión del funcionamiento interno de Windows, muchas gracias. – Peter

11

Si tiene control sobre la ejecución del ejecutable cscript, ejecute la versión X:\windows\syswow64\cscript.exe, que es la implementación de 32 bits.

+0

Muchas gracias, funcionó. :) – 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

Agregue una pequeña explicación por favor –

+1

Lo anterior en realidad funciona extremadamente bien. Simplemente agregue su script al final del mismo (después de End If) y se ejecutará en un sistema operativo de 64 bits de la misma manera que se ejecuta en un sistema operativo de 32 bits y lo hará de forma transparente. Mis agradecimientos. –

+1

Esta es una pepita de oro. Encuéntralo en un subperto 'VerifyArchitecture', lanza el sub en la parte inferior de tu script y llámalo en la primera línea. ¡Se merece mucho más amor del que se obtiene! – 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 
    ' ******************* 

Coloque el código anterior en el comienzo de tu script y el código subsiguiente se ejecutará en modo de 32 bits con acceso a los controladores ODBC de 32 bits. Source.

+0

¡Guau, lo anterior funciona genial, y es mágico! – Jonesome

0

método alternativo para ejecutar scripts de 32 bits en la máquina de 64 bits: % windir% \ SysWOW64 \ cscript.exe vbscriptfile.vbs

1

Podemos forzar VBScript siempre se ejecutan con el modo de 32 bits cambiando "system32" a "sysWOW64" en el valor predeterminado de la clave "Equipo \ HKLM \ SOFTWARE] \ Classes \ VBSFile \ Shell \ Open \ Command"

+0

Eso no es correcto en absoluto. Veo en MS Windows 7 64bit siguiente '"% SystemRoot% \ System32 \ WScript.exe ""% 1 "% *' en lugar del valor de 'Command'. –

+0

(@ Academy of Programmer): solo para aclararlo 2.5 años después ... Cambiar la clave de registro en una computadora de 64 bits de "System32" a "SysWow64" llevará a que VBScript ejecute los guiones de la GUI en 32 bits. Tiene razón en que la clave de registro predeterminada apunta a System32 \ WScript.exe, que es el binario de 64 bits. Gracias Ronie Do por la contribución. – Page2PagePro

1

En el script del iniciador puede forzarlo, permite mantener el mismo script y el mismo iniciador para ambas arquitectura

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