web-dev-qa-db-fra.com

Déterminez si la commande est reconnue dans un fichier de commandes

J'écris un script BAT dans lequel j'invoque un programme (tel que Javac). Pour la simplicité, je veux vérifier si la commande existe avant que je l'exécute. c'est-à-dire si la commande existe dans le chemin.

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
)

Quel est le meilleur moyen de le faire sous Windows?

45
user46097
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 
59
Josh Santangelo

Le code ci-dessous doit toujours exécuter proprement sans sortie de déchets.

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

Production:

found javac

Le même code qu'un one-liner:

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

Production:

fail

Notez que l'ordre de && et || semble compter. En outre, le commandement dont vous testez l'existence pour répondre à une fauve d'erreur <= 0 pour que cela fonctionne. Espérons que le commandement a /? ou --Help arguments ou, comme avec Java, une commande d'informations de version.

15
ngreen

Pour ma situation. Le moyen absolu le plus simple utilise le || ou && opérateur.

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

ou alors

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

Quelques raffinements à la version ci-dessous. Testez cette commande existant et supprimez la sortie inutile.

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

Si l'installation d'outils supplémentaires est correcte, il y a une commande where dans les kits de ressources; Voir Equivalent Windows de l'endroit? .

Sinon, pour les versions des fenêtres qui ne sont pas trop anciennes, elle est faisable en pure cmd, comme mentionné dans DOS Lookup exécutable à l'exception du chemin .

Je sais que ce n'est pas tout à fait ce que vous recherchez, mais avec un léger changement de logique, cela devrait accomplir ce dont vous avez besoin.

Chaque commande qui est exécutée a un code de retour (AKA errorlevel), si le code de retour est 0 (zéro), la commande est exécutée avec succès, si le code de retour est supérieur à 0, quelque chose a mal tourné.

Voir ICI pour plus de détails.

Quelque chose comme -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)
1
bryan

Bien que toutes ces personnes puissent fonctionner, pourquoi pas la manière intégrée?

If exists my_command do echo "my_command exists"

Courir "si /?" Sur la ligne de commande pour plus de détails

0
uSlackr