Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在64位计算机上以32位模式运行VBScript?_Vbscript_64 Bit_32 Bit_Adodb_Provider - Fatal编程技术网

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

如何在64位计算机上以32位模式运行VBScript?,vbscript,64-bit,32-bit,adodb,provider,Vbscript,64 Bit,32 Bit,Adodb,Provider,我有一个以.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 Co

我有一个以.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位模式运行吗?

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

遵循

要启动32位命令提示符,请执行以下步骤:

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

cscript vbscriptfile.vbs

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

您可以在脚本的开头添加以下代码,以便在检测到以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
'***************
'***64位检查
' ***************
'检查是否使用64位操作系统->使用32位cscript重新运行此脚本
使用CSCRIPT32重新启动函数(附加参数)
Dim strCMD,iCount
strCMD=r32wShell.ExpandEnvironmentStrings(“%SYSTEMROOT%”)&“\SysWOW64\cscript.exe”
如果不存在r32fso.FileExists(strCMD),则strCMD=“cscript.exe”'如果找不到SysWOW64版本,这可能不起作用
strCMD=strCMD&Chr(32)&Wscript.ScriptFullName&Chr(32)
如果Wscript.Arguments.Count>0,则
对于WScript.Arguments.Count-1的iCount=0
如果Instr(Wscript.Arguments(iCount),“”=0,则“添加无空格的参数”
strCMD=strCMD&&&Wscript.Arguments(iCount)&
其他的
如果Instr(“/-\”,Left(Wscript.Arguments(iCount),1))>0,则“引用间隔参数”
如果InStr(WScript.Arguments(iCount),“=”>0,则
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然后
strCMD=strCMD&&Left(Wscript.Arguments(iCount),Instr(Wscript.Arguments(iCount),“:”)和“”&Mid(Wscript.Arguments(iCount),Instr(Wscript.Arguments(iCount),“:”+1)和“
其他的
strCMD=strCMD&“”&Wscript.Arguments(iCount)&“”
如果结束
其他的
strCMD=strCMD&“”&Wscript.Arguments(iCount)&“”
如果结束
如果结束
下一个
如果结束
r32wShell。运行strCMD&&extraargs,0,False
端函数
尺寸r32wShell、r32env1、r32env2、r32incount
Dim r32fso
设置r32fso=CreateObject(“Scripting.FileSystemObject”)
设置r32wShell=WScript.CreateObject(“WScript.Shell”)
r32env1=r32wShell.expandEnvironmentString(“%PROCESSOR\u ARCHITECTURE%”)
如果r32env1为“x86”,则“未在x86模式下运行”
对于r32iCount=0到WScript.Arguments.Count-1
r32env2=r32env2&WScript.Arguments(r32iCount)&VbCrLf
下一个
如果InStr(r32env2,“restart32”)=0,则使用cscript32“restart32”重新启动,否则MsgBox“找不到32位版本的cscript.exe或未知操作系统类型”&r32env1
设置r32wShell=Nothing
WScript.Quit
如果结束
设置r32wShell=Nothing
设置r32fso=Nothing
' *******************
'***结束64位检查
' *******************

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

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

我们可以通过将启动程序脚本中键“Computer\HKLM\SOFTWARE]\Classes\VBSFile\Shell\Open\Command”的默认值中的“system32”更改为“syswow64”来强制vbscript始终以32位模式运行,它允许为两种体系结构保留相同的脚本和相同的启动器

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

非常感谢,成功了。:)我不知道SysWoW64包含一个32位的命令提示符,为什么它被命名为“SysWoW64”呢?WoW代表Windows上的Windows。它是一个兼容层,使64位Windows像32位Windows一样运行32位程序。非常有用和有趣,我不知道。非常感谢您能更深入地了解Windows的内部工作原理。我们可以在HTML代码下应用此trcik for VBScript吗?您也可以一步完成。运行
%windir%\SysWoW64\cscript vbscriptfile.vbs
请添加一点解释上述操作实际上非常有效。只需将脚本添加到它的底部(在结束If之后),它将在64位操作系统上运行,与在32位操作系统上运行相同,并且透明地运行。谢谢。这是一块金块。将其包装在
VerifyArchitecture
sub中,将sub放在脚本底部,并在第一行调用它。值得比得到的更多的爱!请注意,即使使用32位Cscript,也不是所有的数据库提供程序都能工作。如果提供程序是驱动程序(例如:SQLite),则它不起作用。您需要在Windows 64位上安装64位SQLite驱动程序,这样该提供程序将在cscript 64位(以及32位cscript 64位)中工作。ODBC驱动程序根本不是OLEDB提供程序。它们通常通过垫片提供程序
MSDASQL
与ADO一起使用,后者是兼容性的默认提供程序。当然,如果你带来
:: 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