
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.