Descubrimientos y tecnicas, comando FOR. [Batch]

Iniciado por leogtz, 10 Mayo 2009, 22:01 PM

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

leogtz

1.-Otras formas de separar los elementos del conjunto en parametro /L:

FOR /L %variable IN (inicio, paso, fin) comando DO
Los elementos del conjunto FOR, los podiamos separar de la siguiente manera:
for /l %%_ in (1 1 10) do (Acciones)
for /l %%_ in (1,1,10) do (Acciones)

He experimentado con algunas otras:
Código (dos) [Seleccionar]
for /l %%_ in (1;1;10) do (echo %%_)
for /l %%_ in ([1;1;10]) do (echo %%_)

En este hubo un ligero cambio, no inició desde 1, sino desde 0, luego explicaré por qué.
Código (dos) [Seleccionar]
for /l %%_ in ([1,1,10]) do (echo %%_)
Lo mismo, inicia desde 0.
Por qué inicia desde 0 y no de 1?
Aqui:
Código (dos) [Seleccionar]
for /l %%_ in ([1,1,[10]]) do (
echo %%_
)

El primer 1 no es reconocido como un elemento valido y lo inicia desde 0, da lo mismo que hicieramos:
Código (dos) [Seleccionar]

for /l %%_ in ("1" 1 20) do (echo %%_)

Igual lo iniciaría en 0.

Esto puede tener una aplicación práctica, ya sea para confundir un código:
Código (dos) [Seleccionar]
for /l %%_ in (
{[200]}
2
100
) do (
echo %%_
)

Se forza a que el primer elemento empieze por 0.

2.-Especificar numeros en hexadecimal como elementos del conjunto, para el parametro /L
FOR /L %variable IN (inicio, paso, fin) comando DO
Código (dos) [Seleccionar]
for /l %%_ in (0x0001 0x0001 0x0064) do (echo %%_)
Muestra una lista desde 1 hasta 100.
Tambien se puede especificar valores negativos:
Código (dos) [Seleccionar]
for /l %%_ in (-0x0004 0x0001 0X0064) do (echo %%_)
Combinar decimal con hexadecimal:
Código (dos) [Seleccionar]
for /l %%_ in (0x0001 0x0001 100) do (echo %%_)
Más ejemplos:
Código (dos) [Seleccionar]
for /l %%_ in (0x64 0x01 0xC8) do (
pause
echo %%_
)

Código (dos) [Seleccionar]
for /l %%_ in (0x01 0x01 0x64) do (
echo %%_
)


3.-Nueva forma de poner comentarios, sobre el conjunto del comando FOR, parametro /L
FOR /L %variable IN (inicio, paso, fin) comando DO
Código (dos) [Seleccionar]
for /l %%_ in (1Uno 1Incremento_de_uno 100Hasta_100) do (
echo %%_
)

Como ven, se puede poner texto despues del elemento "inicio" "paso" y "fin".
Otra manera, a mi parecer mas comoda:
Código (dos) [Seleccionar]
for /l %%_ in (2"Dos demas comentarios" 2"Dos dems comentarios" 100"Cien dems comentarios") do (
echo %%_
)

Otros ejemplos:
Código (dos) [Seleccionar]
for /l %%_ in (
1-"Empezamos en uno"
1-"Con un incremento de una unidad"
100-"Terminamos en 100"
) do (
echo %%_
)

Incluso pueden poner caracteres especiales dentro del comentario, son completamente ignorados.

Combinadas todas las técnicas:
Código (dos) [Seleccionar]
@echo off
for /l %%_ in (
{[-0x001E]}-"Especifico -30 en hexadecimal, pero es ignorado y empieza en 0, por los {[]}"
;2-"Especifico 2 en decimal, incrementa la unidad en 2"
;0x0064-"100 en hexadecimal, el loop termina en 100"
) do (
echo %%_
ping -n 1 loopback > nul 2>&1
)

Salida:
0
2
4
6
8
10


Nota: Estas son cosas que he descubierto solo, si algunas de ellas ya estaban documentadas, haganmelo saber.

Leo Gutiérrez Ramirez.

Saludos.
Código (perl) [Seleccionar]

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

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

SmartGenius

Algunas cosas de esas me habian pasado, pero no le prestaba atencion, igual muchisimas gracias por tu aporte. ;P

Saludos.

PD: te respondo aqui o en todos lados...xD xD xD  ;D


leogtz

Cita de: :: SmartGenius :: en 11 Mayo 2009, 05:31 AM
Algunas cosas de esas me habian pasado, pero no le prestaba atencion, igual muchisimas gracias por tu aporte. ;P

Saludos.

PD: te respondo aqui o en todos lados...xD xD xD  ;D

Cosas como cuales?
Código (perl) [Seleccionar]

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

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

0x0309

Interesante lo de los comentarios, no había visto eso en ninguna parte.
Yo había enviado a code-makers un artículo del comando for, que al final pedí que lo cancelaran (cuando encontré el error del eol), y en la parte de for /l tenía esto:


La sintaxis es:

for /L {%% | %}variable in (númeroInicial,númeroPaso,númeroFinal) do comando

for /L utiliza un grupo interno de valores iguales a 0.

Por ejemplo:

for /L %%a in () genera la secuencia (0 0 0 0 0 ... infinito) porque para for /L eso es : (0,0,0).

for /L %%a in (-1) genera la secuencia (-1 -1 -1 -1 ... infinito) porque para for /L eso es: (-1,0,0).

for /L %%a in (0,1) genera la secuencia (0) porque para for /L eso es: (0,1,0).

En for /L lo que va dentro de in puede separarse por espacios y/o comas.

Los números pueden escribirse en notación decimal, octal y hexadecimal.


Ahora que dices que pueden usarse ; la lógica dice que puede usarse cualquier delimitador de cmd, es decir:
espacio
coma
punto y coma
=

for /L %%a in (0=1=10) do echo %%a


En for /l el goto :eof se interpreta como el cierre del batch (el return de c), en cambio en los otros for se interpreta como el continue de c, es decir, se va arriba y se evalúa la condición nuevamente.

Ejemplo:

@echo off

for /f %%a in ("uno dos nueve") do (
if "%%a"=="dos" goto :eof
echo.%%a

)

pause

for /l %%a in (1,2,9) do (
if %%a equ 5 goto :eof
echo.%%a
)

pause