web-dev-qa-db-fra.com

Opérateurs logiques ("et", "ou") dans un lot DOS

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

236
JoelFan

Vous pouvez faire and avec des conditions imbriquées:

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
)
274
paxdiablo

L'instruction IF ne prend pas en charge les opérateurs logiques (AND et OR), les instructions en cascade IF constituant 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 /?

66
Dave Jarvis

Les lois de De Morgan nous permettent de convertir les disjonctions ("OU") en équivalents logiques en utilisant seulement des conjonctions ("ET") et des négations ("NON"). Cela signifie que nous pouvons chaîner des disjonctions ("OU") sur une ligne.

Cela signifie que si le nom est "Yakko" ou "Wakko" ou "Dot", alors echo "frère ou sœur 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 l'opposé de leq est gtr et que l'opposé de geq est lss.)

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

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

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

start notepad.exe & exit

Pour définir les variables x, y et z sur des valeurs si la variable 'a' est égale à blah.

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

J'espère que ça t'as aidé!

5
GinDiamond

OU est légèrement délicat, 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
4
Timo Salmi

Essayez l'opérande de négation - 'pas'!

Eh bien, si vous pouvez effectuer l'opération "AND" sur une instruction if en utilisant "if" imbriqué (référez-vous aux réponses précédentes), vous pouvez faire la même chose avec "sinon" pour effectuer une opération "ou".

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

Tout comme les "si" imbriqués ne sont satisfaits que lorsque toutes les conditions sont vraies, les "si non imbriqués" ne sont satisfaits que lorsque toutes les conditions sont fausses. Ceci est similaire à ce que vous voulez faire avec un opérande 'ou', n'est-ce pas?

Même si l’une des conditions de "sinon" imbriquée est vraie, l’affirmation n’est pas remplie. Par conséquent, vous pouvez utiliser nié 'si est successif en vous rappelant que le corps de la déclaration de condition doit être ce que vous voulez faire si toutes vos conditions imbriquées sont fausses. Le corps que vous avez réellement voulu donner devrait entrer dans la déclaration else.

Et si vous ne comprenez toujours pas le truc de la chose, pardon, j'ai 16 ans et c'est le mieux que je puisse faire pour l'expliquer.

1
Athul Prakash

Si vous êtes intéressé par l'écriture d'une if + AND/OR dans une instruction, il n'y en a aucune. Mais vous pouvez toujours grouper if avec &&/|| et (/) pour obtenir ce que vous voulez sur une ligne sans aucune variable supplémentaire et sans _ if-else duplication de blocs (une seule commande echo commande pour TRUE et FALSE sections de code):

@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-

Le truc est dans la commande type qui supprime/définit le errorlevel et gère ainsi le chemin de la prochaine commande.

1
Andry

Athul Prakash (16 ans à l'époque) a donné une idée logique de la façon de mettre en œuvre un test OR en inversant les conditions des instructions IF, puis en utilisant la clause ELSE comme emplacement pour insérer le code à exécuter. Je me suis dit qu'il y avait cependant deux autres clauses habituellement nécessaires puisqu'il suggère d'utiliser deux instructions IF, et que le code exécuté doit donc être écrit deux fois. Cependant, si un GOTO est utilisé pour ignorer le code requis, au lieu d'écrire des clauses ELSE, le code pour l'exécution doit seulement être écrit ne fois.

Voici un exemple testable de la manière dont j'appliquerais la logique négative d'Athul Prakash pour créer un OU.

Dans mon exemple, quelqu'un est autorisé à conduire un char s'il a un permis de char OR s'il fait son 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
1
Ivan

C'est aussi simple que ce qui suit:

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 existe d'autres réponses, mais je pense que le mien est plus simple, donc plus facile à comprendre. J'espère que cela vous aide! ;)

1
Renk Software

Une alternative consiste à rechercher un shell unix qui vous fournisse des opérateurs logiques et bien plus encore. Vous pouvez obtenir une implémentation win32 native d’un Bourne Shell ici si vous ne voulez pas utiliser la route cygwin. Une bash native peut être trouvée ici . Je suis tout à fait certain que vous pourriez facilement rechercher d'autres bonnes alternatives telles que zsh ou tcsh sur Google.

K

0
Kevin Shea