Как запустить VBScript в 32-битном режиме на 64-битной машине?

У меня есть текстовый файл с расширением .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
  • Когда я выполняю это на 32-битной машине Windows, он запускается и завершается без каких-либо замечаний (ожидалось).
  • Когда я выполняю это на 64-битной машине Windows, появляется ошибка
    # P2 #

Но он установлен. Я думаю, что корень проблемы в том, что провайдер является 32-битным провайдером, насколько мне известно, он не существует как 64-битный.

Если я запускаю VBScript через IIS на моем 64-битном компьютере (как файл ASP), я могу выбрать, что он должен работать в 32-битном режиме. Затем он может найти поставщика.

Как я могу заставить его найти провайдера на 64-битной Windows? Могу ли я каким-то образом указать CScript (который выполняет текстовый файл .vbs) работать в 32-битном режиме?


person Peter    schedule 10.05.2010    source источник
comment
Обратите внимание, что даже при использовании 32-битного Cscript не все поставщики баз данных будут работать. Если провайдер является драйвером (пример: SQLite), он не работает. Вместо этого вам необходимо установить 64-разрядные драйверы SQLite в 64-разрядной версии Windows, поэтому поставщик будет работать в 64-разрядной версии cscript (и 32-разрядной версии cscript для 64-разрядной версии).   -  person eduardomozart    schedule 27.01.2014
comment
Драйверы ODBC вообще не являются поставщиками OLEDB. Обычно они используются с ADO через поставщик прокладок MSDASQL, который является поставщиком по умолчанию для совместимости. Конечно, если вы добавите еще более устаревшие системные DSN, все станет рискованно из-за проблем с видимостью реестра.   -  person Bob77    schedule 17.09.2016


Ответы (7)


следуйте http://support.microsoft.com/kb/896456

Чтобы запустить 32-разрядную командную строку, выполните следующие действия:

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

Затем введите

cscript vbscriptfile.vbs
person volody    schedule 10.05.2010
comment
Большое спасибо, это сработало. :) Не знал, что SysWoW64 содержит 32-битную командную строку, почему она все равно называется SysWoW64? - person Peter; 11.05.2010
comment
WoW означает Windows в Windows. Это уровень совместимости, который заставляет 64-битную Windows работать как 32-битную Windows, поэтому она может запускать 32-битные программы. - person Tmdean; 11.05.2010
comment
Очень полезно и интересно, я этого не знала. Всегда приятно приблизиться к пониманию внутреннего устройства Windows, большое спасибо. - person Peter; 11.05.2010
comment
Можем ли мы применить этот trcik для VBScript в HTML-коде? - person DmitryBoyko; 23.11.2015
comment
Вы также можете сделать это за один шаг. Беги %windir%\SysWoW64\cscript vbscriptfile.vbs - person Wernfried Domscheit; 11.05.2018
comment
Или даже %systemroot%\SysWOW64\cscript vbscriptfile.vbs. - person user692942; 18.08.2020

WScript.exe существует в двух версиях: одна в C:\Windows\System32\, а другая в C:\Windows\SysWOW64\ каталогах. Они работают соответственно в 64-битном и 32-битном форматах (против непосредственной логики, но это правда).

Вы можете добавить следующий код в начало вашего скрипта, чтобы он автоматически запускался снова в 32-битном режиме, если он обнаруживает, что он вызывается в 64-битном режиме.

Обратите внимание, что он передает аргументы, если вызывает себя для переключения на 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
person Vozzie    schedule 10.03.2013
comment
Добавьте небольшое объяснение, пожалуйста - person Ed Heal; 10.03.2013
comment
Вышеупомянутое на самом деле работает очень хорошо. Просто добавьте свой скрипт в его нижнюю часть (после End If), и он будет работать в 64-битной ОС так же, как он работает в 32-битной ОС, и делать это прозрачно. Моя благодарность. - person Obi Wan; 11.03.2015
comment
Это золотой самородок. Оберните его в VerifyArchitecture подпрограмму, бросьте подпрограмму в конец вашего скрипта и вызовите ее в первой строке. Заслуживает гораздо большей любви, чем получил! - person jleach; 02.09.2016

Если у вас есть контроль над запуском исполняемого файла cscript, запустите версию X:\windows\syswow64\cscript.exe, которая является 32-битной реализацией.

person tyranid    schedule 10.05.2010

Мы можем заставить vbscript всегда работать в 32-битном режиме, изменив "system32" на "sysWOW64" в значении по умолчанию ключа "Computer \ HKLM \ SOFTWARE] \ Classes \ VBSFile \ Shell \ Open \ Command"

person Ronie Do    schedule 16.04.2015
comment
Это совсем не правильно. В 64-разрядной версии MS Windows 7 я вижу следующее "%SystemRoot%\System32\WScript.exe" "%1" %* вместо значения Command. - person DmitryBoyko; 23.11.2015
comment
(@ Academy of Programmer): Просто чтобы прояснить, 2,5 года спустя ... Изменение раздела реестра на 64-битном компьютере с System32 на SysWow64 действительно приведет к тому, что VBScript будет запускать скрипты GUI в 32-битном режиме. Вы правы, что ключ реестра по умолчанию указывает на System32 \ WScript.exe, который является 64-битным двоичным файлом. Спасибо Рони До за вклад. - person Page2PagePro; 22.01.2018
comment
Я считаю, что это опасно, потому что тогда любой сценарий VBS будет выполняться в 32-битном формате. Возможно, это не было вашим намерением. - person Wernfried Domscheit; 11.05.2018

   ' ***************
   ' *** 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. Источник.

person user2759843    schedule 08.09.2013

Альтернативный метод запуска 32-разрядных сценариев на 64-разрядной машине:% windir% \ syswow64 \ cscript.exe vbscriptfile.vbs

person Divyanand M S    schedule 08.05.2014

В сценарии запуска вы можете принудительно использовать его, он позволяет сохранить один и тот же сценарий и одну и ту же программу запуска для обеих архитектур.

:: 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
person Guilhem Hoffmann    schedule 17.04.2015