Как запустить скрипт Vb, который работает в 64-битном режиме из VBScript, работающего под Wow64

У меня есть скрипт VB, который вынужден работать в режиме Wow64. Я бы хотел, чтобы он запускал либо другой скрипт, либо сам, в собственном 64-битном режиме. Есть ли способ сделать это?

Начальный сценарий вызывается явным вызовом cscript.exe (не уверен, если это имеет значение или нет)

Спасибо

2 ответа

Решение

Видимо это довольно просто.

В Windows Vista и новее есть папка псевдонима в C:\Windows\Sysnative. Если вы вызываете его, он не будет перенаправлять в 32-битную папку c: \ windows \ SysWow64, но будет вызывать собственные 64-битные исполняемые файлы

http://msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx

Поэтому вы можете запустить vbscript в 64-битном режиме из vbscript, запущенного в режиме wow64, вызвав%windir%\Sysnative\cscript.exe и затем указав имя вашего скрипта в качестве параметра.

Однако это работает только в Windows Vista или новее. Существует исправление, которое может включить эту папку Sysnative в Windows XP / 2003

http://support.microsoft.com/kb/942589

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

' ***************
' *** 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 probably won't 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
 ' we are not running in x86 mode, so run in that mode; check if we have done this already
 For r32iCount = 0 To WScript.Arguments.Count - 1
  r32env2 = r32env2 & WScript.Arguments(r32iCount) & VbCrLf
 Next
 ' MsgBox "64bit (restarting) " & r32env2
 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
Else
 For r32iCount = 0 To WScript.Arguments.Count - 1
  r32env2 = r32env2 & WScript.Arguments(r32iCount) & VbCrLf
 Next
' MsgBox "32bit! " & r32env2
End If
'MsgBox "OS: " & r32env1 & VbCrLf & "Param: " & r32env2 & VbCrLf & "Script: " & WScript.FullName & VbCrLf & "Fullname: " & " " & Wscript.ScriptFullName
Set r32wShell = Nothing
Set r32fso = Nothing
' WScript.Quit
' *******************
' *** END 64bit check
' *******************
Другие вопросы по тегам