2010-05-05 25 views
13

en archivos por lotes DOS, En una declaración IF, ¿es posible combinar dos o más condiciones usando AND u OR? No pude encontrar ninguna documentación para esocmd.exe: condiciones complejas?

Editar - help if y los documentos MS no dicen nada sobre el uso de más de una condición en un if.

supongo que una solución para Y habría que hacer

if COND1 (
    if COND2 (
    cmd 
) 
) 

pero esto es exactamente lo que estoy tratando de evitar.

+1

Cuando escribió 'AYUDA SI' ¿qué vio? ¿Algo útil? Por favor, lea 'AYUDA SI' y luego actualice su pregunta para que sea más específica en función de lo que lea. –

+0

Además, ¿está preguntando sobre esta página de la documentación de Microsoft? http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx?mfr=true –

Respuesta

14

No, no hay una manera más fácil.

Para and también puede simplemente ellos la cadena sin los bloques que introducen:

if COND1 if COND2 ... 

que francamente no es peor que

if COND1 and COND2 ... 

Sin embargo, para or se pone feo, de hecho:

set COND= 
if COND1 set COND=1 
if COND2 set COND=1 
if defined COND ... 

o:

Una vez vi un preprocesador por lotes que usaba sintaxis similar a C para el flujo de control y cosas de lotes en el medio y luego convertía tales condicionales en múltiples saltos y comprobaciones. Sin embargo, eso era para archivos por lotes DOS y era de poca utilidad en un entorno Windows.

+0

Bueno ... si el conjunto de condiciones es más corto, puede combinarlas en uno, como: si COND1 establece COND = 1 más si COND1 establece COND = 1 – Arun

+0

Sí, pero eso solo ayuda para las condiciones con AND. – Joey

-6

Siempre que las extensiones de comando estén habilitadas, puede usar los operadores de comparación.

Esto se pega directamente de "ayuda si":

Si las extensiones de comando están habilitadas, si los cambios de la siguiente manera:

IF [/I] string1 compare-op string2 command 
IF CMDEXTVERSION number command 
IF DEFINED variable command 

donde compara-op puede ser uno de:

EQU - equal 
NEQ - not equal 
LSS - less than 
LEQ - less than or equal 
GTR - greater than 
GEQ - greater than or equal 

y el modificador/I, si se especifica, indica que la cadena insensible a mayúsculas y minúsculas se compara. El modificador/I también se puede utilizar en el string1 == string2 formulario de IF. Estas comparaciones son genéricas, ya que si tanto string1 como string2 están compuestos de todos los dígitos numéricos, las cadenas son convertidas en números y se realiza una comparación numérica.

+2

Entonces, ¿dónde están los lógicos 'y' y' o' de los que se preguntó OP? La pregunta no era sobre simples condiciones de comparación. – Joey

+0

@Johannes Rössel: doh, lo siento, mi mal. Necesito leer más cuidadosamente. – Vicky

+0

-1 - solo una más y usted puede obtener una insignia de Presión de par :-) – SamB

2

Para la solución AND estoy de acuerdo con Joey, no puedo ver otra solución.

Para el o solución propondría el 'truco' siguiente:
supongamos que desea probar si el usuario pidió ayuda en la línea de comandos la vez que pide el archivo por lotes, algo así como: thebatch /?.
Pero no sabe si el usuario va a escribir /? o más bien (siendo un usuario acostumbrado a Unix) --help o -h o incluso se le olvida pasar cualquier argumento.

Su código podría ser como:

for %%P in ("" "-h" "--help") do if "%1"==%%P (
    :help 
    echo this is my help... >&2 
    exit /b 9 
) 

Nota sin embargo que las pruebas "? /" o "-?" las cadenas no funcionarán con ese truco (los bucles FOR no les gusta el meta carácter ?).
Para ello, sólo tiene que añadir la línea: if "%1"=="/?" goto help en la parte superior del bloque (véase la etiqueta ':help' dentro delfor bucle?)

