Запустите Rscript.exe с VBScript и пробелами в пути

У меня есть следующий скрипт run.vbs

Rexe           = "R-Portable\App\R-Portable\bin\Rscript.exe"
Ropts          = "--no-save --no-environ --no-init-file --no-restore --no-Rconsole "
RScriptFile    = "runShinyApp.R"
Outfile        = "ShinyApp.log"
startChrome    = "GoogleChromePortable\App\Chrome-bin\chrome.exe --app=http://127.0.0.1:9999"
strCommand     =  Rexe & " " & Ropts & " " & RScriptFile & " 1> " & Outfile & " 2>&1"

intWindowStyle = 0   ' Hide the window and activate another window.'
bWaitOnReturn  = False ' continue running script after launching R   '

' the following is a Sub call, so no parentheses around arguments'

CreateObject("Wscript.Shell").Run strCommand, intWindowStyle, bWaitOnReturn
WScript.Sleep 1000
CreateObject("Wscript.Shell").Run startChrome, intWindowStyle, bWaitOnReturn

В большинстве случаев он работает довольно хорошо, за исключением случаев, когда пользователь помещает скрипт run.vbs в папку с пробелами в имени: например. если run.vbs находится в папке "foo bar", пользователь получает сообщение об ошибке: "C:\Users\[имя пользователя]\Desktop\foo" не распознается как внутренняя команда...

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

Я слышал о решении с двойной кавычкой с использованием абсолютного пути, но, похоже, оно не работает со сценариями .exe (но работает с .bat и .cmd)

Спасибо за любую помощь!


person O. Jerrari    schedule 27.01.2016    source источник
comment
Верен ли рабочий каталог при выполнении вашего скрипта? MsgBox CreateObject("Wscript.Shell").CurrentDirectory -- Если да, вы можете просто создать полный путь в кавычках самостоятельно.   -  person krlmlr    schedule 27.01.2016
comment
@krlmlr На самом деле я новичок в vbs, и даже если я заменю Rexe на Rexe = """C:\Users[user name]\Desktop\foo bar\R-Portable\App\R-Portable\bin\Rscript.exe""" , я все равно получу ту же ошибку. Я не знаю, правильный ли это способ.   -  person O. Jerrari    schedule 27.01.2016
comment
@krlmlr Я внимательно изучил это, и кажется, что решение с двойными кавычками не работает с файлами .exe (хотя оно работает с .bat и .cmd). я отредактировал сообщение   -  person O. Jerrari    schedule 27.01.2016


Ответы (1)


Код ниже поможет вам

Dim oShell As Object
 Set oShell = CreateObject("WScript.Shell")
    'run command'
    Dim oExec As Object
    Dim oOutput As Object
    Set oExec = oShell.Exec("C:\Program Files\R\R-3.2.3\bin\Rscript.exe C:\subfolder\YourScript.R " & """" & var1 & """")
    Set oOutput = oExec.StdOut

обрабатывать результаты по мере их записи и чтения из объекта StdOut

Dim s As String
Dim sLine As String
While Not oOutput.AtEndOfStream
    sLine = oOutput.ReadLine
    If sLine <> "" Then s = s & sLine & vbCrLf
Wend
person Pavan Kumar    schedule 01.06.2016