Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上查找Rscript.exe_R_Windows_Batch File_Cmd - Fatal编程技术网

在Windows上查找Rscript.exe

在Windows上查找Rscript.exe,r,windows,batch-file,cmd,R,Windows,Batch File,Cmd,我想在windows计算机上执行Rscript。为此,我需要找到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\

我想在windows计算机上执行Rscript。为此,我需要找到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%


由于我希望在多台计算机上运行批处理文件,因此我希望避免在这些计算机上进行额外配置,如设置路径或R_HOME或将Rscript分配给.R文件或

可以使用for/F循环将命令输出捕获到变量中。如果条件或管道将输出输入find或findstr,则可以进一步过滤该输出

对于只捕获第一行输出的简单情况,下面的内容就足够了

@回音 Setlocal ENABLEdelayedexpansion 对于/F Delims=%%0,在“where/r c:\Program Files Rscript.exe”中,如果!脚本路径!==设置脚本路径=%%~0
可以使用for/F循环将命令输出捕获到变量中。如果条件或管道将输出输入find或findstr,则可以进一步过滤该输出

对于只捕获第一行输出的简单情况,下面的内容就足够了

@回音 Setlocal ENABLEdelayedexpansion 对于/F Delims=%%0,在“where/r c:\Program Files Rscript.exe”中,如果!脚本路径!==设置脚本路径=%%~0
以下是我提出的解决方案供参考:

@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
编辑:使用@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关联-因此在此处查看不是一个好主意。 SetLocal EnableExtension在我的电脑上不是必需的,但它可能在其他电脑上,因此我保留了线路 Tokens=3*将%G定义为第三个令牌,并隐式地将%H定义为第三个令牌之后的所有令牌。疯狂的语法。 2> NUL表示忽略错误消息 双引号“reg…”真的很有必要,我想知道为什么 这对我现在有用。我可以肯定,批处理文件将运行的pc是x64体系结构,并且安装在程序文件下。
也许以后我需要向rscript添加选项。此外,如果安装了多个R版本,我还必须考虑使用最新的R版本。

以下是我提出的解决方案供参考:

@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
编辑:使用@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关联-因此在此处查看不是一个好主意。 SetLocal EnableExtension在我的电脑上不是必需的,但它可能在其他电脑上,因此我保留了线路 Tokens=3*将%G定义为第三个令牌,并隐式地将%H定义为第三个令牌之后的所有令牌。疯狂的语法。 2> NUL表示忽略错误消息 双引号“reg…”真的很有必要,我想知道为什么 这对我现在有用。我可以肯定,批处理文件将运行的pc是x64体系结构,并且安装在程序文件下。
也许以后我需要向rscript添加选项。此外,我还必须考虑使用最新的R版本,以防安装了多个版本。

我提供的第一个建议是,检查其位置是否已添加到注册表中与.RData文件关联的文件下。如果找到,基本上可以用RScript.exe替换RGui.exe:

@回音 setLocalEnableExtensions Set Key=HKCU\Software\Classes\RWorkspace\Shell\Open\Command 设置RDir= 对于“%”中的/F EOL=H Tokens=2*%%%G,AppDir\uuuu%reg.exe查询%Key%/VE 2^>NUL' Do设置RDir=%~dpH 如果未为/F下线=H定义RDir,则令牌=2*%%%G In “%\uuuu AppDir\uuuu%reg.exe查询HKLM%键:~4%/VE 2^>NUL”Do Set RDir=%~dpH 如果定义了RDir,其中/Q%RDir%:RScript.exe&& Set RDir=%RDir%RScript.exe | | Set RDir= 如果已定义RDir Echo,则默认RScript.exe绝对路径为%RDir%&暂停 其他替代方法是检查注册表卸载信息中的安装位置,如果找到,则附加\bin子目录及其相应的体系结构子目录:

@回音 setLocalEnableExtensions Set Key=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 为Windows设置Sub=R Set Val=InstallLocation Set Reg=%\uuuuu AppDir\uuuuuu%Reg.exe 设置Find=%\uuuuu AppDir\uuuuuu%Find.exe 设置RDir= 对于/F EOL=H令牌=2*%%%G In “%Reg%Query%Key%/S/F%Sub%/K/V%Val%2>num |%Find%\” Do设置RDir=%%H 如果未定义RDir如果已定义处理器\u架构6432 对于/F EOL=H令牌=2*%%%G In “%Reg%Query%Key%/S/F%Sub%/K/V%Val%/Reg:32 2>num |%Find%\” Do设置RDir=%%H 如果未定义RDir转到:EOF 如果%PROCESSOR\u架构:~-2%==86 如果未定义处理器\u架构6432,则设置RDir=%RDir%\bin\i386 其他设置RDir=%RDir%\bin\x64其他设置RDir=%RDir%\bin\x64 其中/Q%RDir%:RScript.exe&&Set RDir=%RDir%\RScript.exe | | Set RDir= 如果定义 RDir Echo默认RScript.exe绝对路径为%RDir%&暂停 还值得检查一下,是否在安装时选择了“选择其他任务”下的“在注册表中保存版本号”安装选项,或者稍后使用RSetReg.exe或RSetReg.exe/Personal,然后使用返回的主目录路径附加子目录:

