96 votes

Comment tester si un exécutable existe dans le %PATH% à partir d'un fichier batch Windows ?

Je cherche un moyen simple de tester si un exécutable existe dans la variable d'environnement PATH à partir d'un fichier batch Windows.

L'utilisation d'outils externes non fournis par l'OS n'est pas autorisée. La version minimale de Windows requise est Windows XP.

1 votes

17 votes

@karlphilip : Définitivement non. La question ici est tout à fait différente.

88voto

Ryan Bemrose Points 1025

Windows Vista et les versions ultérieures sont livrés avec un programme appelé where.exe qui recherche les programmes dans le chemin. Cela fonctionne comme suit :

D:\>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe

D:\>where where
C:\Windows\System32\where.exe

Pour l'utilisation dans un fichier batch, vous pouvez utiliser la commande /q qui définit simplement ERRORLEVEL et ne produit aucun résultat.

where /q myapplication
IF ERRORLEVEL 1 (
    ECHO The application is missing. Ensure it is installed and placed in your PATH.
    EXIT /B
) ELSE (
    ECHO Application exists. Let's go!
)

Ou une version abrégée simple (mais moins lisible) qui imprime le message et quitte votre application :

where /q myapplication || ECHO Cound not find app. && EXIT /B

0 votes

Très beau et simple ! Merci !

73voto

Joey Points 148544
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...

Si vous en avez besoin pour différentes extensions, il suffit d'itérer sur PATHEXT :

set FOUND=
for %%e in (%PATHEXT%) do (
  for %%X in (myExecutable%%e) do (
    if not defined FOUND (
      set FOUND=%%~$PATH:X
    )
  )
)

C'est peut-être que where existe aussi déjà sur les anciennes versions de Windows, mais je n'y ai pas accès, donc je ne peux pas le dire. Sur ma machine, ce qui suit fonctionne également :

where myExecutable

et retourne avec un code de sortie non nul s'il n'a pas pu être trouvé. Dans un lot, vous voudrez probablement aussi rediriger la sortie vers NUL mais

Gardez à l'esprit

Parsing en lot ( .bat ) et sur la ligne de commande diffère (parce que les fichiers batch ont %0 - %9 ), vous devez donc doubler le % là. Sur la ligne de commande, ce n'est pas nécessaire, donc les variables sont juste %X .

1 votes

J'aime votre approche mais ce serait encore mieux si vous pouviez fournir la version complète, celle qui utilise aussi PATHEXT pour cela.

4 votes

Pour XP vous avez besoin de la boucle script (ou téléchargez where.exe depuis le RK). Vista et 7 sont livrés avec where.exe. Je sais que l'OP a spécifiquement dit XP, mais pour la postérité la meilleure réponse est toujours d'utiliser where myExecutable .

0 votes

Ryan : Huh ? Je ne pense pas que je puisse analyser ta phrase.

18voto

eadmaster Points 287

Voici une solution simple qui tente d'exécuter l'application et gère toute erreur. ensuite .

file.exe /?  2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path

Le code d'erreur 9009 signifie généralement que le fichier n'a pas été trouvé.

Le seul inconvénient est que file.exe est effectivement exécutée si elle est trouvée (ce qui dans certains cas n'est pas souhaitable).

26 votes

Le seul inconvénient est que "file.exe" est exécuté (ce qui dans certains cas est indésirable)

6voto

Chris Noe Points 8375

Cela peut se faire par substitution de paramètres.

%~$PATH:1

Cela renvoie le chemin complet du nom de fichier exécutable dans %1, sinon une chaîne vide.

Cela ne fonctionne pas avec les variables définies par l'utilisateur. Donc si le nom du fichier exécutable n'est pas un paramètre de votre script, alors vous avez besoin d'une sous-routine. Par exemple :

call :s_which app.exe
if not "%_path%" == "" (
  "%_path%"
)

goto :eof

:s_which
  setlocal
  endlocal & set _path=%~$PATH:1
  goto :eof

Voir http://ss64.com/nt/syntax-args.html

1 votes

Un truc intéressant avec setlocal mais for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X) est une solution à une ligne avec for utilisé comme solution de contournement pour %%~$PATH:X afin d'éviter call et %~$PATH:1 .

0voto

PabloG Points 9308
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....

3 votes

Ne fonctionnera pas comme for n'est pas assez intelligent pour analyser le contenu du fichier PATH . Il manquera les répertoires contenant des espaces, par exemple. Et même si vous utilisez for /f avec delims=; il ne fonctionnera pas correctement si un répertoire contient un fichier ; et est cité.

0 votes

@Joey, que pensez-vous du remplacement des chaînes de caractères ? Remplacer ; avec "; " : set quotedPath="%PATH:;="; "%" .

1 votes

XP1 : Non, toujours inutile. Essayez en ajoutant "C:\Folder with; semicolon, quoted" au chemin et voir ce qui se passe. Au moins ici, il essaie de traiter chaque "mot" séparément, ce qui, d'une certaine manière, est pire que le comportement précédent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X