web-dev-qa-db-fra.com

cmd: si existe A et B alors

Quelle est la méthode la plus simple et/ou la plus lisible pour IF avec AND dans un shell CMD? En pseudo code:

IF EXIST file1 AND file2:
   then do stuff
ELSE: 
   do something else

ce Q doit être quelque part sur SO mais mon fu de recherche ne fonctionne pas pour celui-ci. Pardon

6
matt wilkie

En supposant que vous parlez de fichiers de commandes DOS/Windows, je pense que vous voulez quelque chose comme ceci:

SET do_stuff=false
IF EXIST file1 IF EXIST file2 SET do_stuff=true
IF "%do_stuff%"=="true" (
    REM do stuff
) ELSE (
    REM do something else
)

La source de la laideur est que les instructions if du fichier de commandes DOS n’ont pas d’opérateurs et et ou , vous devez donc écrire des instructions imbriquées if (ce qui peut entraîner une duplication du code dans le fichier). then et else clauses), ou capturez le résultat de l'expression dans une variable, puis effectuez une instruction if sur sa valeur (beaucoup plus de lignes). Je privilégie la deuxième approche pour éviter la duplication de code. Peut-être que tout cela est une fonctionnalité de sécurité. :)

J'ai trouvé de bons exemples ici et ici (SO, même) . Mais vous pouvez aussi simplement utiliser le système d’aide intégré au shell (help if ou if /? IIRC).

14
Randall Cook

Une alternative à la suggestion plutôt sympa de @Randall Cook pourrait se passer comme ceci:

IF EXIST file1 IF EXIST file2 (
  do stuff
  GOTO cont
)
do something else

:cont
get on with other stuff
5
Andriy M
IF EXIST A (
    IF EXIST B (
        ECHO A and B exist
        )
    )
4
Shirulkar

J'ai appris un peu depuis la réponse de @ RandallCook était la meilleure pour moi. C'est ce que j'utiliserais maintenant:

@echo off
IF EXIST "File1" IF EXIST "File2" GOTO :do_stuff
GOTO :not_exist
GOTO :EOF

:do_stuff
    echo File1 and File2 exist.
    echo -- Doing stuff here...
    goto :EOF

:not_exist
    echo  Condition not met, not doing stuff.
    goto :EOF

:EOF une étiquette prédéfinie qui quittera le sous-programme ou le script en cours.

Pour ceux qui préfèrent CALL par rapport à GOTO car cela conduit à un code plus propre dans des scripts plus longs, nous devons compliquer un peu les choses, mais restons lisibles:

@echo off
:: Successful CD resets errorlevel to 0, in case it was already set this Shell
cd
IF EXIST "File1" IF EXIST "File2" CALL :do_stuff
IF ERRORLEVEL 10 GOTO :EOF
CALL :not_exist
GOTO :EOF

:do_stuff
    echo File1 and File2 exist.
    echo -- Doing stuff here...
    exit /b 10
    goto :EOF

:not_exist
    echo  Condition not met, not doing stuff.
    goto :EOF
1
matt wilkie
set /p k="Please enter Choice : "

si "% k%" == "A" allez à A si "% k%" == "B" allez à B

: Un echo "Bonjour de A": B echo "Bonjour de B"

0
Sheshan Gamage