在Windows上使用stdout=TRUE调用system2时嵌入的nul警告

在Windows上使用stdout=TRUE调用system2时嵌入的nul警告,r,system2,R,System2,尝试通过system2界面使用wmic检索当前流程命令行信息时: system2( command=“wmic”, args=paste0(“process where processid=,Sys.getpid(),“get commandline”), stdout=TRUE ) 我得到以下输出和警告: [1] "ÿþC" "" "" "" "" Warning messages: 1: In readLines(rf) : line 1 appears to co

尝试通过
system2
界面使用
wmic
检索当前流程命令行信息时:

system2(
command=“wmic”,
args=paste0(“process where processid=,Sys.getpid(),“get commandline”),
stdout=TRUE
)
我得到以下输出和警告:

[1] "ÿþC" ""    ""    ""    ""   
Warning messages:
1: In readLines(rf) : line 1 appears to contain an embedded nul
2: In readLines(rf) : line 2 appears to contain an embedded nul
3: In readLines(rf) : line 3 appears to contain an embedded nul
4: In readLines(rf) : line 4 appears to contain an embedded nul
5: In readLines(rf) : line 5 appears to contain an embedded nul
6: In readLines(rf) :
  incomplete final line found on '...\Temp\RtmpaWqnBy\file1284c476b1'
有趣的是,当使用
系统
获得相同的期望输出(当前进程的命令行信息)时,它似乎工作正常:

系统(
command=paste0(“wmic process where processid=,Sys.getpid(),“get commandline”),
实习生=正确
)
输出:

[1] "CommandLine                                                     \r"         "\"C:\\Program Files\\R\\R-3.6.2\\bin\\x64\\Rgui.exe\" --cd-to-userdocs  \r"
[3] "\r"  
另外,
system2
with
stdout=“
将输出打印到控制台:

system2(
command=“wmic”,
args=paste0(“process where processid=,Sys.getpid(),“get commandline”),
stdout=“”
)
我尝试以不同的方式将
args
参数指定给
system2
,但没有成功。 有人能解释一下这些警告吗?下面是一些
sessionInfo

  • R版本3.6.2(2019-12-12),在Windows 10 x64下运行
  • 平台:x86_64-w64-mingw32/x64(64位)
  • 地点:LC_COLLATE=English_ukin.1252
有关复制的一些详细信息:

  • 在活动的R会话中,此问题仅在RGui中对我显示,而不是在RStudio中或从命令提示符(cmd.exe)运行的R会话中
  • 当代码在启动时执行(例如通过.Rprofile)时,它同时显示在RGui和RStudio中,但不显示在从命令提示符(cmd.exe)创建的R进程中

您希望wmic返回什么?看起来您正在获取二进制数据,但正在尝试将其转换为字符串。对于该特定过程,它是:命令行“C:\Program Files\R\R-3.6.2\bin\x64\Rgui.exe”-cd to userdocs
system
返回正确,system2也可以正常工作-除非
stdout=TRUE
Hmm。我想知道它是否与。似乎您可以设置
stdout=“file.out”
并将数据发送到那里。但数据似乎被编码为UTF-16,这似乎是造成问题的原因。您不能只对该文件执行
readLines()
,而这正是
system2
试图执行的操作。您需要执行类似于读取行(file(“file.out”,encoding=“UTF-16”)的操作。我看到在
system2
代码中有一个对
.Platform$GUI==“Rgui”
的检查,所以可能是这个分支导致了问题,而不是导致了RStudio的问题?有趣的是,我在R3.6.3中遇到了这个问题,但在R3.5.2中没有,我看到
system2()
得到了重大的改进。另外,如果我
debug()
system2()
在记事本++或十六进制编辑器中查看tempfile,我发现该文件编码为“UCS-2 LE BOM”。转换文件并继续操作将得到所需的结果。所以,我说这是
system2()
中的一个bug:它创建了一个实际上无法读取的文件。一个补丁是将
readLines()
调用替换为
readLines(file(rf,encoding=“UCS-2LE”)
,但这通常可能(将?)不起作用。
CommandLine                                                     

"C:\Program Files\R\R-3.6.2\bin\x64\Rgui.exe" --cd-to-userdocs