Expressions conditionnelles

Les commandes DO (lorsqu'elles sont utilisées avec le mot-clé UNTIL ou WHILE), IF, IFF/ELSEIFF et la fonction variable @IF évaluent une expression conditionnelle et exécutent une action différente selon que l'expression est VRAIE  ou non .La  commande SWITCH teste l'égalité de paires de valeurs. La plupart des exemples ci-dessous utilisent la  commandeIF, mais les expressions conditionnelles peuvent également être utilisées dans les autres cas ci-dessus.

 

Une expression conditionnelle peut être l'une des suivantes, comme décrit ci-dessous :

 

Onestepexpression relationnelle
Onesteptest d'état
Onestepexpression logique

 

Expression relationnelle

 

Une expression relationnelle compare deux chaînes de caractères en utilisant l'un des opérateurs relationnels du tableau ci-dessous. Chacune de ces deux chaînes de caractères peut contenir du texte littéral, des variables d'environnement et des variables internes, ainsi que des fonctions variables, y compris celles définies par l'utilisateur, dans n'importe quelle combinaison. Notez que les guillemets doubles sont significatifs.

 

Comparaison de nombres et de chaînes de caractères

 

Pour comparer les deux chaînes de caractères, on utilise soit une comparaison numérique, soit une comparaison de chaînes. Une comparaison numérique traite les chaînes comme des valeurs numériques et les teste arithmétiquement. Une comparaison de chaînes de caractères traite les chaînes comme du texte. L'analyseur syntaxique utilise les règles décrites pour la  fonction @NUMERIC afin de déterminer si les chaînes sont numériques ou non, et ce n'est que si les deux sont numériques qu'une comparaison numérique est effectuée. Si l'une des deux valeurs n'est pas numérique, une comparaison de chaînes de caractères est effectuée. Pour forcer une comparaison de chaînes lorsque les deux valeurs peuvent être numériques, utilisez des guillemets doubles autour des valeurs que vous testez, comme indiqué ci-dessous. Le guillemet n'étant pas un caractère numérique, une comparaison de chaîne est effectuée. La comparaison numérique ne peut pas être forcée. Pour comparer numériquement des nombres hexadécimaux, vous devez les convertir en nombres décimaux à l'aide de @CONVERT. Cela n'est pas nécessaire si les deux sont de même longueur - la comparaison de chaînes de caractères et la comparaison numérique donnent le même résultat.

 

L'exemple ci-dessous illustre la différence entre les comparaisons numériques et les comparaisons de chaînes de caractères, comme le montre le tableau ci-dessous. Numériquement, 2 est plus petit, mais en tant que chaîne de caractères, il est "plus grand" parce que son premier chiffre est plus grand que le premier chiffre de 19. Lapremière de ces conditions seradonc  vraie, et la seconde sera fausse :

 

expression

valeur

type de comparaison

2 lt 19

vrai

numérique

"2" lt "19"

faux

chaîne de caractères

 

Formats des expressions relationnelles

 

Le format d'une expression relationnelle est l'un des suivants

 

num1 opérateur relationnel num2

chaîne1 opérateur relationnel chaîne2

 

Remarque : la syntaxe correcte exige que soit précédé et suivi d'un espace  pour séparer l'opérateur de ses opérandes . Les constructions courantes telles que %a==b peuvent fonctionner ou non en fonction des paramètres spécifiques, mais elles ne sont jamais recommandées.

 

Opérateurs relationnels

 

opérateur

comparaison numérique : l'expression est vraie si

comparaison de chaînes de caractères : l'expression est vraie si, en ignorant la casse des caractères :

EQ or ==

num1 est égal à num2

chaîne1 égale chaîne2

NE or !=

num1 n' est pas égal ànum2

chaîne1 n'est pas égale àchaîne2

LT

num1 est inférieur ànum2

chaîne1 précède alphabétiquement chaîne2

LE

num1 estinférieur ou égal ànum2

chaîne1 précède alphabétiquement ou est égale à chaîne2

GE

num1 estsupérieur ou égal ànum2

chaîne1 alphabétiquement succède ou est égale àchaîne2

GT

num1 est supérieur ànum2

chaîne1 succède alphabétiquement à chaîne2

EQC

testées en tant que chaînes è

chaîne1 est identique à chaîne2, y compris la casse des caractères

=~

test d'expression régulière

lachaîne1 correspond à l'expression régulière de la chaîne2

!~

test de l'expression régulière

string1 ne correspond pas à l'expression régulière de string2

 

Lesdifférences de casse sont ignorées dans les comparaisons de chaînes (sauf par EQC). Si deux chaînes commencent par le même texte mais que l'une d'elles est plus courte, on considère que la chaîne la plus courte précède (est inférieure à) la chaîne la plus longue. Par exemple, "a" est inférieur à "abc" et "hello_there" est supérieur à "hello".

 

Lorsque vous comparez des chaînes de texte, il peut être nécessaire de mettre les paramètres entre guillemets afin d'éviter les erreurs de syntaxe qui peuvent se produire si l'une des valeurs des paramètres est vide (parexemple, en raison d'une variable d'environnement à laquelle aucune valeur n'a jamais été attribuée). Cette technique ne fonctionne pas pour les comparaisons numériques, car les guillemets forcent une comparaison de chaînes de caractères. Pour les tests numériques, vous devez donc vous assurer que toutes les variables ont une valeur avant d'effectuer le test.

 

Afin de maintenir la compatibilité avec CMD, TCC reconnaît les noms supplémentaires suivants pour les conditions :

 

CMD

TCC

EQL or EQU

EQ

NEQ

NE

LSS

LT

LEQ

LE

GTR

GT

GEQ

GE

 

Les variables internes et les fonctions de variables sont très puissantes lorsqu'elles sont combinées à des comparaisons de chaînes de caractères et à des comparaisons numériques. Elles vous permettent de tester l'état de votre système, les caractéristiques d'un fichier, la date et l'heure ou le résultat d'un calcul. Vous pouvez passer en revue les variables et les fonctions de variables pour déterminer la meilleure façon de mettre en place un test de condition.

 

Test d'état

 

Ces conditions permettent de tester le système d'exploitation, le système de fichiers ou l'état de l'ordinateur. TCC d'exploitation, du système de fichiers ou de l'état de l'ordinateur. En plus des tests ci-dessous, il existe de nombreuses variables internes et fonctions variables qui vous permettent de tester l'état de nombreuses autres parties du système.

 

Dans les descriptions ci-dessous des différents tests d'état, les tests d'état sont vrais si et seulement si la condition spécifiée est vraie.

 

DEFINED variable

Si la variable existe dans l'environnement, l'expression est vraie. Cela équivaut à tester si la variable est ou non non vide.




Remarque : lesvariables GOSUB, les variables de tableau et les variables internes n 'existent pas dans l'environnement et échouent donc toujours au test DEFINED.



ERRORLEVEL [opérateur relationnel] n

Ce test récupère le code de sortie du programme externe précédent. Par convention, les programmes renvoient un code de sortie de 0 lorsqu'ils réussissent et un nombre non nul pour indiquer une erreur. L'opérateur relationnel peut être l'un de ceux énumérés ci-dessus (par exemple, EQ, GT). Si aucun opérateur n'est spécifié, la valeur par défaut est GE. La comparaison se fait numériquement.




Tous les programmes ne renvoient pas un code de sortie explicite. Pour les programmes qui ne le font pas, le comportement de ERRORLEVEL est indéfini.



EXIST filename

Si le nom de fichier correspond à un fichier existant, l'expression est vraie. Vous pouvez utiliser des caractères génériques dans le nom de fichier, auquel cas l'expression est vraie si un fichier correspondant au nom du caractère générique existe. Le nom de fichier peut inclure un chemin d'accès absolu ou relatif.




ATTENTION : Sous Windows, l'expression sera vraie s'il existe un fichier ou un répertoire nommé nom de fichier. Utilisez ISFILE ou ISDIR à la place.




Le nom de fichier spécial NUL est couramment utilisé dans les fichiers batch CMD pour tester l'existence d'un répertoire. L'expression exist xxx\NUL n'est vraie que si xxx est un répertoire.



ISALIAS aliasname

Si alias est défini comme un alias, l'expression est vraie.



ISAPP appname

Si appname correspond au nom d'une application en cours d'exécution, l'expression est vraie. Pour faire correspondre une application spécifique, vous devez saisir le chemin d'accès complet de l'application. Les noms partiels et les caractères génériques ne donneront pas de résultats fiables. Lesformes courte et longue du nom de fichier seront vérifiées (voir Recherches de fichiers LFN pour plus de détails sur la correspondance entre les noms de fichiers courts et longs).


Ce test peut nécessiter le privilège DEBUG.



ISBATCH filename

Si le nom de fichier spécifié est un fichier batch, l'expression est vraie.



ISDIR path

DIREXIST path

 

Si le répertoire spécifié par le chemin existe, l'expression est vraie. Le chemin d'accès peut être absolu ou relatif. DIREXIST peut être utilisé comme synonyme de ISDIR.



ISFILE filename

Si nom de fichier correspond à un fichier existant, l'expression est vraie. Vous pouvez utiliser des caractères génériques dans le nom de fichier, auquel cas l'expression est vraie si un fichier correspondant au nom du caractère générique existe. ISFILE ne correspond qu'à des fichiers, pas à des répertoires.



ISFUNCTION name

Si le nom de la fonction définie par l'utilisateur est chargé, l'expression est vraie.



ISINTERNAL command

Si la commande est une commande interne active, l'expression est vraie. Lescommandes peuvent être activées et désactivées à l'aide de la  commande SETDOS /I.



ISLABEL label

Si l'étiquette existe dans le fichier batch actuel, l'expression est vraie. Les étiquettes peuvent être composées d'un ou plusieurs mots. Notez que ce test n'a rien à voir avec les étiquettes de partition de disque.



ISLIBRARY name

Si le nom est une fonction de bibliothèque, l'expression est vraie



ISPLUGIN name

Si le nom est une variable, une fonction ou une commande de plugin, l'expression est vraie.



ISREADABLE filename

Si le nom du fichier est lisible, l'expression est vraie.



ISSYMLINK filename

Si le fichier est un lien symbolique, l'expression est vraie.



ISVISIBLE "title"

Si la fenêtre spécifiée est visible, l'expression est vraie (cela signifie que Windows a activé le drapeau de visibilité ; cela ne signifie pas que la fenêtre est nécessairement visible sur le bureau).



ISWRITEABLE filename

Si le nom de fichier est accessible en écriture, l'expression est vraie.



ISHUNG "title"

Si la fenêtre spécifiée ne répond pas, l'expression est vraie.

 

PLUGIN module

Si le module d'extension est chargé, l'expression est vraie. Ne pas inclure d'extension (par exemple, ".dll") pour le nom du module.

 

Expressions logiques

 

Une expression logique est l'une des expressions suivantes

 

 Onestep        une expression relationnelle

 Onestep        un test d'état

 Onestep        l'opérateur logique unaire NOT (ou !) suivi d'une expression logique

 Onestep        deux expressions logiques reliées par un opérateur logique binaire

 

Opérateurs logiques

 

opérateur

type

utilisation

est VRAI si

NOT

unaire

NOT cond

est FAUX.

.AND.

binaire

cond1 .AND. cond2

cond1 et cond2 sont tous deux VRAIS.

.OR.

binaire

cond1 .OR. cond2

au moins l'un de cond1 et cond2 est VRAI.

.XOR.

binaire

cond1 .XOR. cond2

l'un des cond1 et cond2 est VRAI, et l'autre est FAUX.

 

Cet exemple exécute un programme appelé DATALOAD si nous sommes aujourd'hui lundi ou mardi (à saisir sur une seule ligne):

 

if "%_dow" == "Mon" .or. "%_dow" == "Tue" dataload

 

Lesconditions de test sont toujours analysées de gauche à droite - iln'y a pas d'ordre de priorité implicite, comme c'est le cas dans certains langages de programmation. Vous pouvez toutefois imposer un ordre de test spécifique en regroupant les conditions avec des parenthèses, par exemple (saisissez ceci sur une seule ligne) :

 

if (%a == 1 .or. (%b == 2 .and. %c == 3)) echo something

 

Combinaison d'expressions logiques

 

Lesparenthèses ne peuvent être utilisées que lorsque la partie de l'expression située à l'intérieur des parenthèses contient au moins un des opérateurs logiques binaires .and., .or. ou .xor. Les parenthèses sur une expression simple qui ne combine pas deux tests ou plus seront considérées comme faisant partie de la chaîne à tester et feront probablement échouer le test. Par exemple, le premier de ces tests est FAUX, le second est VRAI:

 

(a == a)

(a == a .and. b == b)

 

Les parenthèses peuvent être imbriquées.

 

Exemples

 

Ce fragment defichier batch exécute un programme appelé WEEKLY si nous sommes lundi :

 

if "%_dow" == "mon" weekly

 

Ce fragment de fichier batch teste la présence d'une chaîne de caractères :

 

input "Enter your selection : " %%cmd

if "%cmd" == "WP" goto wordproc

if "%cmd" NE "GRAPHICS" goto badentry

 

Cet exemple appelle GO.BTM si les deux premiers caractères du fichier MYFILE sont GO:

 

if "%@left[2,%@line[myfile,0]]" == "GO" call go.btm

 

Le premier fragment de fichier batch ci-dessous vérifie l'existence du fichierA:\JAN.DOC avant de le copier sur le lecteur C (cela évite l'affichage d'un message d'erreur si le fichier n'existe pas) :

 

if isfile a:\jan.doc copy a:\jan.doc c:\

 

Cet exemple teste le code de sortie du programme précédent et arrête tout traitement du fichier batch en cas d'erreur :

 

if errorlevel == 0 goto success

echo "External Error; Batch File Ends!"

cancel