1

Wow64 モードで強制的に実行される VB スクリプトがあります。別のスクリプトまたはそれ自体をネイティブ 64 ビット モードで開始したいと考えています。とにかくそれを行うことはありますか?

最初のスクリプトは、cscript.exe への明示的な呼び出しによって呼び出されています (これが違いを生むかどうかはわかりません)。

ありがとう

4

2 に答える 2

2

どうやらそれはかなり単純です。

Windows Vista 以降では、C:\Windows\Sysnative にエイリアス フォルダーがあります。それを呼び出すと、c:\windows\SysWow64 32 ビット フォルダーにリダイレクトされませんが、ネイティブの 64 ビット実行可能ファイルが強制的に呼び出されます。

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

したがって、%windir%\Sysnative\cscript.exe を呼び出し、スクリプトの名前をパラメーターとして指定することにより、wow64 モードで実行されている vbscript から 64 ビット モードで vbscript を実行できます。

ただし、これは Windows Vista 以降でのみ機能します。Windows XP/2003 でこの Sysnative フォルダーを有効にするホットフィックスがあります。

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

于 2010-11-06T14:26:28.210 に答える
1

次のコードをスクリプトの先頭に配置して、OS が 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
' *******************
于 2012-01-19T22:27:11.157 に答える