Назад | Перейти на главную страницу

Как запустить 32-битное приложение из VBScript как в 32-битной, так и в 64-битной Windows?

Как лучше всего вызвать 32-разрядную команду с помощью Shell.Run в VBScript, чтобы она работала как в 32-разрядных, так и в 64-разрядных операционных системах Windows?

В 64-разрядной версии приложение завершается, потому что это не 64-разрядный процесс. Хотя я мог бы использовать c: \ windows \ syswow64 \ cscript.exe myscript.vbs, он не переносится на 32-разрядную версию Windows.

Я не могу воспроизвести описываемую вами проблему в моей системе. Если я напишу VBScript для вызова 32-разрядной версии Блокнота в% windir% \ syswow64 с помощью Shell.Run, он будет работать нормально, несмотря на то, что хост сценариев 64-разрядный, а Блокнот 32-разрядный.

Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run "%windir%\syswow64\notepad.exe"

Какую 32-битную команду вы пытаетесь вызвать, но она не работает?

Я понимаю, что этот вопрос старый, но я все равно отправляю на него ответ, потому что у меня есть некоторые конкретные, актуальные знания об этом, и он полезен для будущих гуглеров (вот как я с этим столкнулся).

Microsoft предоставляет как 32-битные, так и 64-битные версии Windows Script Host (cscript.exe и wscript.exe) в 64-битной системе, при этом по умолчанию при запуске скрипта используется собственная версия платформы. Это хорошая новость, потому что это означает, что вы можете справиться с различиями платформ самостоятельно, не беспокоясь о внешнем поведении WSH в 32-битной эмулируемой среде на 64-битной машине. Если вы на самом деле хотеть чтобы полагаться на это поведение, вы можете вручную вызвать cscript или wscript из \SysWOW64 каталог, но обычно предпочтительнее использовать собственную версию и устранять различия платформ в собственном коде.

Я всегда начинаю каждый VBScript, который пишу, следующим:

Option Explicit    'I always use this to avoid spelling errors in var names; Just my personal preference

Dim objShell :Set objShell = CreateObject("WScript.Shell")
Dim objFS :Set objFS = CreateObject("Scripting.FileSystemObject")

'Determine OS platform
Dim strPlatform :strPlatform = objShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")
If strPlatform = "AMD64" Then strPlatform = "x64"

'Set 32-bit and 64-bit filesystem paths
Dim strProgramFilesX64    'Will always be "\Program Files", regardless of platform
Dim strProgramFilesX86    'Will be "\Program Files (x86)" on 64-bit, otherwise "\Program Files" on 32-bit
Dim strSystem32X64    'Will always be "\Windows\System32", regardless of platform
Dim strSystem32X86    'Will be "\Windows\SysWOW64" on 64-bit, otherwise "\Windows\System32" on 32-bit

strProgramFilesX64 = objShell.ExpandEnvironmentStrings("%ProgramFiles%")
strSystem32X64 = objShell.ExpandEnvironmentStrings("%SystemRoot%") & "\System32"
If strPlatform = "x64" Then
    strProgramFilesX86 = objShell.ExpandEnvironmentStrings("%ProgramFiles(x86)%")
    strSystem32X86 = objShell.ExpandEnvironmentStrings("%SystemRoot%") & "\SysWOW64"
Else
    strProgramFilesX86 = strProgramFilesX64
    strSystem32X86 = strSystem32X64
End If

Обратите внимание, что в приведенном выше коде используются переменные среды оболочки, чтобы сначала установить платформу и 64-разрядные пути. Это связано с тем, что эти переменные являются общими для каждой версии Windows, но специфичные для x86 определены только в 64-битных системах (что, на мой взгляд, наоборот).

Использование этого кода в начале ваших скриптов делает их полностью переносимыми между платформами. Вы можете контролировать поведение своего собственного кода, используя strProgramFilesX86/64 и strSystem32X86/64 переменные, и они всегда будут сопоставляться с правильными местоположениями, независимо от того, на какой платформе работает ваш скрипт.

Так, например, если вы используете objShell.Run() чтобы запустить что-то, что, как вы знаете, является 32-битным программным обеспечением, вы всегда можете использовать objShell.Run(strProgramFilesX86 & "\MyApp\App.exe"), и он будет правильно работать с Program Files (x86) в 64-битных системах и \Program Files в 32-битных системах.

Вы также можете использовать strPlatform переменная, если вам нужно, чтобы на одной платформе произошло нечто иное. Например, когда я устанавливаю программное обеспечение, и у меня есть как 32-разрядная, так и 64-разрядная версия программного обеспечения. Я переименовал 32-битную версию в -x86 в конце имени файла, а также -x64 с 64-битной версией. Таким образом, я могу вызвать установщик с помощью одной строчки кода, не заботясь о том, какая это платформа, например:

objShell.Run "setup-" & strPlatform & ".exe"

Это будет оценивать setup-x64.exe в 64-битной системе и setup-x86.exe в 32-битной системе.

Пока вы придерживаетесь этих переменных, вам не нужно беспокоиться о поддержке двух разных версий ваших скриптов или о том, на какой платформе работает целевой компьютер.