Dans un fichier batch DOS, nous ne pouvons avoir qu'une seule ligne si le corps de l'instruction? Je pense que j'ai trouvé quelque part que je pourrais utiliser ()
pour un bloc if, tout comme celui {}
utilisé dans les langages de programmation de type C, mais il n'exécute pas les instructions lorsque j'essaye ceci. Aucun message d'erreur non plus. Voici mon code:
if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7
Étrangement, ni «GP Manager est actif» ni «GP Manager est arrêté» ne sont imprimés lorsque j'exécute le fichier de commandes.
if-statement
batch-file
Hugh Darling
la source
la source
Réponses:
Vous pouvez en effet placer create un bloc d'instructions à exécuter après un conditionnel. Mais vous avez une mauvaise syntaxe. Les parenthèses doivent être utilisées exactement comme indiqué:
Cependant, je ne pense pas qu'il existe une syntaxe intégrée pour les
else-if
déclarations. Vous devrez malheureusement créer des blocs d'if
instructions imbriqués pour gérer cela.Deuxièmement, ce
%GPMANAGER_FOUND% == true
test me paraît très 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 montré produise le résultat que vous recherchez.L'exemple de code suivant fonctionne très bien pour moi:
Veuillez noter quelques détails spécifiques sur mon exemple de code:
@echo off
de ne pas voir toutes les instructions imprimées sur la console lors de leur exécution, et à la place de voir simplement la sortie de celles qui commencent spécifiquement parecho
.ERRORLEVEL
variable intégrée comme test. En savoir plus icila source
ERRORLEVEL
n'est pas la réponse à son problème. Je publiais simplement un exemple de la syntaxe appropriée. L'une ou l'autre forme est acceptable dans ce cas, tout comme le seraitif 0 == 0
ou toute autre expression triviale. Mais en effet, assurez-vous de bien comprendre la différence entre la variable d'environnement%ERRORLEVEL%
et l'interneERRORLEVEL
du processeur de commande. Raymond Chen l'explique joliment ici sur ce blog .REM This is a comment (or so I thought)
jeter dans leIF
bloc vous dérangera.IF %somevar%==example_string2
il doit toujours être du code, donc l'opérande est résolu parIF "value_of_somevar"=="example_string2
"pour éviter que les caractères spéciaux dans l'un ou l'autre des opérandes de chaîne ne provoquent des erreurs de syntaxe dans l'IF
instruction. Les valeurs que vous définissez doivent toujours être définies carset "somevar=value_of_somevar"
Cette syntaxe vous permet d'échapper des caractères spéciaux dans les valeurs de variable. Remarque que je ne veux pas direset somevar="value_of_somevar"
Logiquement, la réponse de Cody devrait fonctionner. Cependant, je ne pense pas que l'invite de commande gère un bloc de code de manière logique. Pour la vie de moi, je ne peux pas faire fonctionner cela correctement avec plus d'une seule commande dans le bloc. Dans mon cas, des tests approfondis ont révélé que toutes les commandes du bloc sont mises en cache et exécutées simultanément à la fin du bloc. Cela ne donne évidemment pas les résultats escomptés. Voici un exemple simplifié à l'extrême:
Cela devrait fournir à var3 la valeur suivante:
mais donne à la place:
car 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 n'aime pas beaucoup ça, mais au moins ça marche.
la source
set var3=!var1!_!var2!
Au lieu de cela, essayez d'utiliser l'esperluette & ou la double esperluette && (conditionnelle au niveau d'erreur 0) comme séparateurs de commandes.
J'ai corrigé un extrait de script avec cette astuce, pour résumer, j'ai trois fichiers batch, l'un qui appelle les deux autres après avoir trouvé les lettres attribué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écessitaient un changement de lecteur actif. Le code ci-dessous montre comment je l'ai corrigé:
la source
Je suis tombé sur cet article dans les résultats renvoyés par une recherche liée à la commande IF dans un fichier batch, et je n'ai pas pu résister à l'opportunité de corriger l'idée fausse selon laquelle les blocs IF sont limités à des commandes uniques. Voici une partie d'un script de commande de production Windows NT qui s'exécute quotidiennement sur la machine sur laquelle je compose cette réponse.
Peut-être que les blocs de deux lignes ou plus s'appliquent exclusivement aux scripts de commande Windows NT (fichiers .CMD), car une recherche dans le répertoire des scripts de production d'une application qui est limitée aux fichiers batch old school (.BAT) n'a révélé que des blocs à une commande . Étant donné que l'application est entrée en 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'avais pas besoin de plus d'une ligne ou que je ne pouvais pas les faire fonctionner.
Quoi qu'il en soit, si ce dernier est vrai, il existe une solution de contournement simple; déplacez les lignes multiples dans un fichier batch séparé ou un sous-programme de fichier batch. Je sais que ce dernier fonctionne dans les deux types de scripts.
la source
Peut-être un peu tard, mais j'espère que ça va:
la source