66 votes

Déterminer si la commande est reconnue dans un fichier batch

J'écris un bat script dans lequel j'invoque un programme (tel que javac). Pour simplifier, je veux vérifier si la commande existe avant de l'exécuter, c'est-à-dire si la commande existe dans PATH.

Par exemple,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

Quelle est la meilleure façon de faire cela sous Windows ?

78voto

Tom Tamaira Points 1
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found

24voto

ngreen Points 341

Le code ci-dessous devrait toujours s'exécuter proprement, sans sortie de données inutiles.

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

出力します。

found javac

Le même code qu'en une ligne :

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

出力します。

fail

Notez que l'ordre des && y || semble avoir de l'importance. De plus, la commande dont vous testez l'existence doit retourner avec un errorlevel <= 0 pour que cela fonctionne. Avec un peu de chance, la commande possède des arguments / ? ou --help ou, comme pour java, une commande d'information sur la version.

9voto

davidcann Points 1005

Le moyen le plus simple est de simplement exécuter la commande, mais cela pose d'autres problèmes, bien sûr, puisque vous ne voulez peut-être pas qu'un processus aléatoire soit lancé.

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

est une alternative qui recherche le programme dans les chemins listés par la commande %PATH% variable d'environnement. Il s'agit essentiellement d'une version purement batch de which(1) . On peut l'améliorer, mais pour l'essentiel, c'est le cas.

4voto

NomeN Points 4106

Quelques améliorations de la version ci-dessous. Teste que la commande existe et supprime la sortie inutile.

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found

3voto

user46097 Points 101

Pour ma situation. Le moyen le plus simple est d'utiliser l'opérateur || ou &&.

my_command.exe -version 2>NUL && echo "my_command exists"

o

my_command.exe -version 2>NUL || echo "my_command doesn't exist"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X