exist batch batch-file cmd logical-operators windows-console

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



if batch (11)

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 declaraciones IF y luego usando la cláusula ELSE como la ubicación para colocar el código que requiere ejecución. Pensé para mí mismo que, sin embargo, generalmente se necesitan otras dos cláusulas ya que él sugiere usar dos declaraciones IF, por lo que el código ejecutado debe escribirse dos veces . Sin embargo, si se usa un GOTO para omitir más allá del código requerido, en lugar de escribir cláusulas ELSE, el código para la ejecución solo se debe escribir una vez .

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

En mi ejemplo, alguien puede 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

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


Es tan fácil como lo siguiente:

Y> si + si

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


La declaración IF no admite operadores lógicos ( AND y OR ), las declaraciones IF cascada forman una conjunción implícita.

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

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

Ver también: IF /?


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

Para cerrar la ventana de CMD e iniciar 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 blah.

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

¡Espero que ayude!


Modificación leve 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


Pruebe el operando de negación - ''no''!

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

Si todavía no tienes la idea, sigue leyendo. De lo contrario, simplemente no pierdas el tiempo y vuelve a la programación.

Del mismo modo que los "si" anidados se satisfacen solo cuando todas las condiciones son verdaderas, los "anidados" si no se cumplen solo cuando todas las condiciones son falsas. Esto es similar a lo que quieres hacer con un ''o'' operando, ¿no es así?

Incluso cuando cualquiera de las condiciones en el anidado "si no" es verdadera, la declaración completa sigue sin cumplirse. Por lo tanto, puede usar negado ''si está en sucesión recordando que el cuerpo de la declaración de condición debe ser lo que quiere hacer si todas sus condiciones anidadas son falsas. El cuerpo que realmente querías dar debería estar bajo la declaración else.

Y si aún no entendiste el problema, lo siento, tengo 16 años y eso es lo mejor que puedo hacer para explicarte.


Si tiene interés en escribir un if + AND / OR en una declaración, entonces no hay nada de eso. Pero, todavía 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 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 de type que cae / establece el nivel de errorlevel y maneja el siguiente comando.


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

O es un poco complicado, pero no demasiado. 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 de Unix que le ofrezca operadores lógicos y mucho más. Puede obtener una implementación win32 nativa de un shell Bourne here si no quiere ir por la ruta cygwin. Una fiesta nativa se puede encontrar here . Estoy bastante seguro de que podría fácilmente buscar otras buenas alternativas en Google, como zsh o tcsh.

K


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

Esto significa que si el nombre es "Yakko" o "Wakko" o "Punto", entonces haga eco de "hermano o hermana 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 "OR" de paxdiablo, pero las condiciones se encadenan en una línea. (Tenga en cuenta que el opuesto de leq es gtr , y el 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


Puedes 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 hacerlo 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 )