Синхронно запускайте команду оболочки из VBA, показывая и захватывая выходные данные - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу запустить скрипт R из VBA, для которого я использую rscript.exe.Я также передал этому сценарию 2 аргумента.Выполнение должно выполняться синхронно , и оба вывода должны отображаться live и сохраняться в лог-файле .

Пока я могусоздайте команду, используйте модуль cpearson shellAndwait, чтобы запустить ее из VBA синхронно (VBA ожидает выполнения команды оболочки, прежде чем продолжить) и получить вывод в реальном времени в симпатичном окне приглашения cmd.

batchCommand =   Chr(34) & r_location & Chr(34) & _
                 " --verbose " & _
                 Chr(34) & fp_rscript & Chr(34) & _
                 " " & Chr(34) & arg1 & Chr(34) & _
                 " " & Chr(34) & arg2 & Chr(34)  
errorcode = ShellAndWait (batchCommand, 0, vbMaximizedFocus, AbandonWait)

Однако, если мой R-скрипт завершается неудачно, errorcode по-прежнему равен 0, и единственный способ получить выходные данные - это вставить batchCommand в приглашение cmd

Добавление cmd / K и перенос всего во второй набор «не вариант,поскольку shellandwait будет ждать, пока пользователь закроет приглашение cmd вручную.

Поэтому я хотел бы, чтобы вывод был записан в текстовый файл, для которого я нашел это решение с использованием powershell & tee.

Однако мой новый batchCommand, использующий powershell, не работает.

batchCommand =   "powershell.exe " & _
                    Chr(34) & r_location & Chr(34) & _
                   " --verbose " & _
                   Chr(34) & fp_rscript & Chr(34) & _
                   " " & Chr(34) & fp_rscript & Chr(34) & _
                   " " & Chr(34) & arg2 & Chr(34) & _
                   " | tee " & Chr(34) & logfile & Chr(34)

batchCommand выглядит так:

?batchCommand 
powershell.exe "C:\Users\...\bin\RScript.exe" --verbose "E:\...\stage_2\antares_model_builder_stage_2.R" "E:\...\stage_2\antares_model_builder_stage_2.R" "E:\...\2018-09-28-1232 srv6_19-20_basecase" | tee "E:\...\2018-09-28-1232 srv6_19-20_basecase\s2_rscript_logfile.txt" 

Как указано в комЯ больше не могу вводить эту batchCommand в cmd, поскольку она пытается интерпретировать тройник.

"'tee" не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл. "

Вставка команды в powershell дает:

Неустранимая ошибка: невозможно открыть файл 'E: \ SRV6 \ vanilla_hybrid \ 030': такого файла или каталога нет

Так что это связано с пробелами в путях.Добавление "" arround всех аргументов после powershell.exe дает ту же ошибку.Однако использование '&' работает:

& "C:\Users\hgd253\appdata\Local\Microsoft\AppV\Client\Integration\5A67571D-6F50-4EAD-BB33-A0D712D7FC6A\Root\R\R-3.3.3\bin\RScript.exe" --verbose "E:\SRV6\vanilla_hybrid\030 scripts\libraries\stage_2\antares_model_builder_stage_2.R" "E:\SRV6\vanilla_hybrid\030 scripts\libraries\stage_2\antares_model_builder_stage_2.R" "E:\SRV6\vanilla_hybrid\100 input buffer\2018-09-28-1337 srv6_19-20_basecase"

Теперь возникает вопрос, как передать эту строку в качестве аргумента в powershell -command?В файлах справки указано

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

Чтобы написать строку, запускающую команду Windows PowerShell, используйте формат: «& {}», где кавычки указывают строку, а оператор invoke (&) вызывает выполнение команды.

Итак, я попробую еще раз:

powershell -command "& {"C:\Users\hgd253\appdata\Local\Microsoft\AppV\Client\Integration\5A67571D-6F50-4EAD-BB33-A0D712D7FC6A\Root\R\R-3.3.3\bin\RScript.exe" --verbose "E:\SRV6\vanilla_hybrid\030 scripts\libraries\stage_2\antares_model_builder_stage_2.R" "E:\SRV6\vanilla_hybrid\030 scripts\libraries\stage_2\antares_model_builder_stage_2.R" "E:\SRV6\vanilla_hybrid\100 input buffer\2018-09-28-1337 srv6_19-20_basecase"}"
Fatal error: cannot open file 'E:\SRV6\vanilla_hybrid\030': No such file or directory

Может ли кто-нибудь помочь мне выполнить это последнее требование (записать вывод в файл журнала)?

1 Ответ

0 голосов
/ 28 сентября 2018

Нашел решение.Необходима комбинация 'и'. Команда batch должна выглядеть следующим образом:

?batchCommand
powershell.exe -command "& 'C:\Users\hgd253\appdata\Local\Microsoft\AppV\Client\Integration\5A67571D-6F50-4EAD-BB33-A0D712D7FC6A\Root\R\R-3.3.3\bin\RScript.exe' --verbose 'E:\SRV6\vanilla_hybrid\030 scripts\libraries\stage_2\antares_model_builder_stage_2.R' 'E:\SRV6\vanilla_hybrid\030 scripts\libraries\stage_2\antares_model_builder_stage_2.R' 'E:\SRV6\vanilla_hybrid\100 input buffer\2018-09-28-1337 srv6_19-20_basecase' | tee 'E:\SRV6\vanilla_hybrid\100 input buffer\2018-09-28-1337 srv6_19-20_basecase\s2_rscript_logfile.txt'"

Код VBA, таким образом, становится:

batchCommand = "powershell.exe -command " & _
               Chr(34) & "& " & _
               Chr(39) & r_location & Chr(39) & _
               " --verbose " & _
               Chr(39) & fp_rscript & Chr(39) & _
               " " & Chr(39) & fp_rscript & Chr(39) & _
               " " & Chr(39) & arg2 & Chr(39) & _
               " | tee " & _
               Chr(39) & logfile & Chr(39) & Chr(34)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...