shQuote() 会破坏 system() 命令而不是转义空格

问题描述 投票:0回答:1

我正在 R 脚本内运行 GCMS 软件 AMDIS 来分析 GCMS 数据。基本语法是:

system("AMDIS_PATH GCMS_FILE_PATH /S /GC /GE /E"

“/S /GC /GE /E”指的是 AMDIS 程序中的功能。

我想让代码“万无一失”,所以我允许路径带有“/”而不是“\”。我还允许路径中存在空格,用

shQuote(..., type = "cmd")

转义它们

这意味着完整的代码如下

system(paste(shQuote(gsub("/", "\\", AMDIS_PATH, fixed = T), type = 'cmd'), shQuote(gsub("/", "\\", GCMS_FILE_PATH, fixed = T), type = 'cmd'), "/S /GD /GS /E"))

这段代码不起作用(输出= 65535),但有一个问题:

如果我从 GCMS_FILE_PATH 中删除 shQuotes。然后一切都会正常工作(只要 FILE_PATH 不包含任何空格)。 所以执行这样的代码确实有效:

system(paste(shQuote(gsub("/", "\\", AMDIS_PATH, fixed = T), type = 'cmd'), gsub("/", "\\", GCMS_FILE_PATH, fixed = T), "/S /GD /GS /E"))

知道为什么 shQuote 对于 AMDIS_PATH 工作得很好,但对于 GCMS_FILE_PATH 却不行吗?我如何运行我的代码并仍然转义 GCMS_FILE_PATH 中的空格?

r escaping
1个回答
0
投票

如果没有可重现的示例,很难说出这里发生了什么,但请注意

?system
说:

在 Windows 上,系统不使用 shell,并且有一个单独的功能 shell 将命令行传递给 shell。

因此使用

type = 'cmd'
可能 进行转义可能根本不合适,请考虑使用
system2
代替。

您的问题可能在于您期望

system
做什么,或者您期望
shQuote
做什么。您可以通过将
system
替换为
cat
来轻松理清这两者以进行调试。

© www.soinside.com 2019 - 2024. All rights reserved.