嗨,我是 Windows 批处理新手。
我想向打电话的同事分发一个 runMe.bat 文件Rscript myRfile.R
处理一些数据文件。但众所周知,我的同事在不同地方安装了 R,我不能指望他们知道如何将 Rscript 添加到 PATH 甚至在 R 中编写代码。
我希望 .bat 文件查找最新安装的 R 的路径并将 [该目录]\bin\i386\ 临时添加到 PATH 中。
我想象:
迭代子文件夹 https://stackoverflow.com/questions/445167/how-can-i-get-the-value-of-a-registry-key-from-within-a-batch-script登记处HKEY_LOCAL_MACHINE\Software\Rcore\R\
查找最后一个和最新的 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 版本。运行时和内存要求。是很谦虚的。
我认为像下面这样的东西会做你想要的:
@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 下的最后一个键,并且排序将有望对它们进行排序,以便最新的安装将最终结束。内部 if 语句只是为了确保忽略空白行。
接下来是基本的错误检查,以确保设置了 rkey(例如,如果注册表项不存在)。
下一个 for 循环应该只迭代一次,并仅从所选键的 installPath 值中提取值部分。 for 只是用来跳过不相关的行和标记。然后测试是否找到该值,以及找到的值是否实际存在。
最后,根据架构更新路径,并运行脚本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)