¿Cómo ejecuto un VBScript en modo de 32 bits en una máquina de 64 bits?
64bit 32-bit (7)
Tengo un archivo de texto que termina con .vbs y he escrito lo siguiente en:
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 Windows de 32 bits, se ejecuta y finaliza sin ninguna noción (esperada).
- Cuando ejecuto esto en una máquina de Windows de 64 bits, aparece el error
No se puede encontrar proveedor. 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, que yo sepa que no existe como de 64 bits.
Si ejecuto el 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 al 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?
En el script del iniciador puede forzarlo, permite mantener el mismo script y el mismo lanzador para ambas arquitecturas.
:: 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
Método alternativo para ejecutar scripts de 32 bits en una máquina de 64 bits:% windir% / syswow64 / cscript.exe vbscriptfile.vbs
Podemos forzar que vbscript siempre se ejecute con el modo de 32 bits cambiando "system32" a "sysWOW64" en el valor predeterminado de la clave "Computadora / HKLM / SOFTWARE] / Classes / VBSFile / Shell / Open / Command"
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.
siga http://support.microsoft.com/kb/896456
Para iniciar un indicador de comandos de 32 bits, siga estos pasos:
* Click Start, click Run, type %windir%/SysWoW64/cmd.exe, and then click OK.
Entonces escribe
cscript vbscriptfile.vbs
'' 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
'' ***************
'' *** 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 al comienzo de su secuencia de comandos y el código posterior se ejecutará en modo de 32 bits con acceso a los controladores ODBC de 32 bits. Source