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?
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found
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.
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"
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
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
)
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