Opérateurs logiques (“et”, “ou”) en batch DOS

Comment implémenteriez-vous les opérateurs logiques dans les fichiers batch DOS?

Vous pouvez faire and avec des conditions nestedes:

 if %age% geq 2 ( if %age% leq 12 ( set class=child ) ) 

ou:

 if %age% geq 2 if %age% leq 12 set class=child 

Vous pouvez faire or avec une variable séparée:

 set res=F if %hour% leq 6 set res=T if %hour% geq 22 set res=T if "%res%"=="T" ( set state=asleep ) 

L’instruction IF ne prend pas en charge les opérateurs logiques ( AND et OR ), les instructions IF cascade IF une conjonction implicite.

 IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL 

Si File1.Dat et File1.Dat existent, sautez l’étiquette FILE12_EXIST_LABEL .

Voir aussi: IF /?

Les lois de De Morgan nous permettent de convertir les disjonctions (“OR”) en équivalents logiques en utilisant uniquement les conjonctions (“AND”) et les négations (“NOT”). Cela signifie que nous pouvons enchaîner les disjonctions (“OU”) sur une seule ligne.

Cela signifie que si le nom est “Yakko” ou “Wakko” ou “Dot”, alors faites écho à “frère ou soeur Warner”.

 set warner=true if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false if "%warner%"=="true" echo Warner brother or sister 

Ceci est une autre version de l’exemple “OR” de paxdiablo, mais les conditions sont chaînées sur une seule ligne. (Notez que le contraire de leq est gtr , et le contraire de geq est lss .)

 set res=true if %hour% gtr 6 if %hour% lss 22 set res=false if "%res%"=="true" set state=asleep 

Les exemples suivants montrent comment créer une instruction AND (utilisée pour définir des variables ou inclure des parameters pour une commande).

Pour fermer la fenêtre CMD et démarrer le Bloc-notes:

 exit & start notepad.exe 

Définir les variables x, y et z sur des valeurs si la variable ‘a’ est égale à blah.

 if %a% equ blah set x=1 & set y=2 & set z=3 

J’espère que cela pourra aider!

Aussi couvert dans
“120} Comment utiliser les opérateurs AND / OR / XOR / NOT dans une instruction IF?”
http://www.netikka.net/tsneti/info/tscmd120.htm

OU est légèrement difficile, mais pas trop. Voici un exemple

 set var1=%~1 set var2=%~2 :: set or_= if "%var1%"=="Stack" set or_=true if "%var2%"=="Overflow" set or_=true if defined or_ echo Stack OR Overflow 

Une alternative consiste à rechercher un shell unix qui vous donne des opérateurs logiques et beaucoup plus. Vous pouvez obtenir une implémentation native win32 d’un shell Bourne ici si vous ne souhaitez pas utiliser l’itinéraire cygwin. Un bash natif peut être trouvé ici . Je suis certain que vous pouvez facilement consulter d’autres bonnes alternatives telles que zsh ou tcsh.

K

Essayez l’opérande de négation – “non”!

Eh bien, si vous pouvez effectuer l’opération ‘AND’ sur une instruction if en utilisant ‘if’s (reportez-vous aux réponses précédentes), alors vous pouvez faire la même chose avec’ if ” pour effectuer une opération ‘ou’.

Si vous n’avez pas encore cette idée, lisez la suite. Sinon, ne perdez pas votre temps et reprenez la programmation.

Juste comme nested ‘si est satisfait seulement quand toutes les conditions sont vraies, nestedes’ si elles ne sont satisfaites que lorsque toutes les conditions sont fausses. Ceci est similaire à ce que vous voulez faire avec un opérande ou un opérande, n’est-ce pas?

Même lorsque l’une des conditions de l’imbrication “si non” est vraie, l’instruction entière rest non satisfaite. Par conséquent, vous pouvez utiliser negated ‘si est en succession en vous rappelant que le corps de la déclaration de condition doit être ce que vous voulez faire si toutes vos conditions nestedes sont fausses. Le corps que vous vouliez réellement donner devrait relever de la déclaration else.

Et si vous ne comprenez toujours pas la chose, désolé, j’ai 16 ans et c’est ce que je peux faire de mieux pour vous expliquer.

Athul Prakash (16 ans à l’époque) a donné une idée logique de la manière d’implémenter un test OR en annulant les conditions dans les instructions IF, puis en utilisant la clause ELSE comme emplacement pour mettre le code à exécuter. Je me suis dit qu’il y avait cependant deux clauses supplémentaires, car il suggère d’utiliser deux instructions IF, et le code exécuté doit donc être écrit deux fois . Cependant, si un GOTO est utilisé pour ignorer le code requirejs, au lieu d’écrire des clauses ELSE, le code à exécuter doit être écrit une seule fois .

Voici un exemple testable de la manière dont j’implémenterais la logique négative d’Athul Prakash pour créer un bloc opératoire.

Dans mon exemple, quelqu’un est autorisé à conduire un char s’ils ont un permis de char OU s’ils font leur service militaire . Entrez true ou false aux deux invites et vous pourrez voir si la logique vous permet de conduire un char.

 @ECHO OFF @SET /p tanklicence=tanklicence: @SET /p militaryservice=militaryservice: IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice% :done PAUSE 

C’est aussi simple que les suivants:

ET> si + si

 if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something* 

OU> si // si

 set BOTH=0 if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1 if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something* if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something* 

Je sais qu’il y a d’autres réponses, mais je pense que la mine est plus simple, donc plus facile à comprendre. J’espère que cela vous aidera! 😉

Si vous êtes intéressé à écrire un if + AND / OR dans une déclaration, il n’y en a pas. Mais, vous pouvez toujours regrouper if avec && / || et les instructions ( / ) pour obtenir ce que vous voulez dans une ligne sans aucune variable supplémentaire et sans duplication de bloc if-else (commande echo unique pour les sections de code TRUE et FALSE ):

 @echo off setlocal set "A=1" & set "B=2" & call :IF_AND set "A=1" & set "B=3" & call :IF_AND set "A=2" & set "B=2" & call :IF_AND set "A=2" & set "B=3" & call :IF_AND echo. set "A=1" & set "B=2" & call :IF_OR set "A=1" & set "B=3" & call :IF_OR set "A=2" & set "B=2" & call :IF_OR set "A=2" & set "B=3" & call :IF_OR exit /b 0 :IF_OR ( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+ exit /b 0 :IF_AND ( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE- exit /b 0 

Sortie :

 TRUE+ FALSE- FALSE- FALSE- TRUE+ TRUE+ TRUE+ FALSE- 

L’astuce réside dans la commande type qui supprime / définit le niveau d’ errorlevel et gère ainsi le chemin vers la commande suivante.

Légère modification de la réponse d’Andry, réduisant les commandes de type dupliqué:

 set "A=1" & set "B=2" & call :IF_AND set "A=1" & set "B=3" & call :IF_AND set "A=2" & set "B=2" & call :IF_AND set "A=2" & set "B=3" & call :IF_AND echo. set "A=1" & set "B=2" & call :IF_OR set "A=1" & set "B=3" & call :IF_OR set "A=2" & set "B=2" & call :IF_OR set "A=2" & set "B=3" & call :IF_OR goto :eof :IF_OR (if /i not %A% EQU 1 ( if /i not %B% EQU 2 ( echo FALSE- type 2>nul ) )) && echo TRUE+ goto :eof :IF_AND (if /i %A% EQU 1 ( if /i %B% EQU 2 ( echo TRUE+ type 2>nul ) )) && echo FALSE- goto :eof