105 votes

Puis-je avoir un bloc IF dans un fichier de commandes DOS?

Dans un fichier batch DOS, nous ne pouvons avoir qu'une ligne si le corps de l'instruction? Je pense avoir trouvé quelque part que je pourrais utiliser () pour un bloc if comme le {} utilisé dans les langages de programmation de type C, mais cela n'exécute pas les instructions lorsque j'essaie. Aucun message d'erreur non plus. C'est mon code:

 if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
 

Étrangement, ni «GP Manager is up» ni «GP Manager is down» ne sont imprimés lorsque j'exécute le fichier de traitement par lots.

148voto

Cody Gray Points 102261

Vous pouvez en effet le lieu de créer un bloc d'instructions à exécuter après un conditionnel. Mais vous avez la syntaxe de mal. Les parenthèses doivent être utilisés exactement comme indiqué:

if <statement> (
    do something
) else (
    do something else
)

Cependant, je ne crois pas qu'il y est intégré dans la syntaxe pour else-if des déclarations. Vous malheureusement besoin de créer des blocs imbriqués d' if des déclarations de gérer cela.


Deuxièmement, %GPMANAGER_FOUND% == true test recherche puissant suspect pour moi. Je ne sais pas ce que la variable d'environnement est définie sur, ou la façon dont vous êtes le fixer, mais je doute fort que le code que vous avez montré qui va produire le résultat que vous recherchez.


L'exemple de code suivant fonctionne très bien pour moi:

@echo off

if ERRORLEVEL == 0 (
    echo GP Manager is up
    goto Continue7
)
echo GP Manager is down
:Continue7

Veuillez noter quelques détails spécifiques au sujet de mon exemple de code:

  • L'espace entre la fin de l'instruction conditionnelle, et l'ouverture de la parenthèse.
  • Je suis en train d' @echo off garder de voir tous les états imprimés à la console au moment de leur exécution, et au lieu de voir la sortie de ceux qui sont spécifiquement commencer avec echo.
  • Je suis en utilisant le haut- ERRORLEVEL variable tout comme un test. Lire plus ici

18voto

Nick Points 61

Logiquement, Cody réponse doit travailler. Cependant, je ne pense pas que l'invite de commande gère un bloc de code logiquement. Pour la vie de moi je ne peux pas obtenir que cela fonctionne correctement avec n'importe quel de plus d'une commande dans le bloc. Dans mon cas, de nombreux tests ont révélé que toutes les commandes dans le bloc sont en train d'être mis en cache, et exécutées simultanément à la fin du bloc. Bien sûr, cela ne donne pas les résultats escomptés. Voici un exemple simpliste:

if %ERRORLEVEL%==0 (
set var1=blue
set var2=cheese
set var3=%var1%_%var2%
)

Cela devrait fournir var3 avec la valeur suivante:

blue_cheese

mais au lieu de cela, on obtient:

_

parce que tous les 3 commandes sont mises en cache et exécutées simultanément à la sortie du bloc de code.

J'ai été en mesure de surmonter ce problème en ré-écriture du bloc si seulement l'exécution d'une commande goto - et en ajoutant un peu de labels. Son maladroit, et je n'aime pas beaucoup cela, mais au moins il fonctionne.

if %ERRORLEVEL%==0 goto :error0
goto :endif

:error0
set var1=blue
set var2=cheese
set var3=%var1%_%var2%

:endif

4voto

Louis Points 21

Au lieu de cela goto désordre, essayez d'utiliser l'esperluette & ou double esperluette && (conditionnel à errorlevel 0) comme séparateurs de commande.

Je fixe un extrait de script avec ce truc, pour résumer, j'ai trois fichiers batch, qui appelle les deux autres après avoir trouvé les lettres des disques durs externes ont été assignés. Je laisse le premier fichier sur le premier disque externe, de sorte que les appels à sa routine de sauvegarde a bien fonctionné, mais les appels à la seconde partie nécessaire d'un lecteur actif de changement. Le code ci-dessous montre comment j'ai corrigé:

pour %%b in (d e f g h i j k l m n o p q r s t u v w x y z) DO ( si exist "%%b:\Backup.cmd" %%b: & APPEL "%%b:\Backup.cmd" )

0voto

vinniejohnson Points 1

Peut-être un peu tard, mais j'espère que ça ira:

 @echo off 

if %ERRORLEVEL% == 0 (
msg * 1st line WORKS FINE rem You can relpace msg * with any othe operation...
goto Continue1
)
:Continue1
If exist "C:\Python31" (
msg * 2nd line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue2
)
:Continue2
If exist "C:\Python31\Lib\site-packages\PyQt4" (  
msg * 3th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue3
)
:Continue3
msg * 4th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue4
)
:Continue4
msg * "Tutto a posto" rem You can relpace msg * with any othe operation...
pause
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X