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 ...)
3 Réponses :
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"
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.
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 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" "'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.
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
, puis en utilisant le chemin du répertoire personnel retourné pour ajouter vos sous-répertoires: RSetReg.exe / Personal
)
@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.
Il manque simplement à votre code expansion de variable retardée (lorsque vous remplacez
echo% full code > en
set full
, vous remarquerez que la variable est réellement définie; utiliserecho! full!
avec l'expansion retardée activée fonctionnerait aussi)…