如何在64位计算机上以32位模式运行VBScript?
我有一个以.vbs结尾的文本文件,我在其中编写了以下内容:如何在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
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位机器上执行此操作时,它会收到错误 找不到提供程序。它可能没有正确安装
如何在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