首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果通过Powershell启动进程调用,RScript无法处理"-e“参数中的空格。

如果通过Powershell启动进程调用,RScript无法处理"-e“参数中的空格。
EN

Stack Overflow用户
提问于 2021-09-08 11:56:31
回答 1查看 73关注 0票数 2

我想通过一个Rscript.exe通过一个Start-Process-cmdlet调用一些R代码.为此,将一个powershell变量作为-e参数提供给Rscript,以便计算代码。

复制步骤

假设Powershell是在R-安装的bin-Folder中打开的,我可以将代码作为参数传递:

代码语言:javascript
复制
$code = "print('Nospaces');Sys.sleep(12)"
Start-Process .\Rscript.exe -ArgumentList "-e", $code

但是如果代码包含任何空格,Rscript将触发unexpected end of input-Error:

代码语言:javascript
复制
$code = "print('With spaces');Sys.sleep(12)"
Start-Process .\Rscript.exe -ArgumentList "-e", $code #it does not matter if code is in parenthesis or not
Start-Process .\Rscript.exe -ArgumentList "-e", "$code"

在本例中,空格位于print语句中,但hte空间可以设置在代码中的任何位置。

但是,如果我不通过Rscript.exe调用Start-Process,它就会工作。

代码语言:javascript
复制
.\Rscript.exe -e $code

问题

是否有一种方法通过启动进程并仍然能够使用$code-Variable中包含空格的代码来调用Rscript?

我想通过Start-Process调用它,以便在执行RScript时不阻塞Powershell脚本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-08 16:49:11

RScript.exe 是一个 console 应用程序,与任何shell一样,调用此类应用程序的最佳方法是直接调用E 212--不需要Start-Process (有关更多信息,请参见这个答案 ):

代码语言:javascript
复制
$code = "print('With spaces');Sys.sleep(12)"
.\Rscript.exe -e $code
  • PowerShell将根据需要自动处理$code值的双引用,这取决于该值是否包含空格或注释。
  • 作为旁白(这里不需要):在情境中,&是直接调用所必需的,即如果可执行名称或路径被引用和/或包含可变引用(例如& $rscriptPath ...& 'C:\path to\RScript.exe' ...),则需要直接调用。

"警告:虽然在这种特殊情况下没有问题,即使是这样的直接调用,至少可以达到PowerShell 7.1,但是有嵌入字符的参数和参数E 243--参见这个答案获得更多信息时,可能会出现问题。

如果您要使用Start-Process (这里不建议使用),那么您还必须:

  • 传递-Wait以确保同步执行--但请注意,您将无法(直接)捕获PowerShell调用中的输出。
  • 将所有参数作为一个字符串传递给-ArgumentList,使用$code变量周围的嵌入式(转义)双引用。
代码语言:javascript
复制
# Not advisable, but works in principle.
Start-Process -Wait .\Rscript.exe -ArgumentList "-e `"$code`""

在理想的世界中,将参数单独传递给-AgumentList (正如您已经尝试过的那样)无疑更好(或者至少也应该起作用),但不幸的是,长期存在的臭虫更好地将所有参数编码在一个字符串中,如图所示--参见这个答案获得更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69102639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档