1
votes

Trouvez Rscript.exe sur Windows

Je voudrais exécuter Rscript sur un ordinateur Windows. Pour cela, j'ai besoin de trouver l'emplacement exact de Rscript, car il n'est pas sur% PATH%. En cherchant stackoverflow, j'ai trouvé cette approche

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

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

qui produit trois lignes:

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

Maintenant je ne sais pas comment procéder. Comment puis-je attribuer l'une des trois lignes à une variable d'environnement (locale) dans Windows cmd? Idéalement, ce serait la première ou la troisième ligne, c'est-à-dire le rscript.exe x64.

Une autre approche que j'ai trouvée sur SO est la suivante:

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

mais d'une manière ou d'une autre, rien n'est assigné à% full%.

Puisque je voudrais exécuter le fichier de commandes sur plus d'un ordinateur, je voudrais éviter de faire une configuration supplémentaire sur ces ordinateurs (comme définir PATH ou R_HOME ou attribuer Rscript aux fichiers .R ou ...)


1 commentaires

Il manque simplement à votre code expansion de variable retardée (lorsque vous remplacez echo% full en set full , vous remarquerez que la variable est réellement définie; utiliser echo! full! avec l'expansion retardée activée fonctionnerait aussi)…


3 Réponses :


2
votes

La sortie de la commande peut être capturée dans une variable en utilisant une boucle for / F. Si les conditions ou le transfert de la sortie dans find ou findstr peuvent filtrer davantage cette sortie.

Pour un cas simple de capture de la première ligne de sortie, ce qui suit devrait suffire.

@echo off
Setlocal ENABLEdelayedexpansion
For /F "Delims=" %%0 In ('where /r "c:\Program Files" Rscript.exe') do If "!scriptpath!" == "" Set "scriptpath=%%~0"


2 commentaires

Merci! Je n'aurais pas pensé mettre l'instruction where entre accolades.


J'ai redirigé le vote d'acceptation vers @Compo car il peut être le plus utile pour ceux qui ont une question / tâche similaire à celle que j'avais. J'ai cependant beaucoup appris de votre réponse.



1
votes

Pour référence, voici la solution que j'ai trouvée:

@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

EDIT: en utilisant les suggestions de @Compo, j'ai modifié le fichier batch ainsi:

@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

Voici quelques notes que j'ai apprises en cours de route.

  • .RData est associé à RStudio sur mon PC - ce n'est donc pas une bonne idée de regarder ici.
  • SetLocal EnableExtension n'est pas nécessaire sur mon pc, mais cela peut être sur un autre pc, donc j'ai gardé la ligne
  • Le Tokens = 3 * définit % G comme troisième jeton et implicitement % H comme tous les jetons après le troisième jeton. Syntaxe folle.
  • 2> NUL signifie "ignorer les messages d'erreur"
  • La double citation "'reg ...'" est vraiment nécessaire, je me demande pourquoi

Cela fonctionne pour moi maintenant. Je peux être sûr que les ordinateurs sur lesquels le fichier de commandes fonctionnera sont des architectures x64 et sont installés sous Program Files . Peut-être que plus tard, je devrai ajouter des options à rscript. De plus, je devrai comprendre comment utiliser la dernière version R au cas où il y en aurait plusieurs installés.


0 commentaires

2
votes

Le premier conseil que j'offrirais, c'est que vous vérifiez si son emplacement a été ajouté au registre sous l'association de fichiers avec les fichiers .RData . Si trouvé, vous pouvez essentiellement remplacer RGui.exe par RScript.exe:

@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

D'autres alternatives consisteraient à vérifier les informations de désinstallation du registre pour l'emplacement d'installation, et s'il est trouvé, ajoutez le sous-répertoire \ bin et son architecture enfant respective:

@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

Cela peut également valoir la peine de vérifier pour voir si l'option d'installation Enregistrer le numéro de version dans le registre a été sélectionnée sous Sélectionner des tâches supplémentaires au moment de l'installation, (ou plus tard en utilisant RSetReg.exe code > ou RSetReg.exe / Personal ) , puis en utilisant le chemin du répertoire personnel retourné pour ajouter vos sous-répertoires:

@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

Cela ne ferait que être si l'une de ces méthodes ne parvient pas à fournir un emplacement, est-ce que j'envisagerais d'effectuer une recherche du lecteur système, ou éventuellement d'autres volumes disponibles pour un fichier exécutable.


0 commentaires