Je recherche 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 le système d'exploitation n'est pas autorisée. La version minimale de Windows requise est Windows XP.
Réponses:
Si vous en avez besoin pour différentes extensions, répétez simplement
PATHEXT
:Peut-être que cela
where
existe déjà sur les versions héritées 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:et retourne avec un code de sortie différent de zéro s'il est introuvable. Dans un lot, vous souhaitez probablement également rediriger la sortie vers
NUL
.Gardez à l'esprit
L'analyse dans les
.bat
fichiers batch ( ) et sur la ligne de commande diffère (car les fichiers batch ont%0
-%9
), vous devez donc doubler le%
. Sur la ligne de commande, ce n'est pas nécessaire, donc les variables sont justes%X
.la source
where myExecutable
.%0
-%9
), vous devez donc doubler le%
. Sur la ligne de commande, ce n'est pas nécessaire, donc lesfor
variables sont justes%x
.Windows Vista et les versions ultérieures sont fournis avec un programme appelé
where.exe
qui recherche les programmes dans le chemin. Cela fonctionne comme ceci:Pour une utilisation dans un fichier de commandes, vous pouvez utiliser le
/q
commutateur, qui définit simplementERRORLEVEL
et ne produit aucune sortie.Ou une version abrégée simple (mais moins lisible) qui imprime le message et quitte votre application:
la source
Voici une solution simple qui tente d'exécuter l'application et gère toute erreur par la suite .
Le code d'erreur 9009 signifie généralement que le fichier est introuvable.
Le seul inconvénient est qu'il
file.exe
est effectivement exécuté s'il est trouvé (ce qui dans certains cas n'est pas souhaitable).la source
Cela peut être accompli via la substitution de paramètres.
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:
Voir http://ss64.com/nt/syntax-args.html
la source
setlocal
maisfor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
est une solution en une ligne avecfor
utilisé comme solution de contournement pour%%~$PATH:X
évitercall
et%~$PATH:1
.la source
for
n'est pas assez intelligent pour analyser le contenu dePATH
. Il manquera des répertoires avec des espaces, par exemple. Et même lorsque vous utilisezfor /f
avec,delims=;
cela ne fonctionnera pas correctement si un répertoire contient un;
et est cité.;
par"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
au chemin et voyez ce qui se passe. Au moins ici, il essaie de traiter chaque «mot» séparément, ce qui est en quelque sorte pire que le comportement antérieur.Parfois, cette solution simple fonctionne, où vous vérifiez si la sortie correspond à ce que vous attendez. La première ligne exécute la commande et saisit la dernière ligne de sortie standard.
la source
Si vous recherchez quelque chose comme moi dans le dossier de démarrage, vous devriez aller dans le dossier. Par exemple, je recherche exe sur le dossier de démarrage et j'utilise ce code comme
la source
program.exe
existe, pas seulement dans un dossierUtilisez la commande: powershell Test-Path "exe que vous recherchez"
Il retournera True s'il est présent, sinon False.
la source
Test-Path
ne vérifie que le chemin spécifié, c'est-à-direTest-Path nuget.exe
ne retournera vrai que s'il senuget.exe
trouve dans le répertoire courant. Si nuget.exe ne se trouve pas dans le répertoire en cours, il retournera false, même s'il se trouve dans un répertoire répertorié dans la variable PATH. Dans PowerShellGet-Command
peut fonctionner mieux ( stackoverflow.com/questions/11242368/… ), mais prenez en compte que pour PowerShell, le répertoire actuel n'est pas dans le chemin.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
retournera true s'il est trouvé local ou dans le chemin.Pour ceux qui recherchent une option PowerShell. Vous pouvez utiliser l'
Get-Command
applet de commande en passant deux éléments. Donnez d'abord l'emplacement actuel du répertoire avec le.\
préfixe, puis donnez simplement le nom de l'exe.Cela retournera vrai si trouvé local ou dans des chemins d'accès à l'échelle du système.
la source