Erzwingen Sie die Ausführung von .vbs durch 64-Bit-WScript

Erzwingen Sie die Ausführung von .vbs durch 64-Bit-WScript

Ich versuche, ein VBS-Skript unter 64 Bit auszuführen. Wenn ich dieses Skript manuell ausführe, wird es ordnungsgemäß ausgeführt. Wenn es jedoch von einem anderen Programm gestartet wird, läuft es unter 32 Bit und wird nicht ordnungsgemäß ausgeführt.

Hier ist mein Skript:

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

Im Grunde möchte ich die Verwendung von erzwingen C:\windows\syswow64\cmd.exe, damit es richtig ausgeführt wird. Ich scheine die Syntax nicht richtig hinzubekommen und kann keine Hilfe dazu finden.

Hier sind die Batchdatei und die Regedit-Datei, die ich auszuführen versuche:

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"

Antwort1

Der folgende Code überprüft, ob es sich um ein 64-Bit-System handelt. In diesem Fall wird das Skript geschlossen und erneut ausgeführt. Dabei wird der 64-Bit-Host erzwungen, indem dieser direkt mit dem Skript als Parameter aufgerufen wird.

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

Dieser Workaround stellt sicher, dass das Skript in 64Bit ausgeführt wird, egal wer es aufruft. Wenn Sie eine Situation haben, in der Sie den Aufruf steuern können (z. B. das Skript wird immer nur über einen bestimmten Link aufgerufen), können Sie wahrscheinlich einfach das Grundprinzip verwenden (das ist dassysnative Dateisystem-Umleitung) direkt in Ihrer Verknüpfung.

verwandte Informationen