Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: leogtz en 15 Noviembre 2008, 05:44 am



Título: Ejecución condicional [Batch] LEER
Publicado por: leogtz en 15 Noviembre 2008, 05:44 am
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.

Código:
comando1 & comando2 : 
Ejecuta el comando1 seguido de comando2
Equivalencia :
Código:
comando1
comando2
Código:
comando1 && comando2 : 
Ejecuta el comando2 solo si el comando1 fue ejecutado satisfactoriamente.
Equivalencia :
Código:
comando1
if %errorlevel%==0 (comando2)

Código:
comando1 || comando2 : 
Ejecuta el comando2 solo si el comando1 fue ejecutado insatisfactoriamente, es decir, si hubo un error en el comando.
Equivalencia :
Código:
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ódigo:
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 & :
Código:
@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 && :
Código:
@ECHO OFF
MSG * HOLA && ECHO EL COMANDO MSG SE EJECUTO CORRECTAMENTE
PAUSE>NUL

Es equivalente a :
Código:
@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 :

Código:
@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 :

Código:
@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 :

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

Código:
Aqui logicamente que si encontrará a google.com, pero que pasa si ponemos en lugar de google.com sdfjksjdf.com : 
Código:
@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 || :
Código:
@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 :

Código:
@ECHO OFF
ECHO HOLA ||~|| (ECHO SI)
PAUSE
Código:
@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.



Título: Re: Ejecución condicional [Batch] LEER
Publicado por: corax en 19 Noviembre 2008, 22:40 pm
Citar
Esto 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!


Título: Re: Ejecución condicional [Batch] LEER
Publicado por: WestOn en 20 Noviembre 2008, 00:19 am
Wenas, muy buena la explicacion, la verdad esto sirve bastante!
Nunca has pensado en hacer un manual completo de tu propia cosecha?
Opino lo mismo ;), un saludo


Título: Re: Ejecución condicional [Batch] LEER
Publicado por: leogtz en 20 Noviembre 2008, 05:19 am
Citar
Esto 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.


Título: Re: Ejecución condicional [Batch] LEER
Publicado por: carlitos.java en 20 Noviembre 2008, 07:05 am
buen artículo Rockox, aunque yo redefiniría || como %errorlevel% neq 0


Título: Re: Ejecución condicional [Batch] LEER
Publicado por: SmartGenius en 23 Noviembre 2008, 00:01 am
Excelente RockoX...nunca he llegado a usar || pero ya le veo utilidad....xD xD

Saludos.


Título: Re: Ejecución condicional [Batch] LEER
Publicado por: leogtz en 17 Diciembre 2008, 17:42 pm
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.


Título: GRACIASSS
Publicado por: Banti en 17 Diciembre 2008, 18:15 pm
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)