Ejecución condicional [Batch] LEER

Iniciado por leogtz, 15 Noviembre 2008, 05:44 AM

0 Miembros y 1 Visitante están viendo este tema.

leogtz

Ejecucion condicional

Bueno este tutorial, vamos a aprender a usar los caracteres & && || y un poco de ERRORLEVEL.


Una confusion muy frecuente es que usan los caracteres & y && con el mismo proposito, & y && no son iguales.
Tienen sus significados para el CMD.

comando1 & comando2 :
Ejecuta el comando1 seguido de comando2
Equivalencia :
comando1
comando2


comando1 && comando2 :

Ejecuta el comando2 solo si el comando1 fue ejecutado satisfactoriamente.
Equivalencia :
comando1
if %errorlevel%==0 (comando2)


comando1 || comando2 :
Ejecuta el comando2 solo si el comando1 fue ejecutado insatisfactoriamente, es decir, si hubo un error en el comando.
Equivalencia :
comando1
if %errorlvel%==1 (comando2)
}
El || se definiria como un %errorlevel% neq 0, ya que no todos los comandos devuelven un 0 o un 1.

Ejemplo :

C:\WINDOWS\system32>ldkfjgkldjfgkljdklfgkljdfg & echo %errorlevel%
"ldkfjgkldjfgkljdklfgkljdfg" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
9009

C:\WINDOWS\system32>

Ahi es donde aplica el %errorlevel% neq 0.

Gracias a Carlitos por la aclaración.

Vamos a ver algunos ejemplos :
Codigo con & :
@ECHO OFF
REM SE EJECUTA EL COMANDO MSG, SEGUIDO DEL ECHO.
MSG * HOLA! & ECHO HOLA
PAUSE>NUL
EXIT /B

Como vemos arriba el uso del & es muy sencillo.

Codigo con && :
@ECHO OFF
MSG * HOLA && ECHO EL COMANDO MSG SE EJECUTO CORRECTAMENTE
PAUSE>NUL


Es equivalente a :
@ECHO OFF
MSG * HOLA
IF %ERRORLEVEL%==0 (
ECHO EL COMANDO MSG SE EJECUTO CORRECTAMENTE
)
PAUSE>NUL

Como vemos, se ahorran mas lineas usando &&

Veamos otro ejemplo :

@ECHO OFF
VER | FIND /I "LEO" && (
REM EL SIGUIENTE CODIGO NUNCA SE EJECUTARA, DEBIDO A QUE EN EL COMANDO VER
REM NO EXISTE NADA RELACIONADO CON LA CADENA "LEO"
ECHO CADENA "LEO" ENCONTRADA EN EL COMANDO VER
)
PAUSE>NUL
EXIT /B


Variemosle un poco para entender mejor :

@ECHO OFF
VER | FIND /I "XP" && (
REM EL SIGUIENTE CODIGO SI EJECUTARA, DEBIDO A QUE EN LA SALIDA DEL COMANDO VER
REM SI EXISTE "XP"
ECHO CADENA "XP" ENCONTRADA EN EL COMANDO VER
)
PAUSE>NUL
EXIT /B


Los caracteres || (pipes o tuberias juntas) :
Codigo con || :

Pondre un codigo simple para detectar si un Host responde a un PING :

@ECHO OFF
PING GOOGLE.COM && (
CLS ;
ECHO PING RESPONDIDO
) || (
CLS
ECHO MAQUINA NO ENCONTRADA!
)


Aqui logicamente que si encontrará a google.com, pero que pasa si ponemos en lugar de google.com sdfjksjdf.com :
@ECHO OFF
PING dklfjlgkdfg.com && (
CLS ;
ECHO PING RESPONDIDO
) || (
CLS
ECHO MAQUINA NO ENCONTRADA!
)
PAUSE>NUL
El codigo nos devolverá : "Maquina no encontrada!"

Como ven, || funciona como un ELSE.

Otro ejemplo de || :
@ECHO OFF
COPY ARCHIVO_INVENTADO.ALGO CARPETA_INVENTADA || (
ECHO EL ARCHIVO NO FUE ENCONTRADO O LA CARPETA DESTINO NO EXISTE!
) || (
ECHO ESTE MENSAJE JAMAS SE VERA
) && (
ECHO ESTE MENSAJE TAMPOCO.
)
PAUSE>NUL


Con este concluye este tutorial.

PD : No confundir || con | ni & con &&, tienen sus significados.

Curiosidades :

@ECHO OFF
ECHO HOLA ||~|| (ECHO SI)
PAUSE

@ECHO OFF
ECHO HOLA ||.~.|| (ECHO SI)
PAUSE>NUL


En resumen:
Esto es muy importante saberlo, nos permite ahorrar muchas lineas de codigo, ademas de que el codigo se ve mas legible y elegante.

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

corax

CitarEsto es muy importante saberlo, nos permite ahorrar muchas lineas de codigo, ademas de que el codigo se ve mas legible y elegante.

Efectivamente, considero que es un gran aporte que se expliquen con claridad este tipo de cosas.

Además me gusta tu forma de explicar, serías buen profesor...
¿Nunca has pensado en hacer un manual completo de tu propia cosecha?


Saludos!
Nuestro idioma ha tardado 12 siglos en llegar hasta hoy día. Tú tan sólo tardas 20 segundos en escribir un post: no destroces en tan poco tiempo lo que tantos siglos ha costado crear.

WestOn

Wenas, muy buena la explicacion, la verdad esto sirve bastante!
Cita de: corax en 19 Noviembre 2008, 22:40 PM
Nunca has pensado en hacer un manual completo de tu propia cosecha?
Opino lo mismo ;), un saludo
En mi cabeza existe una barrera espacio-tiempo de 4cm³. ¿Alguien sabe como eliminarla?.
                                                                                                                                                                                                                            

leogtz

Cita de: corax en 19 Noviembre 2008, 22:40 PM
CitarEsto es muy importante saberlo, nos permite ahorrar muchas lineas de codigo, ademas de que el codigo se ve mas legible y elegante.

Efectivamente, considero que es un gran aporte que se expliquen con claridad este tipo de cosas.

Además me gusta tu forma de explicar, serías buen profesor...
¿Nunca has pensado en hacer un manual completo de tu propia cosecha?


Saludos!

Gracias, no nunca lo habia pensado, prefiero postear de poco en poco tutoriales especificos.

Luego posteo algo sobre REDIRECCIÓN.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

carlitos.java

buen artículo Rockox, aunque yo redefiniría || como %errorlevel% neq 0

SmartGenius

Excelente RockoX...nunca he llegado a usar || pero ya le veo utilidad....xD xD

Saludos.


leogtz

#6
Cita de: carlitos.java en 20 Noviembre 2008, 07:05 AM
buen artículo Rockox, aunque yo redefiniría || como %errorlevel% neq 0


Ya puse una anotación en el lugar de ||, gracias por la aclaración.

Saludos a todos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Banti

GRacias!!!!!!!

Yo queria algo que cuando no cumpla su objetivo el comando, no se ejecute el comando siguiente o lo contrario.
Y ahora que lo veo se me vienen millones de ideas para simplificar (o hacer un maldito debugging) mis codigos!!!

Y ahora se para que sirve el "errorlevel" wiiiiii

GRacias! (otra vez)