Найдите Rscript.exe на Windows - PullRequest
1 голос
/ 17 июня 2020

Я хочу запустить Rscript на компьютере windows. Для этого мне нужно найти точное местоположение Rscript, поскольку его нет в% PATH%. При поиске stackoverflow я нашел такой подход

where /r "c:\Program Files" Rscript.exe

, который дает три строки:

c:\Program Files\R\R-3.6.2\bin\Rscript.exe
c:\Program Files\R\R-3.6.2\bin\i386\Rscript.exe
c:\Program Files\R\R-3.6.2\bin\x64\Rscript.exe

Теперь я не знаю, как действовать. Как я могу назначить одну из трех строк (локальной) переменной среды в windows cmd? В идеале это была бы первая или третья строка, то есть x64 rscript.exe.

Другой подход, который я нашел в SO, выглядит следующим образом:

set "src=c:\Program Files"
set "search=Rscript.exe"

for /r "%src%" %%F in (*%search%*) do (
  set "full=%%~fF"
  set "name=%%~nxF"
  echo %full%
)

но каким-то образом ничего не назначается% full%.

Поскольку я хотел бы запускать командный файл на нескольких компьютерах, я бы не хотел выполнять дополнительную настройку на этих компьютерах (например, устанавливать PATH или R_HOME или назначать Rscript файлам .R или. ..)

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Первый совет, который я предлагаю, это проверить, было ли его местоположение добавлено в реестр в соответствии с ассоциацией файлов с .RData файлами. Если он найден, вы можете заменить RGui.exe на RScript.exe:

@Echo Off
SetLocal EnableExtensions
Set "Key=HKCU\Software\Classes\RWorkspace\Shell\Open\Command"
Set "RDir="
For /F "EOL=H Tokens=2*" %%G In ('%__AppDir__%reg.exe Query "%Key%" /VE 2^>NUL'
) Do Set "RDir=%~dpH"
If Not Defined RDir For /F "EOL=H Tokens=2*" %%G In (
    '%__AppDir__%reg.exe Query "HKLM%Key:~4%" /VE 2^>NUL') Do Set "RDir=%~dpH"
If Defined RDir Where /Q "%RDir%.":"RScript.exe" && (
    Set "RDir=%RDir%RScript.exe") || Set "RDir="
If Defined RDir Echo Your default RScript.exe absolute path is %RDir% & Pause

. Другими альтернативами могут быть проверка информации об удалении реестра для места установки, и, если обнаружено, добавьте подкаталог \bin и соответствующий дочерний элемент архитектуры:

@Echo Off
SetLocal EnableExtensions
Set "Key=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
Set "Sub=R for Windows"
Set "Val=InstallLocation"
Set "Reg=%__AppDir__%reg.exe"
Set "Find=%__AppDir__%find.exe"
Set "RDir="
For /F "EOL=H Tokens=2*" %%G In (
    '"%Reg% Query "%Key%" /S /F "%Sub%" /K /V "%Val%" 2>NUL|%Find% "\""'
) Do Set "RDir=%%H"
If Not Defined RDir If Defined PROCESSOR_ARCHITEW6432 (
    For /F "EOL=H Tokens=2*" %%G In (
        '"%Reg% Query "%Key%" /S /F "%Sub%" /K /V "%Val%" /Reg:32 2>NUL|%Find% "\""'
    ) Do Set "RDir=%%H")
If Not Defined RDir GoTo :EOF
If "%PROCESSOR_ARCHITECTURE:~-2%" == "86" (
    If Not Defined PROCESSOR_ARCHITEW6432 (Set "RDir=%RDir%\bin\i386"
) Else Set "RDir=%RDir%\bin\x64") Else Set "RDir=%RDir%\bin\x64"
Where /Q "%RDir%":"RScript.exe" && (Set "RDir=%RDir%\RScript.exe") || Set "RDir="
If Defined RDir Echo Your default RScript.exe absolute path is %RDir% & Pause

Также может быть стоит проверить, был ли выбран вариант установки Save version number in registry в Select Additional Tasks во время установки, (или позже, используя RSetReg.exe или RSetReg.exe /Personal) , затем, используя возвращенный путь к домашнему каталогу, чтобы добавить ваши подкаталоги:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "Reg=%__AppDir__%reg.exe"
Set "Find=%__AppDir__%find.exe"
Set "Key=HKCU\Software\R-core\R"
Set "Val=InstallPath"
Set "RDir="
For /F "EOL=H Tokens=2*" %%G In (
    '"%Reg% Query "%Key%" /S /F "%Val%" /V 2>NUL|%Find% "\""') Do Set "RDir=%%~H"
If Not Defined RDir For /F "EOL=H Tokens=2*" %%G In (
    '"%Reg% Query "HKLM%Key:~4%" /S /F "%Val%" /V 2>NUL|%Find% "\""'
) Do Set "RDir=%%~H"
If Not Defined RDir GoTo :EOF
If "%PROCESSOR_ARCHITECTURE:~-2%" == "86" (
    If Not Defined PROCESSOR_ARCHITEW6432 (Set "RDir=%RDir%\bin\i386"
) Else Set "RDir=%RDir%\bin\x64") Else Set "RDir=%RDir%\bin\x64"
Where /Q "%RDir%":"RScript.exe" && (Set "RDir=%RDir%\RScript.exe") || Set "RDir="
If Defined RDir Echo Your default RScript.exe absolute path is %RDir% & Pause

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

2 голосов
/ 17 июня 2020

Вывод команды может быть записан в переменную с помощью for / F l oop. Если условия или конвейерная передача вывода в find или findstr могут дополнительно отфильтровать этот вывод.

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

@echo off
Setlocal ENABLEdelayedexpansion
For /F "Delims=" %%0 In ('where /r "c:\Program Files" Rscript.exe') do If "!scriptpath!" == "" Set "scriptpath=%%~0"
1 голос
/ 17 июня 2020

Для справки, вот решение, которое я придумал:

@echo off

set "rscript=I:\path\to\myscript.R"

for /r "c:\Program Files" %%F in (*Rscript.exe*) do (
  "%%~fF" "%rscript%" %*
  goto :eof
)

echo No Rscript.exe found. Maybe you need to install R.
pause

EDIT: используя предложения @Compo, я изменил пакетный файл следующим образом:

@Echo Off
SetLocal EnableExtensions

set "rscript=I:\path\to\myscript.R"

For /F "EOL=H Tokens=3*" %%G In (
    '"reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall /S /F "R for Windows" /K /V "InstallLocation" 2> NUL | find "InstallLocation""'
) Do Set "rexe=%%G %%Hbin\x64\Rscript.exe"

if not defined rexe goto nope

"%rexe%" "%rscript%" %*
goto :eof

:nope
echo No Rscript.exe found. Maybe you need to install R.
pause

Здесь несколько заметок, которые я узнал по ходу дела.

  • .RData связано с RStudio на моем p c - так что не стоит искать здесь.
  • SetLocal EnableExtension не требуется на моем p c, но может быть на другом p c, поэтому я сохранил строку
  • Tokens=3* определяет %G как третий токен и неявно %H как все токены после третьего токена. Сумасшедший синтаксис.
  • 2> NUL означает «игнорировать сообщения об ошибках»
  • Двойные кавычки "'reg ...'" действительно необходимы, мне интересно, почему

Это работает для меня сейчас. Я могу быть уверен, что p c, на котором будет запущен командный файл, имеет архитектуру x64 и установлен под Program Files. Возможно, позже мне нужно будет добавить опции в rscript. Кроме того, мне придется решить использовать последнюю версию R, если установлено более одной версии.

...