如何在 64 位机器上以 32 位模式运行 VBScript?

Posted

技术标签:

【中文标题】如何在 64 位机器上以 32 位模式运行 VBScript?【英文标题】:How do I run a VBScript in 32-bit mode on a 64-bit machine? 【发布时间】: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 加入其中,由于注册表可见性问题,事情会变得很冒险。 【参考方案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

【讨论】:

以上是关于如何在 64 位机器上以 32 位模式运行 VBScript?的主要内容,如果未能解决你的问题,请参考以下文章

在 32 位 Xp 计算机上构建 64 位 Qt

无法在电子应用程序中显示 Flash 内容

在 64 位操作系统上以 32 位和 64 位运行 IIS 的优缺点是啥?

32 位应用程序无法在 x64 Win2003 上运行,原因是

在 64 位 linux 上从 32 位模式切换到 64 位(长模式)

如何强制 MSBuild 编译为 32 位模式?