2010-01-26 15 views

Respuesta

223

Usted puede 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 

Usted 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 
) 
+11

También puede usar 'set res =' o 'set res = 1' y luego' if defined res', que es un poco más robusto contra los errores tipográficos y funciona incluso en bloques sin permitir explícitamente el retraso expansión. – Joey

+5

Solo para mejorar un poco su respuesta ... no necesita anidar explícitamente las afirmaciones "si" ... simplemente puede "encadenarlas", como demuestra Dave Jarvis debajo de – JoelFan

+0

Befare para no dejar ningún espacio después del conjunto = verdadero o simplemente no funciona. Guardaría el valor "verdadero" en la variable ... –

55

La declaración IF no es compatible con los operadores lógicos (AND y OR), a derramamiento IF declaraciones crea un conjunto implícito.

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

Si File1.DatyFile1.Dat existir luego saltar la etiqueta FILE12_EXIST_LABEL.

Consulte también: IF /?

1

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

K

+3

Si va a pasar por el esfuerzo de usar un shell diferente, al menos vaya con PowerShell: http://microsoft.com/powershell – Eclipse

+14

Hay muchas mejores shells que DOS. La razón por la que usaría un archivo bat de DOS es porque no requiere herramientas externas. Si tiene un cliente que necesita automatizar algo simple, ¿realmente quiere que tengan que instalar herramientas especiales (cygwin, perl, powershell, etc.) cuando un archivo BAT será suficiente? –

+3

BAT es suficiente la mayor parte del tiempo. El 90% de los scripts de shell de Unix ppl write no es puro shell sino que tiene muchas llamadas coreutils, sed, awk, etc. GNU ha implementado las ventajas de UNIX en otros sistemas operativos, incluido Windows. Así que eche un vistazo a este http://getgnuwin32.sourceforge.net/cmd.exe/bash/zsh plus, esto debería ser suficiente en la mayoría de las tareas. No hay razón para aprender lo que se llama PowerShell si tiene experiencia BAT/UNIX Shell – MeaCulpa

4

Los siguientes ejemplos muestran cómo hacer una declaración AND (utilizado para establecer variables o parámetros que incluye un comando).

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

exit & start notepad.exe 

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

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

Hope that helps!

41

De Morgan's laws nos permiten convertir disyunciones ("O") en equivalentes lógicos usando solo conjunciones ("Y") y negaciones ("NOT"). Esto significa que podemos encadenar disyunciones ("O") en una línea.

Esto significa que si el nombre es "Yakko" o "Wakko" o "Punto", 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 en una línea. (Tenga en cuenta 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 
3

también cubiertos en
"120} ¿Cómo uso AND/OR/XOR/NOT en una instrucción IF ?"
http://www.netikka.net/tsneti/info/tscmd120.htm

O es un poco difícil, pero no demasiado Aquí es 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 
2

Pruebe el operando de la negación -. 'No'

Bueno, si! puede realizar la operación 'Y' en una instrucción if utilizando 'if' anidados (consulte las respuestas anteriores), luego 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 programación.

Igual que los 'si' anidados se cumplen solo cuando todas las condiciones son verdaderas, las anidadas '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 una de las condiciones en el anidado 'si no' es verdadera, toda la instrucción permanece insatisfecha. Por lo tanto, puede usar 'if' negadas en sucesión al recordar que el cuerpo de la declaración 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 declaración else.

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

+0

x = 2 o x = 3 =>! ! (x = 2 o x = 3) =>! (x! = 2 yx! = 3) No creo que pueda negar toda la estructura if para aplicar el operador "no" externo necesario. Han pasado 3 años, @ Athul-prakash, ¿pensamientos? – Azeroth2b

1

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 poner el código que requiere ejecución. Pensé para mis adentros que, sin embargo, hay dos cláusulas adicionales que normalmente se necesitan, ya que él está sugiriendo usar dos instrucciones 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 O.

En mi ejemplo, alguien está autorizado a conducir un tanque si tienen una licencia de tanque o si están haciendo su servicio militar. Ingrese verdadero o falso en las dos instrucciones 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

Es tan fácil como el 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 otra responde, pero creo que la mina es más simple, por lo que es más fácil de entender. ¡Espero que esto te ayude!;)

1

Si ha interesado escribir if + AND/OR en una sola declaración, no hay ninguna. Sin embargo, todavía puede grupo if con &&/|| y (/) declaraciones para lograr que desee en una línea w/o cualesquiera variables adicionales y W/O if-else duplicación bloque (solo comando echo para TRUE y FALSE secciones 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 

salida:

TRUE+ 
FALSE- 
FALSE- 
FALSE- 

TRUE+ 
TRUE+ 
TRUE+ 
FALSE- 

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

-1

Ligera modificación de 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 
Cuestiones relacionadas