Logische operatoren (“en”, “of”) in DOS-batch

Hoe zou u logische operatoren in DOS Batch-bestanden implementeren?


Antwoord 1, autoriteit 100%

U kunt ANDdoen met geneste voorwaarden:

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

of:

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

Je kunt ORdoen met een aparte variabele:

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

Antwoord 2, autoriteit 24%

Het if-statement ondersteunt de logische operatoren ANDen ORniet.
Trapsgewijze if-statements vormen een impliciete voegwoord:

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

Als File1.DatenFile2.Datbestaan, spring dan naar het label FILE12_EXIST_LABEL.

Zie ook: IF /?


Antwoord 3, autoriteit 17%

De wetten van De Morganstellen ons in staat disjuncties (“OR”) om te zetten in logische equivalenten alleen voegwoorden (“EN”) en ontkenningen (“NIET”) gebruiken. Dit betekent dat we disjuncties (“OF”) aan één regel kunnen koppelen.

Dit betekent dat als de naam “Yakko” of “Wakko” of “Dot” is, dan echo “Warner broer of zus”.

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

Dit is een andere versie van het “OR”-voorbeeld van paxdiablo, maar de voorwaarden zijn op één regel geketend. (Merk op dat het tegenovergestelde van leqgtris, en het tegenovergestelde van geqis lss.)

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

Antwoord 4, autoriteit 2%

OF is een beetje lastig, maar niet overdreven. Hier is een voorbeeld

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

Antwoord 5, autoriteit 2%

De volgende voorbeelden laten zien hoe u een AND-statement maakt (gebruikt voor het instellen van variabelen of het opnemen van parameters voor een commando).

Kladblok starten en het CMD-venster sluiten:

start notepad.exe & exit

De variabelen x, y en z instellen op waarden als de variabele ‘a’ gelijk is aan blah.

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

Hopelijk helpt dat!


Antwoord 6

Als je interesse hebt om een ​​if+AND/ORin één instructie te schrijven, dan is er niets van. Maar u kunt ifnog steeds groeperen met &&/||en (/)-instructies om te bereiken wat u wilt in één regel zonder extra variabelen en zonder if-elseblokduplicatie (enkele echo-opdracht voor TRUEen FALSEcodesecties):

@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

Meer uniforme versie:

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

Uitvoer:

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

De truc zit in het typecommando dat het errorlevellaat vallen/instelt en zo de weg naar het volgende commando afhandelt.


Antwoord 7

Athul Prakash (toen 16 jaar) gaf een logisch idee voor het implementeren van een OR-test door de voorwaarden in IF-statements te negeren en vervolgens de ELSE-clausule te gebruiken als locatie om de code te plaatsen die moet worden uitgevoerd. Ik dacht bij mezelf dat er echter meestal twee else-clausules nodig zijn, omdat hij suggereert om twee IF-instructies te gebruiken, en dus moet de uitgevoerde code tweemaalworden geschreven. Als er echter een GOTO wordt gebruikt om voorbij de vereiste code te springen, hoeft de code voor uitvoering slechts één keerte worden geschreven in plaats van ELSE-clausules te schrijven.

Hier is een testbaar voorbeeld van hoe ik de negatieve logica van Athul Prakash zou implementeren om een ​​OFte creëren.

In mijn voorbeeld mag iemand een tank besturen als hij een tankvergunning heeft OF als hij zijn militaire dienstplicht doet. Voer trueof falsein bij de twee prompts en u zult kunnen zien of de logica u toestaat een tank te besturen.

@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

Antwoord 8

Het is net zo eenvoudig als het volgende:

EN> als+als

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

OF> als // als

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*

Ik weet dat er andere antwoorden zijn, maar ik denk dat de mijn eenvoudiger is, dus gemakkelijker te begrijpen. Hoop dat dit je helpt! 😉


Antwoord 9

Probeer de ontkenningsoperand – ‘niet’!

Nou, als je de ‘AND’-bewerking op een if-statement kunt uitvoeren met geneste ‘if’s (zie eerdere antwoorden), dan kun je hetzelfde doen met ‘if not’ om een ​​’or’-bewerking uit te voeren.

>

Als je het idee nog niet helemaal hebt, lees dan verder. Anders verspil je tijd niet en ga je weer verder met programmeren.

Net zoals aan geneste ‘if’s alleen wordt voldaan als alle voorwaarden waar zijn, wordt aan geneste ‘if’s alleen voldaan als alle voorwaarden onwaar zijn. Dit is vergelijkbaar met wat je wilt doen met een ‘of’-operand, nietwaar?

Zelfs als een van de voorwaarden in de geneste ‘indien niet’ waar is, blijft de hele verklaring niet vervuld. Daarom kunt u ontkende ‘if’s achter elkaar gebruiken door te onthouden dat de hoofdtekst van de voorwaardeverklaring zou moeten zijn wat u wilt doen als al uw geneste voorwaarden onwaar zijn. Het lichaam dat je eigenlijk wilde geven, zou onder de else-verklaring moeten vallen.

En als je het nog steeds niet begrijpt, sorry, ik ben 16 en dat is het beste wat ik kan doen om het uit te leggen.


Antwoord 10

Een alternatief is om te zoeken naar een unix-shell die je wel logische operators geeft en nog veel meer. U kunt hiereen native win32-implementatie van een Bourne-shell krijgen als u niet de cygwin-route wilt volgen . Een native bash is hierte vinden. Ik ben er vrij zeker van dat je gemakkelijk andere goede alternatieven kunt googlen, zoals zsh of tcsh.

K


Antwoord 11

Alleen het OR-gedeelte is lastig, maar met een algemene booleaanse uitdrukking die NOT OR AND bevat, is de enige goede oplossing deze:

REM if A == B OR C == C then yes
(call :strequ A B || call :strequ C C) && echo yes
exit /b
:strequ
if "%1" == "%2" exit /b 0
exit /b 1

Antwoord 12

Veel mensen lijken de meest voor de hand liggende oplossing voor OR te missen, namelijk het gebruik van een label.

if "%a%" == "ONE" goto do_thing
if "%a%" == "TWO" (
   :do_thing
   echo a is equal to ONE or TWO
)

Antwoord 13

Als je de else-clausule nodig hebt, kun je deze syntaxis gebruiken:

EN:

if %v1% == a (if %v2% == b (echo yes) else echo no) else echo no

OF:

if %v1% == a (echo yes) else (if %v2% == b (echo yes) else echo no)

Antwoord 14

Kleine wijziging in het antwoord van Andry, waardoor dubbele typeopdrachten worden verminderd:

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

Other episodes