@回音 SetLocal EnableExtensions DisableDelayedExpansion Set Reg=%\uuuuu AppDir\uuuuuu%Reg.exe 设置Find=%\uuuuu AppDir\uuuuuu%Find.exe Set Key=HKCU\Software\R-core\R Set Val=InstallPath 设置RDir= 对于/F EOL=H令牌=2*%%%G In “%Reg%Query%Key%/S/F%Val%/v2>num |%Find%\'Do Set RDir=%%~H 如果未为/F下线=H定义RDir,则令牌=2*%%%G In “%Reg%Query HKLM%Key:~4%/S/F%Val%/v2>num |%Find%\” Do设置RDir=%%~H 如果未定义RDir转到:EOF 如果%PROCESSOR\u架构:~-2%==86 如果未定义处理器\u架构6432,则设置RDir=%RDir%\bin\i386 其他设置RDir=%RDir%\bin\x64其他设置RDir=%RDir%\bin\x64 其中/Q%RDir%:RScript.exe&&Set RDir=%RDir%\RScript.exe | | Set RDir= 如果已定义RDir Echo,则默认RScript.exe绝对路径为%RDir%&暂停

只有当这些方法中的一个无法提供位置时,我会考虑对系统驱动器进行搜索,或者可能为可执行文件提供其他可用卷。

< P>我提供的第一个建议是,检查是否将其位置添加到与RDATA文件关联的注册表中。如果找到,基本上可以用RScript.exe替换RGui.exe:

@回音 setLocalEnableExtensions Set Key=HKCU\Software\Classes\RWorkspace\Shell\Open\Command 设置RDir= 对于“%”中的/F EOL=H Tokens=2*%%%G,AppDir\uuuu%reg.exe查询%Key%/VE 2^>NUL' Do设置RDir=%~dpH 如果未为/F下线=H定义RDir,则令牌=2*%%%G In “%\uuuu AppDir\uuuu%reg.exe查询HKLM%键:~4%/VE 2^>NUL”Do Set RDir=%~dpH 如果定义了RDir,其中/Q%RDir%:RScript.exe&& Set RDir=%RDir%RScript.exe | | Set RDir= 如果已定义RDir Echo,则默认RScript.exe绝对路径为%RDir%&暂停 其他替代方法是检查注册表卸载信息中的安装位置,如果找到,则附加\bin子目录及其相应的体系结构子目录:

@回音 setLocalEnableExtensions Set Key=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 为Windows设置Sub=R Set Val=InstallLocation Set Reg=%\uuuuu AppDir\uuuuuu%Reg.exe 设置Find=%\uuuuu AppDir\uuuuuu%Find.exe 设置RDir= 对于/F EOL=H令牌=2*%%%G In “%Reg%Query%Key%/S/F%Sub%/K/V%Val%2>num |%Find%\” Do设置RDir=%%H 如果未定义RDir如果已定义处理器\u架构6432 对于/F EOL=H令牌=2*%%%G In “%Reg%Query%Key%/S/F%Sub%/K/V%Val%/Reg:32 2>num |%Find%\” Do设置RDir=%%H 如果未定义RDir转到:EOF 如果%PROCESSOR\u架构:~-2%==86 如果未定义处理器\u架构6432,则设置RDir=%RDir%\bin\i386 其他设置RDir=%RDir%\bin\x64其他设置RDir=%RDir%\bin\x64 其中/Q%RDir%:RScript.exe&&Set RDir=%RDir%\RScript.exe | | Set RDir= 如果已定义RDir Echo,则默认RScript.exe绝对路径为%RDir%&暂停 还值得检查一下,是否在安装时选择了“选择其他任务”下的“在注册表中保存版本号”安装选项,或者稍后使用RSetReg.exe或RSetReg.exe/Personal,然后使用返回的主目录路径附加子目录:

@回音 SetLocal EnableExtensions DisableDelayedExpansion Set Reg=%\uuuuu AppDir\uuuuuu%Reg.exe 设置Find=%\uuuuu AppDir\uuuuuu%Find.exe Set Key=HKCU\Software\R-core\R Set Val=InstallPath 设置RDir= 对于/F EOL=H令牌=2*%%%G In “%Reg%Query%Key%/S/F%Val%/v2>num |%Find%\'Do Set RDir=%%~H 如果未为/F下线=H定义RDir,则令牌=2*%%%G In “%Reg%Query HKLM%Key:~4%/S/F%Val%/v2>num |%Find%\” Do设置RDir=%%~H 如果未定义RDir转到:EOF 如果%PROCESSOR\u架构:~-2%==86 如果未定义处理器\u架构6432,则设置RDir=%RDir%\bin\i386 其他设置RDir=%RDir%\bin\x64其他设置RDir=%RDir%\bin\x64 其中/Q%RDir%:RScript.exe&&Set RDir=%RDir%\RScript.exe | | Set RDir= 如果已定义RDir Echo,则默认RScript.exe绝对路径为%RDir%&暂停

只有当这些方法中的一个无法提供位置时,我会考虑对系统驱动器进行搜索,或者可能为可执行文件提供其他可用卷。我没有想到把where语句放在大括号中。我将接受投票重定向到@Compo,因为它可能对那些有类似问题/任务的人最有用。不过,我从你的回答中学到了很多。谢谢!我没有想到把where语句放在大括号中。我将接受投票重定向到@Compo,因为它可能对那些有类似问题/任务的人最有用。不过,我从你的回答中学到了很多。当你用set full替换echo%full时,你会注意到变量实际上已经设置好了;使用回声!满的启用延迟扩展也可以工作…您的代码只是缺少 当您将echo%full替换为set full时,您会注意到变量实际上已设置;使用回声!满的启用延迟扩展也会起作用…