También puede usar set res=o set res=1y luego, if defined resque es un poco más robusto contra errores tipográficos y funciona incluso en bloques sin habilitar explícitamente la expansión retardada.
Joey
55
Solo para mejorar un poco su respuesta ... no necesita anidar explícitamente las declaraciones "si" ... simplemente puede "encadenarlas", como Dave Jarvis demuestra a continuación
JoelFan
No deje ningún espacio después de set = true o la cosa con gracia no funciona. Almacenaría el valor "verdadero" en la variable ...
Roland Pihlakas
1
La condición 'o' que describe es ingeniosa y funciona muy bien para un rango de números, pero ¿qué sucede si estoy comparando 2 valores independientes y no un rango? Por ejemplo, si este archivo existe o filename == ""
bakoyaro
1
@bakoyaro, puede usar cualquier condición para establecer res en true, incluidas las que menciona.
paxdiablo
69
La IFdeclaración no admite operadores lógicos ( ANDy OR), las IFdeclaraciones en cascada hacen una conjunción implícita.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Si File1.DatyFile1.Dat existe, salta la etiqueta FILE12_EXIST_LABEL.
Las leyes de De Morgan nos permiten convertir las disyunciones ("O") en equivalentes lógicos utilizando solo conjunciones ("Y") y negaciones ("NO"). Esto significa que podemos encadenar disyunciones ("OR") en una sola línea.
Esto significa que si el nombre es "Yakko" o "Wakko" o "Dot", entonces repite "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 están encadenadas a una sola línea. (Tenga en cuenta que lo opuesto de leqes gtry lo opuesto de geqes lss).
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Athul Prakash (16 años en ese momento) dio una idea lógica de cómo implementar una prueba OR al negar las condiciones en las declaraciones IF y luego usar la cláusula ELSE como la ubicación para colocar el código que requiere ejecución. Pensé para mí mismo que, sin embargo, normalmente se necesitan dos cláusulas más, ya que 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 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 OR .
En mi ejemplo, a alguien se le permite conducir un tanque si tiene una licencia de tanque O 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
Si está interesado en escribir un if+ AND/ ORen una declaración, entonces no hay nada de eso. Pero, aún puede agrupar ifcon &&/ ||y (/ )declaraciones para lograr lo que desea en una línea sin variables adicionales y sin if-elseduplicación de bloque ( echocomando único para TRUEy FALSEsecciones de código):
@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
Bueno, si puede realizar la operación 'AND' en una instrucción if utilizando 'if' anidados (consulte las respuestas anteriores), entonces puede hacer lo mismo con 'if not' para realizar una operación 'u'.
Si todavía no tienes la idea, sigue leyendo. De lo contrario, no pierdas tu tiempo y vuelve a la programación.
Así como los 'si' anidados se satisfacen solo cuando todas las condiciones son verdaderas, los 'si no' anidados se satisfacen solo cuando todas las condiciones son falsas. Esto es similar a lo que quieres hacer con un operando 'u', ¿no?
Incluso cuando cualquiera de las condiciones en el 'si no' anidado es verdadera, toda la declaración sigue sin cumplirse. Por lo tanto, puede usar 'if' negados en sucesión recordando que el cuerpo de la declaración de condición debería ser lo que desea hacer si todas sus condiciones anidadas son falsas. El cuerpo que realmente querías dar debería venir bajo la declaración else.
Y si aún no entendiste el truco, lo siento, tengo 16 años y eso es lo mejor que puedo hacer para explicarte.
x = 2 o x = 3 =>! ! (x = 2 o x = 3) =>! (x! = 2 yx! = 3) No creo que pueda negar el todo si la estructura aplica el operador externo "no" necesario. Han pasado 3 años, @ Athul-prakash, ¿pensamientos?
Azeroth2b
1
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, por lo que es más fácil de entender. ¡Espero que esto te ayude! ;)
Una alternativa es buscar un shell de Unix que le brinde operadores lógicos y mucho más. Puede obtener una implementación win32 nativa de un shell Bourne aquí si no desea seguir la ruta cygwin. Una fiesta nativa se puede encontrar aquí . Estoy bastante seguro de que podría buscar fácilmente otras buenas alternativas como zsh o tcsh.
Si va a pasar por el esfuerzo de usar un shell diferente, al menos vaya con PowerShell: microsoft.com/powershell
Eclipse
17
Hay muchos mejores shells que DOS. La razón por la que usaría un archivo bat de DOS es porque no requiere ninguna herramienta externa. Si tiene un cliente que necesita automatizar algo simple, ¿realmente quiere que tenga que instalar herramientas especiales (cygwin, perl, powershell, etc.) cuando un archivo BAT será suficiente?
Mark Lakata
3
BAT es suficiente la mayor parte del tiempo. El 90% de los scripts de shell de Unix, ppl write no es shell puro, sino que tiene muchas llamadas coreutils, sed, awk, etc. GNU ha implementado productos UNIX en otros sistemas operativos, incluido Windows. Así que eche un vistazo a este getgnuwin32.sourceforge.net cmd.exe / bash / zsh, más esto debería ser suficiente en la mayoría de las tareas. No hay razón para aprender el llamado PowerShell si tienes experiencia BAT / UNIX Shell
MeaCulpa
0
Solo la parte OR es complicada, pero con una expresión booleana general que contiene NOT OR AND, la única buena solución es esta:
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
Respuestas:
Puedes hacerlo
and
con condiciones anidadas:o:
Puedes hacerlo
or
con una variable separada:fuente
set res=
oset res=1
y luego,if defined res
que es un poco más robusto contra errores tipográficos y funciona incluso en bloques sin habilitar explícitamente la expansión retardada.La
IF
declaración no admite operadores lógicos (AND
yOR
), lasIF
declaraciones en cascada hacen una conjunción implícita.Si
File1.Dat
yFile1.Dat
existe, salta la etiquetaFILE12_EXIST_LABEL
.Ver también:
IF /?
fuente
Las leyes de De Morgan nos permiten convertir las disyunciones ("O") en equivalentes lógicos utilizando solo conjunciones ("Y") y negaciones ("NO"). Esto significa que podemos encadenar disyunciones ("OR") en una sola línea.
Esto significa que si el nombre es "Yakko" o "Wakko" o "Dot", entonces repite "Hermano o hermana Warner".
Esta es otra versión del ejemplo "OR" de paxdiablo, pero las condiciones están encadenadas a una sola línea. (Tenga en cuenta que lo opuesto de
leq
esgtr
y lo opuesto degeq
eslss
).fuente
Los siguientes ejemplos muestran cómo hacer una declaración AND (utilizada para establecer variables o incluir parámetros para un comando).
Para iniciar el Bloc de notas y cerrar la ventana CMD:
Para establecer las variables x, y y z en valores si la variable 'a' es igual a bla.
¡Espero que ayude!
fuente
O es un poco complicado, pero no demasiado. Aquí hay un ejemplo
fuente
Athul Prakash (16 años en ese momento) dio una idea lógica de cómo implementar una prueba OR al negar las condiciones en las declaraciones IF y luego usar la cláusula ELSE como la ubicación para colocar el código que requiere ejecución. Pensé para mí mismo que, sin embargo, normalmente se necesitan dos cláusulas más, ya que 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 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 OR .
En mi ejemplo, a alguien se le permite conducir un tanque si tiene una licencia de tanque O 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.
fuente
Si está interesado en escribir un
if
+AND
/OR
en una declaración, entonces no hay nada de eso. Pero, aún puede agruparif
con&&
/||
y(
/)
declaraciones para lograr lo que desea en una línea sin variables adicionales y sinif-else
duplicación de bloque (echo
comando único paraTRUE
yFALSE
secciones de código):Salida :
El truco está en el
type
comando que suelta / estableceerrorlevel
y, por lo tanto, maneja el camino hacia el siguiente comando.fuente
Pruebe el operando de negación - 'no'!
Bueno, si puede realizar la operación 'AND' en una instrucción if utilizando 'if' anidados (consulte las respuestas anteriores), entonces puede hacer lo mismo con 'if not' para realizar una operación 'u'.
Si todavía no tienes la idea, sigue leyendo. De lo contrario, no pierdas tu tiempo y vuelve a la programación.
Así como los 'si' anidados se satisfacen solo cuando todas las condiciones son verdaderas, los 'si no' anidados se satisfacen solo cuando todas las condiciones son falsas. Esto es similar a lo que quieres hacer con un operando 'u', ¿no?
Incluso cuando cualquiera de las condiciones en el 'si no' anidado es verdadera, toda la declaración sigue sin cumplirse. Por lo tanto, puede usar 'if' negados en sucesión recordando que el cuerpo de la declaración de condición debería ser lo que desea hacer si todas sus condiciones anidadas son falsas. El cuerpo que realmente querías dar debería venir bajo la declaración else.
Y si aún no entendiste el truco, lo siento, tengo 16 años y eso es lo mejor que puedo hacer para explicarte.
fuente
Es tan fácil como lo siguiente:
Y> si + si
O> si // si
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! ;)
fuente
Una alternativa es buscar un shell de Unix que le brinde operadores lógicos y mucho más. Puede obtener una implementación win32 nativa de un shell Bourne aquí si no desea seguir la ruta cygwin. Una fiesta nativa se puede encontrar aquí . Estoy bastante seguro de que podría buscar fácilmente otras buenas alternativas como zsh o tcsh.
K
fuente
Solo la parte OR es complicada, pero con una expresión booleana general que contiene NOT OR AND, la única buena solución es esta:
fuente
Ligera modificación a la respuesta de Andry, reduciendo los comandos de tipo duplicado:
fuente