将最新的R安装路径从注册表添加到PATH windows 7/8/10

时间:2016-01-12 12:36:58

标签: r windows batch-file

嗨,我是Windows批处理的新手。

我想向同事调用runMe.bat文件,调用Rscript myRfile.R来处理一些数据文件。但我的同事已经出名地安装了R各种各​​样的地方,我不能指望他们知道如何将Rscript添加到PATH甚至是R中的代码。

我希望.bat文件能够查找最新安装的R的路径,并暂时将[该目录] \ bin \ i386 \添加到PATH。

我想:

    注册表HKEY_LOCAL_MACHINE\Software\Rcore\R\
  • iterate the subfolders以查找最新和最新的R版本文件夹

  • in this registry subdirectory get the **installPath** e.g. keyValue = "c:\R\R-3.2.2\"

  • concatenate with "\bin\i386\" -> c:\R\R-3.2.2\bin\i386\ ->Rpath

  • PATH%PATH%;Rpath

  • Rscript myRfile.R

我更喜欢Rpath没有永久添加到PATH中。无论如何,我的同事可能已经完全限制了Windows管理员权限。

非常感谢!

奖励:我的公司主要有32位Windows操作系统安装,但会在不久的将来升级。我不介意只执行R i386版本。运行时和内存需求。是非常适度的。

2 个答案:

答案 0 :(得分:2)

我认为以下内容可以满足您的需求:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SET RKEY=
SET RPATH=
FOR /F "tokens=* skip=2" %%L IN ('reg.exe QUERY HKLM\Software\R-core\R /f * /k ^| sort') DO (
    IF NOT "%%~L"=="" SET "RKEY=%%~L"
)
IF NOT DEFINED RKEY (
    ECHO Unable to qyery registry key HKLM\Software\Rcore\R
    EXIT /B 1
)
FOR /F "tokens=2* skip=2" %%A IN ('REG QUERY %RKEY% /v "installPath"') DO (
    IF NOT "%%~B"=="" SET "RPATH=%%~B"
)
IF NOT DEFINED RPATH (
    ECHO Unable to query registry value %RKEY%\installPath
    EXIT /B 2
)
IF NOT EXIST "%RPATH%" (
    ECHO Found path for R (%RPATH%^) does not exist
    EXIT /B 3
)
IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
    SET "PATH=%RPATH%\bin\x64;%PATH%"
) ELSE (
    SET "PATH=%RPATH%\bin\i386;%PATH%"
)
Rscript myscript.r

首先,我们启用本地'模式,因此我们设置的所有变量将在批处理文件退出时恢复(即使您使用' CALL'来调用它)。接下来,我们取消设置使用的两个变量,因此我们可以测试它们是否由以后的代码设置。

第一个for循环将每个结果执行一次,因此RKEY最终设置为\ R下的最后一个键,sort希望对它们进行排序,以使最新的安装最后结束。内部if语句只是为了确保忽略空行。

接下来是一个基本的错误检查,以确保设置了rkey(如果注册表项不存在,例如)。

下一个for循环应该只迭代一次,并从所选键中的installPath值中仅提取值部分。 for仅用于跳过不相关的行和标记。然后测试是否找到了值,以及找到的值是否确实存在。

最后,根据体系结构更新路径,然后运行脚本。

答案 1 :(得分:1)

感谢@Extrarius,我更正了代码,以便第一次运行。作为编辑,我被拒绝这样做。

@ECHO OFF
ECHO Searching for install path of latest version of R in registry...
SETLOCAL ENABLEEXTENSIONS REM This line will reset path when return
SET RKEY=
SET RPATH=
FOR /F "tokens=* skip=2" %%L IN ('reg.exe QUERY HKLM\Software\R-core\R /f * /k ^| sort') DO (
    IF NOT "%%~L"=="" SET "RKEY=%%~L"
)
IF NOT DEFINED RKEY (
    ECHO Unable to query registry key HKLM\Software\R-core\R
    EXIT /B 1
)
FOR /F "tokens=2* skip=2" %%A IN ('REG QUERY %RKEY% /v "installPath"') DO (
    IF NOT "%%~B"=="" SET "RPATH=%%~B"
)
IF NOT DEFINED RPATH (
    ECHO Unable to query registry value %RKEY%\installPath
    EXIT /B 2
)
IF NOT EXIST "%RPATH%" (
    ECHO Found path for R (%RPATH%^) does not exist
    EXIT /B 3
)
SET OLDPATH=%PATH%
IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
    SET PATH=%RPATH%\bin\x64;%OLDPATH%
    ECHO Found %RPATH%\bin\x64
) ELSE (
    SET PATH=%RPATH%\bin\i386;%OLDPATH%
    ECHO Found %RPATH%\bin\i386
)

Rscript myscript.R