Pregunta

¿Cómo poner en práctica los operadores lógicos en archivos por lotes de DOS?

¿Fue útil?

Solución

Se puede hacer and con condiciones anidados:

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

o

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

Puede hacer or con una variable independiente:

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

Otros consejos

La declaración IF no es compatible con los operadores lógicos (AND y OR), a derramamiento declaraciones IF hacen una conjunción implícita.

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

Si File1.Dat y existen File1.Dat luego saltar la FILE12_EXIST_LABEL etiqueta.

Ver también: IF /?

leyes de De Morgan nos permitirá convertir disyunciones ( "O") en equivalentes lógicos utilizando sólo conjunciones ( "y") y negaciones ( "NO"). Esto significa que podemos disyunciones de cadena ( "OR") sobre una línea.

Esto significa que si el nombre es "Yakko" o "Wakko" o "punto", entonces echo "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 de "OR" el ejemplo de paxdiablo, pero las condiciones están encadenados a una línea. (Nota que lo contrario de leq es gtr, y lo contrario 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 declaración AND (utilizado para establecer variables o incluyendo parámetros de un comando).

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

start notepad.exe & exit

Para variables de set x, y, y z con los valores si la variable 'a' es igual a bla.

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

Espero que ayude!

O es ligeramente complicado, pero no demasiado. Aquí está 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

Trate la negación del operando - 'no'

Bueno, si usted puede realizar 'Y' operación en una sentencia if anidadas utilizando 'si de (consulte las respuestas anteriores), entonces usted puede hacer lo mismo con 'si no' para realizar una 'o' operación.

Si no se tiene la idea bastante hasta ahora, sigue leyendo. De lo contrario, simplemente no pierda su tiempo y volver a la programación.

Al igual que anidado 'si están satisfechos de sólo cuando se cumplen todas las condiciones, anidados' si no están satisfechos de sólo cuando todas las condiciones son falsas. Esto es similar a lo que quiere hacer con un 'o' operando, ¿no es así?

Aún cuando cualquiera de las condiciones en el anidado 'si no' es cierto, toda la declaración sigue siendo no satisfecha. Por lo tanto, puede utilizar negado 'si está en la sucesión al recordar que el cuerpo de la sentencia de condición debe ser lo que quiere hacer si todas sus condiciones anidadas son falsas. El cuerpo que en realidad quería dar debe venir bajo la sentencia else.

Y si todavía no recibió el jist de la cosa, lo siento, tengo 16 años y eso es lo mejor que puedo hacer para explicar.

Athul Prakash (16 años de edad en el momento) dio una idea lógica de cómo implementar un OR de prueba mediante la negación de las condiciones en las declaraciones IF y luego usando la cláusula ELSE como el lugar para poner el código que requiere la ejecución. Me dije a mí mismo sin embargo, que hay dos cláusulas else generalmente necesarios ya que es lo que sugiere el uso de dos sentencias IF, por lo que las necesidades de código que se ejecuta a escribirse dos veces . Sin embargo, si un GOTO se utiliza para saltar más allá del código deseado, en lugar de escribir cláusulas ELSE el código para su ejecución solo necesita ser escrita una vez .

Este es un ejemplo comprobable de cómo iba a aplicar lógica negativa de Athul Prakash para crear un o .

En mi ejemplo, alguien está permitido para conducir un tanque si tienen una licencia tanque o que están haciendo su servicio militar . Introduzca true o false en las dos indicaciones y usted será capaz de 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 la siguiente:

Y> + si si

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

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

Si usted ha interesado escribir un if + AND / OR en una declaración, entonces no hay nada de eso. Sin embargo, todavía puede declaraciones grupo if con && / || y ( / ) para lograr que desee en una línea w / o cualesquiera variables adicionales y / o if-else duplicación bloque (solo comando echo para las secciones TRUE y código FALSE) w:

@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 cae / establece el errorlevel y así se encarga de la manera de la orden siguiente.

Una alternativa es buscar un shell de Unix, que te da los operadores lógicos y mucho más. Puede obtener una aplicación Win32 nativo de un shell Bourne aquí si usted no quiere ir a la ruta cygwin . Una fiesta nativa se puede encontrar aquí . Estoy bastante seguro de que podría fácilmente google otras alternativas buenas como zsh o tcsh.

K

Ligera modificación de la respuesta de Andry, la reducción de 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top