Comment tester si un fichier exécutable existe dans la variable %PATH% à partir d'un fichier de commandes windows?
Je suis à la recherche d'un moyen simple de tester si un fichier exécutable existe dans la variable d'environnement PATH d'un fichier de commandes Windows.
L'utilisation d'outils externes ne sont pas fournis par le système d'exploitation n'est pas autorisé. Le minimum de la version de Windows est nécessaire de Windows XP.
- double possible de Comment faire pour vérifier si un fichier existe dans le DOS lot
- Certainement pas. La question ici est tout à fait différent.
- Vous devez marquer accepté de répondre.
Vous devez vous connecter pour publier un commentaire.
Si vous avez besoin de cela pour différentes extensions, juste itérer sur
PATHEXT
:Pourrait être que
where
existe déjà sur les anciens versions de Windows, mais je n'ai pas accès à un, donc je ne peux pas dire. Sur ma machine le suivant fonctionne aussi:et renvoie un code de sortie non nulle si elle ne pouvait pas être trouvé. Dans un lot, vous avez probablement vous aussi souhaitez rediriger la sortie de
NUL
, si.Garder à l'esprit
L'analyse dans le lot (
.bat
) des fichiers et sur la ligne de commande diffère (parce que des fichiers batch ont%0
–%9
), de sorte que vous avez à doubler la%
là. Sur la ligne de commande, ce n'est pas nécessaire, de sorte que les variables sont juste%X
.where myExecutable
.%0
–%9
), de sorte que vous avez à doubler la%
là. Sur la ligne de commande, ce n'est pas nécessaire, de sorte quefor
variables sont juste%x
.where
occasion), et vous obtenez les upvotes - au moins de moi. 🙂Windows Vista et les versions ultérieures sont livrés avec un programme appelé
where.exe
que les recherches pour les programmes dans le chemin. Il fonctionne comme ceci:Pour une utilisation dans un fichier de commandes que vous pouvez utiliser le
/q
interrupteur, ce qui ne fait qu'ERRORLEVEL
et ne produit pas de sortie.Ou une simple (mais moins lisible) version courte qui imprime le message et sort de votre application:
Voici une solution simple qui tente d'exécuter l'application et poignées de toute erreur après.
Code d'erreur 9009 habituellement signifie que le fichier est introuvable.
Le seul inconvénient est que
file.exe
est réellement exécuté si (ce qui dans certains cas n'est pas desiderable).Ceci peut être accompli via le paramètre de substitution.
Retourne le chemin complet de l'exécutable de nom de fichier dans %1, sinon une chaîne vide.
Cela ne fonctionne pas avec les variables définies par l'utilisateur. Donc, si l'exécutable de nom de fichier n'est pas un paramètre à votre script, alors vous avez besoin d'une sous-routine. Par exemple:
Voir http://ss64.com/nt/syntax-args.html
setlocal
maisfor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
est une solution en ligne avecfor
utilisé comme solution de contournement pour%%~$PATH:X
afin d'évitercall
et%~$PATH:1
.for
n'est pas assez intelligent pour analyser le contenu dePATH
. Il manquera les répertoires avec des espaces, par exemple. Et même lorsque vous utilisezfor /f
avecdelims=;
il ne fonctionnera pas correctement si un répertoire contient un;
et est cité.;
avec"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
le chemin et voir ce qui se passe. Au moins, ici, il essaie de traiter chaque »mot« séparément qui, en un sens, est pire que le comportement avant.Parfois cette solution simple qui fonctionne, où vous vérifiez pour voir si le résultat correspond à ce que vous attendez. La première ligne s'exécute la commande et s'empare de la dernière ligne de sortie standard.
Utiliser la commande : powershell Test-Path "exe qui vous la recherche pour"
Il retournera True si son présent, sinon Faux.
Test-Path
vérifie uniquement le chemin d'accès spécifié, c'est à direTest-Path nuget.exe
retournera true seulement sinuget.exe
est dans le répertoire courant. Si nuget.exe n'est pas dans le répertoire courant, il retournera false, même si c'est dans un répertoire indiqué dans la variable PATH. Dans PowerShellGet-Command
pourrait mieux travailler(stackoverflow.com/questions/11242368/...), mais prendre en compte que pour PowerShell le répertoire courant n'est pas dans le chemin.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
renvoie true si trouvé local ou en chemin.Pour ceux qui recherchent une PowerShell option. Vous pouvez utiliser le
Get-Command
applet de commande en passant par deux éléments. D'abord donner à l'emplacement du répertoire courant avec.\
le préfixe, puis donner juste le nom de l'exécutable.Qui renvoie true si trouvé local ou à l'échelle du système des chemins.
Si vous êtes à la recherche de quelque chose comme moi sur le dossier de démarrage, devrait aller de dossier. Par exemple, je recherche exe sur le dossier de démarrage et j'ai utiliser ce code comme
program.exe
existe, non pas dans un seul dossier