¿Cómo implementaría los operadores lógicos en los archivos por lotes de DOS?Operadores lógicos ("y", "o") en el lote de DOS
Respuesta
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
)
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
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
Befare para no dejar ningún espacio después del conjunto = verdadero o simplemente no funciona. Guardaría el valor "verdadero" en la variable ... –
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.Dat
yFile1.Dat
existir luego saltar la etiqueta FILE12_EXIST_LABEL
.
Consulte también: IF /?
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
Si va a pasar por el esfuerzo de usar un shell diferente, al menos vaya con PowerShell: http://microsoft.com/powershell – Eclipse
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? –
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
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!
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
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
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.
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
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
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!;)
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.
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
- 1. Operadores lógicos y lógicos y controles nulos
- 2. Los operadores lógicos en plantillas de cierre
- 3. Búsqueda SQL con operadores lógicos
- 4. precedencia de operadores lógicos en C
- 5. ¿Qué operadores lógicos de C++ usa: y, o, no, y los operadores de estilo il o C? ¿por qué?
- 6. ¿Sobrecarga de operadores lógicos considerados malas prácticas?
- 7. ¿Conmutador de JavaScript con operadores lógicos?
- 8. semántica de los operadores lógicos y de comparación en el contexto de tres valorada lógica
- 9. mano corta para encadenar operadores lógicos en javascript?
- 10. Prioridad de operadores lógicos con NAND, NOR, XNOR
- 11. Uso de criterios múltiples en la función de subconjunto y operadores lógicos
- 12. pitón y/o operadores de valor
- 13. ¿Cuál es la diferencia entre las formas cortas (&, |) y largas (&&, ||) de AND, o los operadores lógicos en R?
- 14. ¿Por qué no hay operadores || = o && = en C#?
- 15. ¿Diferencia entre operadores de dos puntos y flechas en PHP?
- 16. Lote y para el bucle
- 17. Desplazamientos lógicos, aritméticos en bits
- 18. ¿Hay alguna sabiduría detrás de "y", "o" operadores en Ruby?
- 19. CUDA: ¿Por qué los operadores bit a bit son a veces más rápidos que los operadores lógicos?
- 20. && = y = || operadores
- 21. ¿Hay buenos usos para los operadores lógicos (booleanos) sin cortocircuito en Java/Scala?
- 22. Comparando 2 números en DOS Lote que no funciona
- 23. + =, +, == y = operadores
- 24. C preprocesador # y ## operadores
- 25. JQuery/Javascript y el uso de operadores &&
- 26. Agregar dos números sin usar operadores
- 27. diffrence Bitween estos dos operadores MySQL
- 28. Salir de DE en el lote
- 29. Java - compareTo y operadores
- 30. lógica de expresiones regulares y o
presento para su placer visual: pi.bat :) http://thedailywtf.com/Articles/Stupid-Coding-Tricks-A -Batch-of-Pi.aspx –