Operadores lógicos ("y"," o") en DOS batch


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

Author: Brian Tompsett - 汤莱恩, 2010-01-27

11 answers

Puedes hacer 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
)
 241
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 09:55:33

La instrucción IF no soporta operadores lógicos (AND y OR), las instrucciones en cascada IF hacen una conjunción implícita.

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

Si File1.Dat y File1.Dat exist luego salta la etiqueta FILE12_EXIST_LABEL.

Véase también: IF /?

 59
Author: Dave Jarvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-21 19:07:49

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

Esto significa que si el nombre es "Yakko" o "Wakko" o "Dot", entonces echo "Warner brother or sister".

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 "OR" de paxdiablo, pero las condiciones están encadenadas a una línea. (Nota que lo opuesto 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
 45
Author: anomal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 04:09:59

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 CMD e iniciar el Bloc de notas:

exit & start notepad.exe

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

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

¡Espero que eso ayude!

 4
Author: GinDiamond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 20:25:44

También cubierto en
"120} Cómo uso Y/O / operadores XOR / NOT en una instrucción IF?"
http://www.netikka.net/tsneti/info/tscmd120.htm

O es un poco complicado, pero no demasiado. He aquí 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
 3
Author: Timo Salmi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-24 19:19:32

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

K

 1
Author: Kevin Shea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-26 23:16:08

Prueba el operando de negación - 'not'!

Bien, si puede realizar la operación 'And' en una instrucción if usando 'if 'anidadas (consulte las respuestas anteriores), entonces puede hacer lo mismo con' if not 'para realizar una operación' or'.

Si todavía no tienes la idea, sigue leyendo. De lo contrario, simplemente no pierda su tiempo y vuelva a la programación.

Como anidadas "si están satisfechos sólo cuando todas las condiciones se cumplen, anidadas" si no están satisfechos sólo cuando todas las condiciones son falsas. Esto es similar a lo que quieres hacer con un operando 'o', ¿no?

Incluso cuando cualquiera de las condiciones en el 'if not' anidado es verdadera, la declaración completa permanece no satisfecha. Por lo tanto, puede utilizar negated 'if's en sucesión recordando que el cuerpo de la declaración de condición debe ser lo que quieres hacer si todas tus condiciones anidadas son falsas. El cuerpo que realmente querías dar debería estar bajo la declaración else.

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

 1
Author: Athul Prakash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-22 15:08:22

Athul Prakash (16 años en ese momento) dio una idea lógica de cómo implementar una prueba OR negando las condiciones en las sentencias IF y luego usando la cláusula ELSE como la ubicación para poner el código que requiere ejecución. Pensé para mí mismo que, sin embargo, generalmente se necesitan dos cláusulas más, ya que él está sugiriendo el uso de dos sentencias IF, por lo que el código ejecutado debe escribirse dos veces. Sin embargo, si se usa un GOTO para omitir el código requerido, en lugar de escribir OTRA cosa cláusulas el código para la ejecución solo necesita ser escrito una vez.

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

En mi ejemplo, a alguien se le permite conducir un tanque si tiene una licencia de tanque O está haciendo su servicio militar. Introduzca true o false 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
 1
Author: user3070485,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-03 12:38:15

Es tan fácil como lo siguiente:

Y > if + if

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

O > if / / if

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, así que más fácil de entender. ¡Espero que esto te ayude! ;)

 1
Author: Renk Software,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-22 19:38:47

Si usted ha interesado en escribir un if+AND/OR en una declaración, entonces no hay nada de eso. Pero, todavía se puede agrupar if con &&/|| y (/) instrucciones para lograr lo que desea en una línea sin cualquier variable adicional y sin duplicación de bloques if-else (comando único echo para las 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 a la siguiente comando.

 1
Author: Andry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-22 14:55:56

Ligera modificación a la respuesta de Andry, reduciendo los comandos de tipo duplicado:

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
 -1
Author: TedK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-21 22:28:29