从R向PowerShell传递含&的字符串时的转义问题
解决R构造URL传递给PowerShell的转义问题
你的问题核心是手动给URL里的&加引号导致的转义冲突,R的字符串转义规则和PowerShell的解析规则不匹配,最终引发执行报错。下面给你几个靠谱的解决思路和代码示例:
方案1:用shQuote自动处理引号转义
先构造正常的URL(不要给&加多余引号),再用R的shQuote()函数给URL和输出路径加上符合Windows PowerShell要求的引号,它会自动处理转义问题:
filename <- "test" directory <- "somedir" # 构造标准URL,&直接作为参数分隔符使用 url <- paste0( "http://www.host.com/cgi-bin/something.pl?file=", filename, "&argument=on&argument2=on&dir=", directory ) # 用shQuote处理参数,自动生成PowerShell能识别的带引号格式 ps_command <- paste0( "powershell Invoke-WebRequest ", shQuote(url), " -outfile ", shQuote("C:\\Windows\\temp\\test.dat") ) # 执行命令 system(ps_command)
shQuote()会根据当前系统自动选择引号类型(Windows下用双引号),并转义字符串内部的特殊字符,确保PowerShell能把整个URL当成一个完整参数,不会把&解析成命令分隔符。
方案2:用专业工具构造URL(更推荐)
手动拼接URL容易出错,尤其是参数里有特殊字符时。可以用httr包的modify_url()函数规范生成URL,它会自动处理参数编码和格式:
library(httr) filename <- "test" directory <- "somedir" # 规范构造URL,query参数自动拼接成正确格式 url <- modify_url( url = "http://www.host.com/cgi-bin/something.pl", query = list( file = filename, argument = "on", argument2 = "on", dir = directory ) ) # 同样用shQuote处理后执行命令 ps_command <- paste0( "powershell Invoke-WebRequest ", shQuote(url), " -outfile ", shQuote("C:\\Windows\\temp\\test.dat") ) system(ps_command)
这种方法不仅能避免&的转义问题,还能自动处理参数中的特殊字符(比如空格、中文等),让URL更规范可靠。
原代码出错的原因
你手动给&加了"&",导致R生成的字符串里包含转义的双引号(比如\"&\")。传递给PowerShell时,这些转义反斜杠会被当成字符串的一部分,PowerShell无法正确解析URL结构,自然报错。而cat()输出时会忽略R的字符串转义标记,所以看起来正常,但实际传递给外部命令时这些转义是真实存在的。
内容的提问来源于stack exchange,提问作者GrauBernden