Nota también que esta sintaxis no funcionará (es sólo completamente ignorado y el código no se ejecutará) con archivos por lotes bajo TCC.EXE (el intérprete Take Command, edición completa o lite), pero en ese caso solo use su sintaxis con sus palabras clave .OR. y .AND..

Espero que esto ayude.

9

A veces me pregunto qué aprende la gente en la escuela hoy en día. Por supuesto, 'O' también es posible. Cualquier sistema que pueda proporcionarle un 'NO' y un 'AND', automáticamente le proporcionará un 'OR' también, porque:

x OR y = NOT ((NOT x) AND (NOT y)) ver http://en.wikipedia.org/wiki/De_Morgan%27s_laws

Así que, mientras la expresión "si (X e Y) y luego hacer z" se puede escribir así:

if (x) if (y) (do z) 

... que debería ser capaz de escribir la expresión "si (x OR y) luego haga z ", pero hay un problema:

¿Dónde pondremos el primer 'NO'? Bueno, la respuesta es nada, debemos reformar la ecuación anterior primero:

NO (X o Y) = (NO x) Y (NO y)

De acuerdo con esto, se puede escribir " si (NO (X o y)) a continuación (ver z)" como:

"if ((NO x) y (NO y)) a continuación (ver z)"

Teniendo esto y saber cómo Exprese Y como se muestra arriba, ahora podemos escribir la expresión "if (NOT (x OR y)) then then (do z)" como:

if (not x) if (not y) (REM do z) 

También sabemos que la expresión:

"si (NO p) entonces (hacer q) else (do r)"

...es equivalente a:

"si (p), entonces (hacer r) otro (hacer q)

Así, podemos escribir para "si (X o Y), entonces (hacer z)":

"Si (NO (X o Y)) entonces (no hacer nada) más (ver z)"

Así podemos expresar "si (X o Y) entonces (ver z)" como:

if (not x) if (not y) (REM do nothing) else (REM do z) 

Pero esto no está completo aún, porque esto no es un verdadero 'Y' sino uno 'simulado'. Lo que falta es el segundo más. Por lo tanto, la forma completa para obtener el resultado correcto debe ser:

if (not x) (if (not y) (REM do nothing) else (REM do z)) else (REM do z)) 

... que tiene la parte más fea doble. Puede resolver que con un 'Goto' y, finalmente, tener:

rem if (x OR y) then (do z): 
if (not x) (if (not y) (goto :doNothing)) 
rem do z 
:doNothing 
+0

Parece atontado, pero esto funciona. ¡Gracias! –

0

Si las condiciones están comprobando para valores específicos de una variable, es posible que pueda configurarlo como una instrucción CASE. Tuve la necesidad de verificar si el TYPE era un miembro individual o un grupo (o todos).

Nota: Las etiquetas no distinguen entre mayúsculas y minúsculas.

Si alguna de las condiciones son verdaderas (si TYPE==ALL o TYPE==GROUP1 o TYPE==GROUP2), entonces el bloque de código se ejecuta, de lo contrario la ejecución salta el bloque.

goto :TYPE_EQ_%TYPE% 2>NUL 
if %ERRORLEVEL% neq 0 goto :END_CASE_TYPE 
:TYPE_EQ_ALL 
:TYPE_EQ_GROUP1 
:TYPE_EQ_GROUP2 
rem do what you need 
    echo GROUP: %TYPE% 
:END_CASE_TYPE 

no me gusta Ingeniería Eléctrica de Mehrdad (electrónica digital) enfoque. Aunque precisa, con ingeniería de software, la idea, como lo indica el OP, es hacer que las cosas sean más simples de entender. Anidado si las declaraciones agregan Complejidad (McCabe). Agregar NOT extra no ayuda.

Mi solución es un poco extraña si no conoces la configuración de etiqueta/error, pero es una estructura plana que se configura como una instrucción if con varias condiciones OR que no son difícil de descifrar

0

Y:

IF <COND1> IF <COND2> ACTION 

O:

(SET _=) & (IF <COND1> (SET _=) ELSE IF <COND2> (SET _=)) & IF DEFINED _ ACTION 

Para implementar O esta manera, usted no necesita las extensiones de comando.

Cuestiones relacionadas