web-dev-qa-db-fra.com

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.

84
Hugh Darling

Vous pouvez en effet créer un bloc d'instructions à exécuter après une condition. Mais vous avez la syntaxe fausse. Les parenthèses doivent être utilisées exactement comme indiqué:

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

Cependant, je ne pense pas qu'il existe une syntaxe intégrée pour les instructions else-if. Vous devrez malheureusement créer des blocs imbriqués d'instructions if pour gérer cela.


Deuxièmement, ce test %GPMANAGER_FOUND% == true me semble extrêmement suspect. Je ne sais pas à quoi la variable d'environnement est définie ni comment vous la définissez, mais je doute fort que le code que vous avez affiché produise le résultat que vous recherchez.


L'exemple de code suivant me convient parfaitement:

@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 sur mon exemple de code:

  • Espace ajouté entre la fin de l'instruction conditionnelle et la parenthèse ouvrante.
  • Je règle @echo off pour ne pas voir tous des instructions imprimées sur la console lors de leur exécution, mais simplement pour afficher le résultat de celles commençant spécifiquement par echo.
  • J'utilise la variable ERRORLEVEL intégrée à titre de test. En savoir plus ici
121
Cody Gray

Logiquement, la réponse de Cody devrait fonctionne. Cependant, je ne pense pas que la commande Invite gère logiquement un bloc de code. Pour ma vie, je ne peux obtenir que cela fonctionne correctement avec plus d'une commande dans le bloc. Dans mon cas, des tests approfondis ont révélé que toutes les commandes du bloc étaient mises en cache et exécutées simultanément à la fin du bloc. Bien entendu, cela ne donne pas les résultats escomptés. Voici un exemple simplifié:

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

Ceci devrait fournir à var3 la valeur suivante:

blue_cheese

mais au lieu de cela:

_

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

J'ai pu surmonter ce problème en réécrivant le bloc if pour n'exécuter qu'une seule commande - goto - et en ajoutant quelques étiquettes. C'est maladroit, et je ne l'aime pas beaucoup, mais au moins ça marche.

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

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

:endif
13
Nick

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
0
vinniejohnson

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

J'ai corrigé un extrait de script avec cette astuce. En résumé, j'ai trois fichiers batch, l'un appelant les deux autres après avoir trouvé les lettres affectées aux lecteurs de sauvegarde externes. Je laisse le premier fichier sur le lecteur externe principal pour que les appels à sa routine de sauvegarde fonctionnent correctement, mais les appels au second nécessitent un changement de lecteur actif. Le code ci-dessous montre comment je l'ai corrigé:

pour %% b in (d e f g h i j k l m n p q r s v w x y z) DO ( s'il existe "%% b:\Backup.cmd" %% b: & CALL "%% b:\Backup.cmd" )

0
Louis

J'ai rencontré cet article dans les résultats renvoyés par une recherche liée à la commande IF dans un fichier de commandes et je ne pouvais pas résister à l'opportunité de corriger l'idée fausse que les blocs IF sont limités à des commandes simples. Voici une partie d'un script de commande Windows NT de production qui s'exécute quotidiennement sur la machine sur laquelle je compose cette réponse.

    if "%COPYTOOL%" equ "R" (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using RoboCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    %TOOLPATH% %SRCEPATH% %DESTPATH% /copyall %RCLOGSTR% /m /np /r:0 /tee
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Robocopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
) else (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using XCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    call %TOOLPATH%  "%USERPROFILE%\My Documents\Outlook Files\*" "%USERPROFILE%\My Documents\Outlook Files\_backups" /f /m /v /y
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Xcopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
)

Des blocs de deux lignes ou plus s’appliquent peut-être exclusivement aux scripts de commande Windows NT (fichiers .CMD), car une recherche dans le répertoire des scripts de production d’une application restreinte aux anciens fichiers batch (.BAT) n’a révélé que des blocs à commande unique. . Étant donné que l'application est entrée dans une maintenance étendue (ce qui signifie que je ne suis pas activement impliquée dans sa prise en charge), je ne peux pas dire si c'est parce que je n'ai pas besoin de plus d'une ligne, ou que je ne peux pas les faire fonctionner.

Quoi qu'il en soit, si cette dernière est vraie, il existe une solution de contournement simple; déplacez les lignes multiples dans un fichier de commandes séparé ou dans un sous-programme de fichiers de commandes. Je sais que ce dernier fonctionne dans les deux types de scripts.

0
David A. Gray