Windows – Force 64bit WScript to run .vbs

64-bitscriptvbscriptwindows

I'm trying to run a .vbs script under 64Bit. When I run this script manually it will execute properly, but when launched by something else, it will run under 32bit and won't execute properly.

Here's my script:

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run Chr(34) & "C:\Users\Chris Nicol\Documents\SlickRun Scripts\Zune\RunZune.bat" & Chr(34), 0
Set WshShell = Nothing

Basically I want to force the use of C:\windows\syswow64\cmd.exe, so that it will run correctly. I can't seem to get the syntax right and can't find help on this.

Here's the batch file and regedit file that I'm trying to execute:

RunZune.bat:

@ECHO OFF

regedit /s FeaturesOverride.reg
"C:\Program Files\Zune\Zune.exe"

exit

FeaturesOverride.reg:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Zune\Features]
"Channels"="US,CA"
"MusicVideos"="US,CA"
"Picks"="US,CA"
"Podcasts"="US,CA"
"QuickMixLocal"="US,CA"

Best Answer

The following code will check if the system is 64Bit and in this case close the script and rerun it forcing the 64Bit Host by calling it directly with the script as parameter.

If fso.FileExists("C:\Windows\SysWOW64\wscript.exe") Then
    If InStr(1, WScript.FullName, "SysWOW64", vbTextCompare) <> 0 Then ' = very basic 64bit check replace if you want a more sophisticated one
        newFullName = Replace(WScript.FullName, "SysWOW64", "Sysnative", 1, -1, vbTextCompare) ' System32 will be replaced by Sysnative. calls to sysnative bypass WoW64 emulation, cscript or wscript stays the same as they were
        newArguments = "" ' all arguments are given to the new script call
        For Each arg In WScript.Arguments
            newArguments = newArguments & arg & " "
        Next
        wso.Run newFullName & " """ & WScript.ScriptFullName & """ " & newArguments, , False
        WScript.Quit ' Close 32Bit scripting host
    End If
End If

This workaround ensures that the script is run in 64Bit no matter who calls it. If you have a situation where you can control the call (e.g. the script is only ever called via a specific link) you can probably just use the basic principle (which is the sysnative file system redirector) directly in your shortcut.

Related Question