web-dev-qa-db-fra.com

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

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

L'utilisation d'outils externes non fournis par le système d'exploitation n'est pas autorisée. La version Windows minimale requise est Windows XP.

79
sorin
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...

Si vous en avez besoin pour différentes extensions, il suffit de parcourir PATHEXT:

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

Peut-être que where existe aussi déjà sur les anciennes versions de Windows, mais je n’ai pas accès à une de ces versions, je ne peux donc pas le savoir. Sur ma machine, cela fonctionne aussi:

where myExecutable

et retourne avec un code de sortie différent de zéro s'il est introuvable. Dans un lot, vous voudrez probablement aussi rediriger la sortie vers NUL.

Garder en tete

L'analyse dans les fichiers batch (.bat) et sur la ligne de commande est différente (parce que les fichiers batch ont %0%9), vous devez donc doubler le %. Sur la ligne de commande, cela n'est pas nécessaire, donc pour les variables, il suffit de %X

63
Joey

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 ceci:

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

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

Pour une utilisation dans un fichier de commandes, vous pouvez utiliser le commutateur /q, qui définit simplement ERRORLEVEL et ne produit aucune sortie.

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
60
Ryan Bemrose

Voici une solution simple qui tente d’exécuter l’application et gère toute erreur après .

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 est introuvable.

Le seul inconvénient est que file.exe est réellement exécuté s'il est trouvé (ce qui dans certains cas n'est pas souhaitable).

18
eadmaster

Cela peut être accompli via la 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 de fichier exécutable n'est pas un paramètre de votre script, vous avez besoin d'un sous-programme. 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

4
Chris Noe

Si vous recherchez quelque chose comme moi sur le dossier de démarrage, devrait aller dossier. Par exemple, je recherche exe sur le dossier de démarrage et j'utilise ce code comme

@echo off
cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
where /q program.exe
IF ERRORLEVEL 1 (
echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe" 
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
) ELSE (
ECHO Application exists. Let's go!
)
0
Zafer ATLI

Pour ceux qui recherchent une option PowerShell. Vous pouvez utiliser la cmdlet Get-Command en transmettant deux éléments. Commencez par indiquer l'emplacement actuel du répertoire avec le préfixe .\, puis indiquez simplement le nom du fichier exe. 

(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null

Cela retournera true si trouvé local ou dans les chemins du système.

0
John C

Parfois, cette solution simple fonctionne: vous vérifiez si le résultat correspond à vos attentes. La première ligne exécute la commande et saisit la dernière ligne de la sortie standard.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
0
bdombro
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
0
PabloG

Utilisez la commande: powershell Test-Path "le fichier exe que vous recherchez"

Il retournera True si son présent, sinon False.

0
akkidukes