Как лучше всего вызвать 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-битной системе.
Пока вы придерживаетесь этих переменных, вам не нужно беспокоиться о поддержке двух разных версий ваших скриптов или о том, на какой платформе работает целевой компьютер.