我需要使用 WScript.Shell 从 VBA 调用脚本 (R)。文件的路径包含空格。此外,还会将一系列参数传递给脚本,其中一些参数还包含空格。
我已经尝试了所有可以想到的路径、参数甚至整个字符串的引号和双引号的组合(特别是这里)。当需要传递参数时,似乎没有任何效果(我要么在命令行中收到“C:\Program”无法识别”或“无效语法”错误)。
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 上。
如何运行路径和要传递的参数中都带有空格的命令行脚本?非常感谢任何帮助!
Update:
如果从命令字符串中删除前缀“cmd.exe /K”,则该代码将起作用。但是,为了测试和调试,我想在脚本运行后保持 shell 窗口打开。如何才能实现这一目标?
I used to run scripts and pass arguments from Excel, this code works for me.
为了运行脚本,首先指定 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])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)