我想通过一个Rscript.exe通过一个Start-Process-cmdlet调用一些R代码.为此,将一个powershell变量作为-e参数提供给Rscript,以便计算代码。
复制步骤
假设Powershell是在R-安装的bin-Folder中打开的,我可以将代码作为参数传递:
$code = "print('Nospaces');Sys.sleep(12)"
Start-Process .\Rscript.exe -ArgumentList "-e", $code但是如果代码包含任何空格,Rscript将触发unexpected end of input-Error:
$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,它就会工作。
.\Rscript.exe -e $code问题
是否有一种方法通过启动进程并仍然能够使用$code-Variable中包含空格的代码来调用Rscript?
我想通过Start-Process调用它,以便在执行RScript时不阻塞Powershell脚本。
发布于 2021-09-08 16:49:11
RScript.exe 是一个 console 应用程序,与任何shell一样,调用此类应用程序的最佳方法是直接调用E 212--不需要Start-Process (有关更多信息,请参见这个答案 ):
$code = "print('With spaces');Sys.sleep(12)"
.\Rscript.exe -e $code$code值的双引用,这取决于该值是否包含空格或注释。&是直接调用所必需的,即如果可执行名称或路径被引用和/或包含可变引用(例如& $rscriptPath ...或& 'C:\path to\RScript.exe' ...),则需要直接调用。"警告:虽然在这种特殊情况下没有问题,即使是这样的直接调用,至少可以达到PowerShell 7.1,但是有嵌入字符的参数和参数E 243--参见这个答案获得更多信息时,可能会出现问题。
如果您要使用Start-Process (这里不建议使用),那么您还必须:
-Wait以确保同步执行--但请注意,您将无法(直接)捕获PowerShell调用中的输出。-ArgumentList,使用$code变量周围的嵌入式(转义)双引用。# Not advisable, but works in principle.
Start-Process -Wait .\Rscript.exe -ArgumentList "-e `"$code`""在理想的世界中,将参数单独传递给-AgumentList (正如您已经尝试过的那样)无疑更好(或者至少也应该起作用),但不幸的是,长期存在的臭虫更好地将所有参数编码在一个字符串中,如图所示--参见这个答案获得更多信息。
https://stackoverflow.com/questions/69102639
复制相似问题