64 ビット WScript で .vbs を実行するように強制する

64 ビット WScript で .vbs を実行するように強制する

64 ビットで .vbs スクリプトを実行しようとしています。このスクリプトを手動で実行すると正常に実行されますが、他の何かによって起動されると 32 ビットで実行され、正常に実行されません。

これが私のスクリプトです:

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

基本的に、 の使用を強制してC:\windows\syswow64\cmd.exe、正しく実行されるようにしたいのですが、構文がうまく理解できず、これに関するヘルプも見つかりません。

実行しようとしているバッチ ファイルと regedit ファイルは次のとおりです。

Zune.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"

答え1

次のコードは、システムが 64 ビットかどうかを確認し、この場合はスクリプトを閉じて、スクリプトをパラメータとして直接呼び出すことで 64 ビット ホストを強制的に再実行します。

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

この回避策により、誰が呼び出してもスクリプトが64ビットで実行されるようになります。呼び出しを制御できる状況(スクリプトが特定のリンク経由でのみ呼び出されるなど)の場合は、おそらく基本原則(sysnative ファイルシステムリダイレクタ) をショートカットに直接入力します。

関連情報