r - 在 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”示例来执行此操作?如果我能弄清楚这一点,我想我要去参加比赛了。
谢谢。
解决方案
试试这样的子流程包。
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)。
推荐阅读
- amazon-web-services - Autoscaling Spot 队列无法向负载均衡器注册实例
- php - 雄辩的查询,检查电子邮件集合上的集合,以查找批准每封电子邮件的批准者,但并非所有人都具有approval_status
- sql - Postgres 索引在删除表上损坏
- c# - “无法执行脚本,因为脚本入口点无效”SSIS 中脚本任务中的错误
- python-3.x - DynamoDB 扫描未返回所需的输出
- java - 无法从 Naukri 网站的悬停菜单中单击选项
- vba - 我是否不正确地使用了 Columns() 属性,如果是,是否有一个好的解决方法?
- php - 在我的查看页面源代码中,有一个带有 00 16 的奇怪框导致我的图像不显示在 Facebook 共享中
- r - quanteda 转换为保留 docvars 的主题模型
- angularjs - AngularJS将数据插入JSON文件