使用 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.exe
和wscript.exe
),脚本运行时默认为平台原生版本。这是一个好消息,因为这意味着您可以自己处理平台差异,而不必担心 64 位机器上 32 位模拟环境中 WSH 的外部行为。如果您真的想要依赖该行为,您可以手动调用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
请注意,上述代码首先使用 shell 环境变量来设置平台和 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 位系统上进行评估。
只要您坚持这些变量,您就不必担心维护脚本的两个不同版本,或者目标计算机运行的平台。