Operadores lógicos (“y”, “o”) en lote de DOS

¿Cómo implementaría operadores lógicos en archivos por lotes de DOS?

    Puede hacerlo and con condiciones anidadas:

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

    o:

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

    Puedes hacer or con una variable separada:

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

    La instrucción IF no admite operadores lógicos ( AND y OR ), las sentencias IF cascada crean una conjunción implícita.

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

    Si existen File1.Dat y File1.Dat , salte la etiqueta FILE12_EXIST_LABEL .

    Ver también: IF /?

    Las leyes de De Morgan nos permiten convertir las disyunciones (“O”) en equivalentes lógicos usando solo conjunciones (“Y”) y negaciones (“NO”). Esto significa que podemos encadenar disyunciones (“O”) en una línea.

    Esto significa que si el nombre es “Yakko” o “Wakko” o “Dot”, repite “hermano o hermana de 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 

    Esta es otra versión del ejemplo “O” de paxdiablo, pero las condiciones están encadenadas a una línea. (Tenga en cuenta que lo contrario de leq es gtr , y lo opuesto de geq es lss ).

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

    Los siguientes ejemplos muestran cómo hacer una instrucción AND (utilizada para establecer variables o incluir parámetros para un comando).

    Para cerrar la ventana de CMD y comenzar el Bloc de notas:

     exit & start notepad.exe 

    Para establecer las variables x, y, y z en valores si la variable ‘a’ es igual a bla.

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

    ¡Espero que ayude!

    También cubierto en
    “120} ¿Cómo uso operadores AND / OR / XOR / NOT en una statement IF?”
    http://www.netikka.net/tsneti/info/tscmd120.htm

    O es un poco complicado, pero no excesivamente. Aquí hay un ejemplo

     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 

    Una alternativa es buscar un shell Unix que le proporcione operadores lógicos y mucho más. Puede obtener una implementación win32 nativa de un shell Bourne aquí si no desea ir a la ruta cygwin. Un bash nativo se puede encontrar aquí . Estoy bastante seguro de que puedes encontrar fácilmente otras buenas alternativas, como zsh o tcsh.

    K

    Prueba el operando de negación – ‘no’!

    Bueno, si puede realizar la operación ‘Y’ en una instrucción if utilizando ‘if’ nesteds (consulte las respuestas anteriores), entonces puede hacer lo mismo con ‘if not’ para realizar una operación ‘o’.

    Si todavía no entendiste la idea, sigue leyendo. De lo contrario, simplemente no pierdas tu tiempo y regresa a la progtwigción.

    Del mismo modo que los “si” nesteds se satisfacen solo cuando todas las condiciones son verdaderas, nesteds “si no” se cumplen solo cuando todas las condiciones son falsas. Esto es similar a lo que quiere hacer con un operando ‘o’, ¿no es así?

    Incluso cuando cualquiera de las condiciones del ‘si no’ nested es verdadera, toda la statement permanece insatisfecha. Por lo tanto, puede usar ‘if’ negadas en sucesión al recordar que el cuerpo de la statement de condición debe ser lo que quiera hacer si todas sus condiciones anidadas son falsas. El cuerpo que realmente quisiste dar debería incluirse en la statement else.

    Y si todavía no entiendes lo que sucede, lo siento, tengo 16 años y eso es lo mejor que puedo explicar.

    Athul Prakash (16 años en ese momento) dio una idea lógica de cómo implementar una prueba de OR al negar las condiciones en las declaraciones IF y luego usar la cláusula ELSE como la ubicación para poner el código que requiere ejecución. Pensé para mí mismo que, sin embargo, hay dos cláusulas adicionales que normalmente se necesitan, ya que él está sugiriendo usar dos declaraciones IF, por lo que el código ejecutado debe escribirse dos veces . Sin embargo, si se utiliza un GOTO para omitir el código requerido, en lugar de escribir cláusulas ELSE, el código para la ejecución solo debe escribirse una vez .

    Aquí hay un ejemplo comprobable de cómo implementaría la lógica negativa de Athul Prakash para crear un quirófano .

    En mi ejemplo, a alguien se le permite conducir un tanque si tiene una licencia de tanque O si está haciendo su servicio militar . Ingrese verdadero o falso en las dos indicaciones y podrá ver si la lógica le permite conducir un tanque.

     @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 

    Es tan fácil como lo siguiente:

    AND> if + if

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

    O> 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* 

    Sé que hay otras respuestas, pero creo que la mina es más simple, por lo que es más fácil de entender. ¡Espero que esto te ayude! 😉

    Si le interesó escribir un + AND / OR en una statement, entonces no hay nada de eso. Pero aún puedes agrupar if con && / || y ( / ) declaraciones para lograr lo que desea en una línea sin variables adicionales y sin duplicación de bloque if-else (comando de echo único para secciones de código TRUE y 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 

    Salida :

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

    El truco está en el comando type que suelta / establece el errorlevel y así maneja el camino al siguiente comando.

    Leve modificación a la respuesta de Andry, reduciendo los comandos de tipo duplicados:

     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