Несколько команд оболочки в Windows

121
12

Я пытаюсь реплицировать команду оболочки в R и не могу понять, как сгруппировать команды вместе. Это просто возвращает содержимое рабочей папки (system() не работает по какой-либо причине):


> shell("dir")
Volume info ..
Directory of E:\Documents\R
contents are listed..

Теперь попробуйте и перейдите на диск C и запустите dir (без использования очевидного dir C:)..


> shell("cd C:")
C:\
> shell("dir")
Volume in drive E is GT
etc..

Итак, кажется, что команды нельзя вводить отдельно, поскольку оболочка не запоминает рабочий каталог. Так..


> (cmd = "cd C:
+ dir")
[1] "cd C:\ndir"
> shell(cmd)
C:\

Не повезло, поскольку папки C: не сообщаются. Другие методы, которые я пробовал, также терпят неудачу. Благодарен за любые идеи.

спросил(а) 2021-01-19T15:34:43+03:00 9 месяцев назад
1
Решение
102

В документации объясняется, почему system не работает: он выполняет команду непосредственно в Windows, не создавая сначала оболочку.


shell (или лучше, system2) - это путь, но, как вы заметили, shell всегда будет порождать новую оболочку, чтобы изменения в среде не переносятся. system2 не работает напрямую либо потому, что он цитирует свои команды (и, следовательно, не позволяет цепочки команд).


Решение правильное в этом контексте не должно использовать команду оболочки для изменения каталога. Вместо этого используйте setwd:

setwd('C:')
system2('dir')

Если вы хотите reset рабочий каталог после выполнения команды, используйте следующее:


local({
oldwd = getwd()
on.exit(setwd(oldwd))
setwd('C:')
system2('dir')
})

ответил(а) 2021-01-19T15:34:43+03:00 9 месяцев назад
79

Я нахожусь в Linux, и это работает для меня:


system("cd ..;ls")

при переходе к предыдущему каталогу и запуске ls/dir. В вашем случае в Windows это, по-видимому, работает:

shell("cd C: & dir")

или для получения вывода в виде символьного вектора:


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

ответил(а) 2021-01-19T15:34:43+03:00 9 месяцев назад
66

Не знаю, помогает ли это, но сбрасывание команд одной строкой при использовании system работает в MacOS


cmds <- c("ls", "cd ..", "ls");
system(paste(cmds, collapse=";"))

ответил(а) 2021-01-19T15:34:43+03:00 9 месяцев назад
46

Это решение из здесь. Это решило мою проблему при вызове команды windows dir:


system("cmd.exe /c dir", intern=TRUE) 

ответил(а) 2021-01-19T15:34:43+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема