【发布时间】: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