【问题标题】:How do I run a VBScript in 32-bit mode on a 64-bit machine?如何在 64 位机器上以 32 位模式运行 VBScript?
【发布时间】:2011-02-17 21:26:26
【问题描述】:

我有一个以 .vbs 结尾的文本文件,我在其中写入了以下内容:

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
  • 当我在 Windows 32 位计算机上执行此操作时,它会在没有任何概念的情况下运行并结束(预期)。
  • 当我在 Windows 64 位机器上执行此操作时,会出现错误

    找不到提供程序。它可能没有正确安装。

但它已安装。我认为问题的根源在于提供程序是 32 位提供程序,据我所知它不存在 64 位。

如果我在 64 位机器上通过 IIS 运行 VBScript(作为 ASP 文件),我可以选择它应该在 32 位模式下运行。然后它可以找到提供者。

如何让它在 Windows 64 位上找到提供程序?我可以告诉 CScript(执行 .vbs 文本文件)以某种方式在 32 位模式下运行吗?

【问题讨论】:

  • 请注意,即使使用 32 位 Cscript,也不是所有数据库提供程序都能正常工作。如果提供程序是驱动程序(例如:SQLite),则它不起作用。您需要在 64 位 Windows 上安装 64 位 SQLite 驱动程序,因此提供程序将在 64 位 cscript(以及 64 位上的 32 位 cscript)中工作。
  • ODBC 驱动程序根本不是 OLEDB 提供程序。这些通常通过 shim Provider MSDASQL 与 ADO 一起使用,这是默认的兼容性提供程序。当然,如果您将更过时的系统 DSN 加入其中,由于注册表可见性问题,事情会变得很冒险。

标签: vbscript 64-bit 32-bit adodb provider


【解决方案1】:

如果您可以控制运行 cscript 可执行文件,请运行 X:\windows\syswow64\cscript.exe 版本,这是 32 位实现。

【讨论】:

    【解决方案2】:

    关注http://support.microsoft.com/kb/896456

    要启动 32 位命令提示符,请按以下步骤操作:

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

    然后输入

    cscript vbscriptfile.vbs
    

    【讨论】:

    • 非常感谢,它成功了。 :) 不知道 SysWoW64 包含 32 位命令提示符,为什么它仍然命名为“SysWoW64”?
    • WoW 代表 Windows 上的 Windows。它是一个兼容层,使 64 位 Windows 像 32 位 Windows 一样运行,因此它可以运行 32 位程序。
    • 非常有帮助和有趣,我不知道。很高兴能更深入地了解 Windows 的内部工作原理,非常感谢。
    • 我们可以在 HTML 代码下为 VBScript 应用这个 trcik 吗?
    • 您也可以一步完成。运行%windir%\SysWoW64\cscript vbscriptfile.vbs
    【解决方案3】:

    WScript.exe 存在两个版本,一个在C:\Windows\System32\ 中,另一个在C:\Windows\SysWOW64\ 目录中。它们分别以 64 位和 32 位运行(与立即逻辑相反,但为真)。

    您可以在脚本的开头添加以下代码,以便它在检测到以 64 位调用时自动以 32 位重新启动。

    请注意,如果它调用自己切换到 64 位,它会传输参数。

    ' 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
    

    【讨论】:

    • 请补充一点说明
    • 以上实际上工作得非常好。只需将您的脚本添加到它的底部(在 End If 之后),它将在 64 位操作系统上运行,就像在 32 位操作系统上运行一样,并且透明地执行此操作。谢谢。
    • 这是一个金块。将其包裹在 VerifyArchitecture 子中,将子放在脚本底部并在第一行调用它。应该得到比得到的更多的爱!
    【解决方案4】:
       ' ***************
       ' *** 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
       ' *******************
    

    将上述代码放在脚本的开头,随后的代码将在 32 位模式下运行,并可以访问 32 位 ODBC 驱动程序。 Source.

    【讨论】:

      【解决方案5】:

      在 64 位机器上运行 32 位脚本的替代方法: %windir%\syswow64\cscript.exe vbscriptfile.vbs

      【讨论】:

        【解决方案6】:

        我们可以通过将键“Computer\HKLM\SOFTWARE]\Classes\VBSFile\Shell\Open\Command”的默认值中的“system32”更改为“sysWOW64”来强制 vbscript 始终以 32 位模式运行

        【讨论】:

        • 这根本不正确。我在 MS Windows 7 64 位下看到 "%SystemRoot%\System32\WScript.exe" "%1" %* 代替 Command 的值。
        • (@Academy of Programmer):2.5 年后澄清一下……将 64 位计算机上的注册表项从“System32”更改为“SysWow64”确实会导致 VBScript 运行 GUI 脚本在 32 位。您是正确的,默认注册表项指向 System32\WScript.exe,它是 64 位二进制文​​件。感谢 Ronie Do 的贡献。
        • 我认为这很危险,因为 any VBS 脚本将在 32 位中执行。这可能不是你的意图。
        【解决方案7】:

        在启动器脚本中你可以强制它,它允许为两种架构保留相同的脚本和相同的启动器

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

        【讨论】:

          猜你喜欢
          • 2013-05-08
          • 1970-01-01
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 2012-11-07
          • 2015-06-20
          • 2010-10-01
          相关资源
          最近更新 更多