2010-11-05 26 views

Répondre

2

Apparemment, son assez simple.

Sous Windows Vista et plus récent, il existe un dossier alias sous C: \ Windows \ Sysnative. Si vous l'appelez, il ne sera pas rediriger vers le répertoire c: \ windows \ SysWow64 32 dossier bits, mais forcera les 64 executables de bits natif à appeler

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

Par conséquent, vous pouvez exécuter un script VBScript en mode 64 bits à partir d'un vbscript exécuté en mode wow64 en appelant% windir% \ Sysnative \ cscript.exe et en fournissant le nom de votre script en tant que paramètre.

Cependant, cela ne fonctionne que sous Windows Vista ou plus récent. Il y a un correctif qui peut permettre à ce dossier Sysnative dans Windows XP/2003

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

1

Placez le code suivant en haut de votre script pour détecter si le système d'exploitation est 64bit réexécuter en mode 32 bits

' *************** 
' *** 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 
' *******************