从R中交互式运行多个Windows系统命令

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

[我正在尝试为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”示例进行此操作?如果我能弄清楚的话,我想我可以参加比赛了。

谢谢。

r windows session command-line
1个回答
0
投票

尝试这样的子流程包。

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')
© www.soinside.com 2019 - 2024. All rights reserved.