2010-06-02 6 views
2

Je veux écrire un script batch simple, qui appelle un certain exe, mais si celui-ci n'est pas trouvé, il devrait appeler un autre exe.Windows batch: réagit à la commande non trouvée

donc dans pseudocode

set file=c:\path\tool.exe 
if(fileexists(file)) 
{ 
    call file 
} 
else 
{ 
    call c:\somethingelse.exe 
} 

merci!

Répondre

3

Vous pouvez utiliser ERRORLEVEL pour vérifier si l'appel exécuté avec succès.

call file.exe 
IF ERRORLEVEL 1 other.exe 

Ceci fonctionnera pour les exécutables qui se trouvent dans le chemin et dont vous ne connaissez pas l'emplacement exact. Il va imprimer un message d'erreur si.

+0

Notez que vous pouvez également couper ce court-circuit: 'file.exe || other.exe' (et vous n'avez pas besoin de 'call' de toute façon.) – Joey

+0

Le problème avec ceci, c'est que si file.exe existe, mais échoue pour une raison quelconque, il va aussi exécuter other.exe. other.exe si file.exe échoue en raison de ne pas exister. –

2

Peut-être que quelque chose comme ça pourrait fonctionner?

set FILE=whatever.exe 
IF EXIST %FILE% GOTO okay 

:notokay 
echo NOT FOUND 
GOTO end 

:okay 
echo FOUND 
%FILE% 

:end 
3

ressemblent étrangement à la pseudo-code écrit dans la question initiale:

set FILE1=c:\path\tool.exe 
set FILE2=c:\path\to\other\tool.exe 
if exist "%FILE1%" (
    %FILE1% 
) else (
    %FILE2% 
) 

Comme Joey a fait remarquer c'est en fait la forme ouverte de:

%FILE1% || %FILE2% 

mais je ne suis pas d'accord. Les anciens runs FICHIER2

  1. quand FILE1 existe pas, ou
  2. EXISTE mais a échoué.

Il imprime également un message d'erreur supplémentaire lorsqu'un fichier ne peut pas être exécuté (principalement parce qu'il n'a pas été trouvé ou que l'accès est interdit). Pour supprimer cette utilisation du message:

(%FILE1% || %FILE2%) 2>nul 

Par exemple

> (echo a || echo b) 
a 
> (echoa || echo b) 2>nul 
b 

Pour supprimer toute sortie, et juste arranger que l'un des deux fichiers est exécuté:

(%FILE1% || %FILE2%) 1>&2 2>nul 

ou:

((%FILE1% || %FILE2%) 1>&2 2>nul) || echo both have failed 

comme dans:

> ((echo a || echo b) 2>nul) || echo both have failed 
a 
> ((echoa || echo b) 2>nul) || echo both have failed 
b 
> ((echoa || echob) 2>nul) || echo both have failed 
both have failed 
Questions connexes