首页 > 解决方案 > 在 R 中以交互方式运行多个 Windows 系统命令

问题描述

我正在尝试为 Windows 10 构建一个 R 包,它允许我使用 PuTTY 的安全文件传输协议 (SFTP) 客户端、从 R 控制台中的PSFTP来回传输文件到 SFTP 服务器(是的,我意识到还有其他软件包可以进行 SFTP 传输,但我真的很想开发它以专门用于 PSFTP)。我想如果我能简单地克服一个我不知道如何在 R 中实现的障碍,我就可以完成这项工作。有没有一种方法可以调用 windows 系统命令并将其作为某种会话启动,这样我就可以继续在 R 中以交互方式使用它?我本质上只是想从 R 控制台获取命令并将它们传递到同一个 Windows 命令行窗口,在前面的命令之后执行一个命令。

一个简单的玩具示例将帮助我解释我正在尝试做的事情。假设我必须在 R 中逐行执行多个 Windows 系统命令,例如使用cd ..将目录更改回一级,然后使用dir. 我可以试试这个:

system("cmd.exe", input="cd ..")
system("cmd.exe", input="dir")

显然这不会按我想要的方式工作,因为当我执行第二行时,在 Windows 系统上执行的第一行代码没有“内存”。我想要的是在 R 中以某种方式创建类似上面的代码,这样它就相当于我从单个 cmd 窗口运行命令提示符并一一键入以下命令:

cd ..
dir

最后,我希望能够创建一个 Windows 会话——有点像rvest包的工作方式。在rvest中,用户可以创建一个会话,然后按顺序向会话发送命令,每个后续命令都会从会话中最后一个命令停止的位置开始:

library(rvest)
session <- html_session("http://hadley.nz")
jump_to(session, "hadley-wickham.jpg")  #this continues with the session via first argument

我基本上想实现与此相同的概念,我的后续行从前面的行继续。这可能吗?我将如何使用上面的“cd ..”、“dir”示例来执行此操作?如果我能弄清楚这一点,我想我要去参加比赛了。

谢谢。

标签: rwindowssessioncommand-line

解决方案


试试这样的子流程包。

library(subprocess)

handle <- spawn_process("C:\\Windows\\System32\\cmd.exe")
Sys.sleep(1)

process_read(handle, PIPE_STDOUT, timeout = 1000)
process_read(handle, PIPE_STDERR)

process_write(handle, "cd ..\n")
process_write(handle, "dir\n")

process_read(handle, PIPE_STDOUT, timeout = 1000)
process_read(handle, PIPE_STDERR)

process_write(handle, 'exit\n')

其他套餐

您还可以查看 ps 包和 processx 包(使用 ps)。


推荐阅读