Windows中的多个shell命令

geo*_*ory 6 r

我正在尝试在R中复制一个shell命令,并且无法弄清楚如何将命令串在一起.这只返回工作文件夹的内容(system()由于某种原因失败):

> shell("dir")
 Volume info ..
 Directory of E:\Documents\R
 contents are listed..
Run Code Online (Sandbox Code Playgroud)

现在让我们尝试导航到C盘并运行dir(不使用明显的dir C:)..

> shell("cd C:")
C:\
> shell("dir")
 Volume in drive E is GT
 etc..
Run Code Online (Sandbox Code Playgroud)

所以似乎命令不能单独输入,因为shell不记得工作目录.所以..

> (cmd = "cd C:
+ dir")
[1] "cd C:\ndir"
> shell(cmd)
C:\
Run Code Online (Sandbox Code Playgroud)

没有运气,因为没有报告C:文件夹.我尝试过的其他方法也失败了.感谢任何想法.

Kon*_*lph 5

该文档解释了为什么system\xe2\x80\x99 不起作用:它直接在 Windows 上执行命令,而不先生成 shell。

\n\n

shell(或者更好,system2)是要走的路,但正如您\xe2\x80\x99所注意到的那样,shell总是会生成一个新的shell,以便对环境的更改不会继续\xe2\x80\x99。system2不会直接工作,因为它引用了它的命令(因此不允许命令链接)。

\n\n

在这种情况下,正确的解决方案是不要使用 shell 命令来更改目录。使用setwd

\n\n
setwd(\'C:\')\nsystem2(\'dir\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果要在执行命令后重置工作目录,请使用以下命令:

\n\n
local({\n    oldwd = getwd()\n    on.exit(setwd(oldwd))\n    setwd(\'C:\')\n    system2(\'dir\')\n})\n
Run Code Online (Sandbox Code Playgroud)\n


Mar*_*nov 4

我在 Linux 上,这对我有用:

system("cd ..;ls")
Run Code Online (Sandbox Code Playgroud)

导航到上一个目录并在那里运行 ls/dir 。就您而言,在 Windows 上,这显然有效:

shell("cd C: & dir")
Run Code Online (Sandbox Code Playgroud)

或获取字符向量输出:

shell("cd C: & dir", intern=T)在 Linux 上:system("cd ..; ls", intern=T)