【问题标题】:How do you run a .exe with parameters using vba's shell()?如何使用 vba 的 shell() 运行带有参数的 .exe?
【发布时间】: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。以上两个例子都应该有效吗?

标签: excel vba shell parameters command-line-arguments


【解决方案1】:

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

Call Shell("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" & _
 " -url" & " " & "www.stackoverflow.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://stackoverflow.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

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2013-04-02
      • 2015-08-21
      • 1970-01-01
      • 2011-10-23
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多