如何在 32 位和 64 位 Windows 上通过 VBScript 运行 32 位应用程序?

如何在 32 位和 64 位 Windows 上通过 VBScript 运行 32 位应用程序?

使用 VBScript 中的 Shell.Run 调用 32 位命令的最佳方法是什么,以便它可以在 Windows 32 位和 64 位操作系统上成功执行?

在 64 位上,应用程序终止,因为它不是 64 位进程。虽然我可以使用 c:\windows\syswow64\cscript.exe myscript.vbs,但这无法移植到 Windows 32 位。

答案1

我无法在我的系统上重现您描述的问题。如果我编写一个 VBScript 来使用 Shell.Run 调用 %windir%\syswow64 中的 32 位版本的记事本,尽管脚本主机是 64 位的,而记事本是 32 位的,它仍然可以正常工作。

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

您尝试调用哪个 32 位命令但失败了?

答案2

我意识到这个问题已经很老了,但我还是要发布一个答案,因为我对此有一些具体的、相关的知识,而且它对未来的谷歌员工很有用(这就是我遇到它的方式)。

Microsoft 在 64 位系统上提供 32 位和 64 位版本的 Windows Script Host(cscript.exewscript.exe),脚本运行时默认为平台原生版本。这是一个好消息,因为这意味着您可以自己处理平台差异,而不必担心 64 位机器上 32 位模拟环境中 WSH 的外部行为。如果您真的要依赖该行为,您可以手动调用cscriptwscript\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

请注意,上述代码首先使用 shell 环境变量来设置平台和 64 位路径。这是因为这些变量对于每个版本的 Windows 都是通用的,但 x86 特定的变量仅在 64 位系统上定义(在我看来,这是倒退的)。

在脚本开头使用此代码可使脚本在平台之间完全可移植。您可以使用strProgramFilesX86/64strSystem32X86/64变量来控制您自己的代码的行为,并且无论您的脚本在哪个平台上运行,它们始终会映射到正确的位置。

举例来说,如果您使用objShell.Run()启动某个您知道是 32 位的软件,您始终可以使用objShell.Run(strProgramFilesX86 & "\MyApp\App.exe"),它将在Program Files (x86)64 位系统和\Program Files32 位系统上正确运行。

strPlatform如果您需要在一个平台上发生与另一个平台上不同的情况,也可以使用变量。例如,当我进行软件安装时,我同时拥有 32 位和 64 位版本的软件。我将 32 位版本重命名为-x86文件名末尾带有 ,-x6464 位版本也是如此。这样,我可以用一行代码调用安装程序,而不必关心它是什么平台,如下所示:

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

setup-x64.exe这将在 64 位系统和setup-x86.exe32 位系统上进行评估。

只要您坚持这些变量,您就不必担心维护脚本的两个不同版本,或者目标计算机运行的平台。

相关内容