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 :
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é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.
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. |
Une expression logique est l'une des expressions suivantes
un test d'état
l'opérateur logique unaire NOT (ou !) suivi d'une expression logique
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.
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