【问题标题】:WScript.Shell to run a script with spaces in path and arguments from VBAWScript.Shell 运行一个脚本,在路径中包含空格和来自 VBA 的参数
【发布时间】:2018-09-14 02:38:18
【问题描述】:

我需要使用 WScript.Shell 从 VBA 调用脚本 (R)。文件路径包含空格。此外,还会向脚本传递一系列参数,其中有几个还包含空格。

我已经尝试了所有可以想到的路径、参数甚至整个字符串周围的引号和双引号组合(特别是this here)。当需要传递参数时似乎没有任何效果(我要么在命令行中得到“C:\Program”不识别“-或“invalid-syntax”-错误)。

Option Explicit
Private Const QUOTE As String = """"

Sub test()
    Dim WS_Shell As Object
    Set WS_Shell = VBA.CreateObject("WScript.Shell")
    Dim err_code As Long

    Dim path As String
    Dim arg_1 As String
    Dim arg_2_with_spaces As String

    Dim complete_cmd_str As String

    path = "C:\Program Files\R\R-3.3.2\bin\Rscript.exe"
    arg_1 = "F:\path\to\my\script.R"
    arg_2_with_spaces = "A string-arg with spaces"

    complete_cmd_str = "cmd.exe /K " & QUOTE & path & QUOTE & " " _
                    & QUOTE & arg_1 & QUOTE & " " _
                    & QUOTE & arg_2_with_spaces & QUOTE

    Debug.Print complete_cmd_str
    err_code = WS_Shell.Run(complete_cmd_str, vbMinimizedNoFocus, True)
End Sub

所有这些都发生在 Windows 7 上。

如何运行在路径和要传递的参数中有空格的命令行脚本?非常感谢任何帮助!

更新:

如果从命令字符串中删除前缀“cmd.exe /K”,则代码有效。但是,为了测试和调试,我想在脚本运行后保持 shell 窗口打开。如何实现?

【问题讨论】:

  • 您应该将要在变量中执行的字符串连接起来,并确保在所有带有spaces 的字符串周围添加"""" 可以添加可见的"
  • @FloLie 我已经做到了。我调整了代码以使其清晰。在打印输出中,命令的所有 3 个部分都用引号括起来,就像直接在 shell 中所做的那样。但是,这仍然不起作用(“C:\Program 无法识别”)。
  • 您可以尝试将 Chr(34) 分配给 QUOTE 变量。但是...如果您输入整个内容。从字面上看,没有变量,它会运行吗?首先弄清楚,然后尝试分解它......
  • @Cindy Meister 将整个命令直接输入到打开的 shell 窗口中即可。使用文字字符串执行 WS_Shell.Run 不会。使用路径调用 .Run 并且没有或只有未引用的参数也可以。但是,我需要能够传递包含空格的参数。

标签: vba shell command-line rscript


【解决方案1】:

我曾经运行脚本并从 Excel 传递参数,这段代码对我有用。

为了运行脚本非常重要,你首先指定你的Rscript.exe的路径和你的R脚本(.r文件)的路径,然后你可以用空格传递参数。

Sub run_R()

    Dim shell As Object
    Set shell = VBA.CreateObject("WScript.Shell")
    Dim waitTillComplete As Boolean: waitTillComplete = True
    Dim style As Integer: style = 1
    Dim errorcode As Integer
    Dim path As String

    path = Chr(34) & "C:\R\R-3.4.0\bin\i386\Rscript.exe" & Chr(34) & " " & Chr(34) & "C:\Users\userexample\Desktop\accionable.r" & Chr(34) & " " & Chr(34) & "Argument 1" & Chr(34)

    errorcode = shell.Run(path, style, waitTillComplete)

End Sub

读取参数的R代码:

args = commandArgs(trailingOnly = T)
cat(args[1])

【讨论】:

  • 感谢您的回答。您的代码有效,并帮助我发现问题似乎是命令字符串的“cmd.exe /K”部分(请参阅问题的更新)。那么,如何在脚本运行后让 shell 窗口保持打开状态(用于测试/调试)?
  • 在 R 脚本的末尾使用 Sys.sleep(time) 停止关闭 shell 窗口,例如 Sys.sleep(60) 60 秒,如果您发现我的回答有帮助,请将其标记为可接受的答案! :)
猜你喜欢
  • 1970-01-01
  • 2018-07-20
  • 2021-08-28
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多