Примушуйте 64-бітний WScript запускати .vbs


2

Я намагаюся запустити сценарій .vbs під 64Bit. Коли я запускаю цей скрипт вручну, він буде виконуватись належним чином, але при запуску чимось іншим він буде працювати під 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, який я намагаюся виконати:

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"

1
Wscript в syswow64 буде 32-розрядною версією wscript. 64-розрядна версія знаходиться в Windows / system32. Я не бачу, чому це змінило б цей сценарій. Ви впевнені, що "щось інше", яке його виконує, має дозвіл на доступ до папки користувача? Чи є повідомлення про помилки, коли воно не працює?
Ƭᴇcʜιᴇ007

Ну насправді це не вдається, і це може бути проблема дозволу. У .bat, який я запускаю, працює файл. але також не спричинить помилку.
Кріс Нікол

Я оновив питання, щоб включити всі файли, які я намагаюся виконати
Chris Nicol

Можливо, закрийте SlickRun, знайдіть файл SlickRun.exe і встановіть його сумісність на "запуск як адміністратор", а потім спробуйте ще раз, оскільки це допоможе уникнути проблем з дозволом.
Ƭᴇcʜιᴇ007

У SlickRun є опція "Запустити як адміністратор", і я вибрав це. Я говорив із розробником за SlickRun, і він вважає, що це, мабуть, більше, ніж 64-бітне питання. Його пропозиція не спрацювала (запустіть сценарій через 64-бітну версію WScript). Однак я намагаюся побачити, чи зможу я запустити .bat в 64-бітній, щоб побачити, чи це працює
Кріс Нікол,

Відповіді:


1

Наступний код перевірить, чи є система 64Bit, і в цьому випадку закриє сценарій і повторно запустить його, примушуючи 64Bit Host, зателефонувавши йому безпосередньо зі сценарієм як параметр.

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

Таке вирішення гарантує, що сценарій запускається в 64Bit незалежно від того, хто його називає. Якщо у вас є ситуація, коли ви можете керувати викликом (наприклад, сценарій викликається тільки коли-небудь через певне посилання), ви, ймовірно, просто можете використовувати основний принцип (який є перенаправник системної файлової системи ) безпосередньо у вашому ярлику.


SysWOW64це 32-розрядна папка. System32це 64-розрядна версія
phuclv

Так, і це робиться, це перевірити, чи існує syswow64 wscript.exe (дуже брудна перевірка для 64-бітної системи), а потім замінить ім'я syswow64 на систематичне. Хоча system32 є 64-бітовою версією для 64-бітового процесу, це не стосується 32-бітного процесу. 32-бітний процес буде переспрямований, щоб система32 все-таки виявилася syswow64. Sysnative - це спосіб сказати 32-
бітовому
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.