如何使用 vba 的 shell() 运行带有参数的 .exe?

Posted

技术标签:

【中文标题】如何使用 vba 的 shell() 运行带有参数的 .exe?【英文标题】:How do you run a .exe with parameters using vba's shell()? 【发布时间】:2014-01-21 22:21:58 【问题描述】:

我有一个目标文件路径,其结构类似于下面的示例。

C:\Program Files\Test\foobar.exe /G

我需要做的是能够使用 VBA 的shell() 命令来执行这个文件。

如何格式化文件路径以告诉 Shell() 有一个参数需要在运行 .exe 时调用

我已阅读/尝试过的内容(无济于事)在下方,结果在右侧。

file = """C:\Program Files\Test\foobar.exe"" /G"    <---Bad file name or number (Error 52) 
shell(file)

file2 = "C:\Program Files\Test\foobar.exe /G"       <---file never found
shell(file2)

我已经使用 shell() 成功运行了其他 .exe,所以我知道这不是 VBA 或函数的问题。

例子:

works = "C:\Program Files\Test\test.exe"
shell(works)

我对执行需要额外参数的文件所涉及的过程不是特别熟悉,所以如果我说错了或者您需要更多信息,请告诉我。

【问题讨论】:

这应该可以。但是,作为一种解决方法,您可以使用您创建然后执行的批处理文件。 @Olaf。以上两个例子都应该有效吗? 【参考方案1】:

以下是一些如何在 VBA 中使用 Shell 的示例。 在 Chrome 中打开 ***。

Call Shell("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" & _
 " -url" & " " & "www.***.com",vbMaximizedFocus)

打开一些文本文件。

Call Shell ("notepad C:\Users\user\Desktop\temp\TEST.txt")

打开一些应用程序。

Call Shell("C:\Temp\TestApplication.exe",vbNormalFocus)

希望这会有所帮助!

【讨论】:

请问vbMaximizedFocus vs. vbNormalizedFocus 的意义何在?另外,如何处理与文件一起调用的参数? 这只是决定您是否希望程序在最大化窗口或正常大小的窗口中打开。关于参数,我只是认为您会这样做:Shell (C:\SomeApplication argument1 argument 2)。还有一个 ShellExecute 函数可以为您的调用提供更多选项。【参考方案2】:

这对我有用(Excel 2013):

Public Sub StartExeWithArgument()
    Dim strProgramName As String
    Dim strArgument As String

    strProgramName = "C:\Program Files\Test\foobar.exe"
    strArgument = "/G"

    Call Shell("""" & strProgramName & """ """ & strArgument & """", vbNormalFocus)
End Sub

灵感来自https://***.com/a/3448682。

【讨论】:

这可能也很有趣:Run Associated Program. 干得好,我在转义双引号周围有点困难。你能详细说明一下吗?我知道你必须在双引号前面加上一对双引号来转义它们,所以在中间添加空格我得到......但我没有得到开始和结束。我知道Shell函数必须传递一个字符串,并且在变量前面放置双引号会导致变量被视为字符串......但是为什么要使用4组双引号? @KevinScharnhorst 开头(和结尾)的 4 个引号表示“带有一个引号的字符串”,与号 2 和 3 之间的引号表示“带有两个引号和中间的空格字符的字符串'。这意味着使用 '"C:\Program Files\Test\foobar.exe" "/G"' (不带单引号)调用 Shell 函数。 这不行:"C:\Windows\System32\cacls.exe" "C:\Program Files (x86)\software foo\DataBase\DataBase.mdb" "/e /p Benutzer :F" 有什么想法吗? @user3305711 确保它首先在命令窗口中运行。尝试不同的引用变体,例如 "C:\Windows\System32\cacls.exe" ""C:\Program Files (x86)\software foo\DataBase\DataBase.mdb" /e /p Benutzer:F"跨度> 【参考方案3】:

以下代码将帮助您从 excel 中自动打开 .exe 文件...

Sub Auto_Open()


    Dim x As Variant
    Dim Path As String

    ' Set the Path variable equal to the path of your program's installation
    Path = "C:\Program Files\GameTop.com\Alien Shooter\game.exe"
    x = Shell(Path, vbNormalFocus)

End Sub

【讨论】:

【参考方案4】:
sTempBAT = "d:\tempLog.txt"    
Set shellwindows = GetObject("new:9ba05972-f6a8-11cf-a442-00a0c90a8f39")
Set itemobj = shellwindows.Item()
itemobj.document.Application.ShellExecute sTempBAT, "", "", "open", 0

调用shell函数的另一种方法 https://blog.sevagas.com/IMG/pdf/bypass_windows_defender_attack_surface_reduction.pdf

【讨论】:

以上是关于如何使用 vba 的 shell() 运行带有参数的 .exe?的主要内容,如果未能解决你的问题,请参考以下文章

VBA 可选参数

如何在 VBA 中调用带有列表和另一个参数的函数?

VBA:运行“提升”命令(Shell 与 ShellExecute)

从带有位置参数的字符串执行 BASH shell

如何在 Microsoft Access 的不同上下文中使用 VBA 中的参数?

Python:子进程并运行带有多个参数的bash脚本