JiMmY_hAcK
NZ2
 
Desconectado
Mensajes: 133

"La informacion es libre", Lema Hacker
|
 |
« Respuesta #88 : 08 de Octubre de 2006, 11:18:33 » |
|
weno aqui os dejo el capitulillo.
Commando FOR
SINTAXIS
FOR %variable IN (cjto) DO comando
donde: %variable: es la variable que va a tomar el valor correspondient e en cada iteracion del for siendo de una unica letra, distinguiendo entre MAY y min (o numero) cjto: un cjto de ficheros comando: lo que queremos hacer en cada vuelta del for
Observaciones: Dentro de un bat, se debe usar %%variable (no %variable), esto se debe a que como he dicho antes, %variable puede tomar un numero, por lo que se podria confudir con los parametros del bat, si solo se pusiese un %
PARAMETROS
FOR /D %variable IN (conjunto) comando DO [parámetros] se usa cuando las extensiones de comandos estan habilitadas
FOR /R [[unidad:]ruta] %variable IN (set) DO comando [parámetros] Cuando usamos comodines, para ejecutar el for recursivamente dentro de un directorio especificado (unidad:ruta) en los archivos especificados por los comodines
FOR /L %variable IN (ini,paso,fin) DO comando [parámetros] Este es el típico FOR de toda la vida. supongo ini=0 paso=1 y fin=4, se crearia la sucesion 0,1,2,3,4,5
FOR /F ["opciones"] %variable IN (cjto archivos) DO comando [parámetros] Este es el que teine chichita.
FOR /F ["opciones"] %variable IN (cjto archivos) DO comando [parámetros]
En este, se procesa un conjunto de archivos, de tal forma que se abre el primer archivo, se procesa, se cierra y se pasa al siguiente archivo del cjto. Cada archivo se procesa por lineas, es decir, que el for sera aplicado a cada una de las lineas del archivo. el for inicia en la primera linea, y cuando acabe su proceso digamos que se "resetea" y pasa a la siguiente linea Las lineas en blanco se saltan Ahora, el procesamiento de cada linea se puede modificar a nuestro antojo mediante las ["opciones"], siendo estas:
EOL=c Indica que se procesen todas las linbeas del archivo menos las que empiecen por este caracter
SKIP=n Indica el nº de linea del archivo por el que empezamos a procesarlo. es decir, si pongo skip=5, las 5 primeras lineas del archivo no se procesaran
DELIMS=xxx Dice donde (en que simbolos) se quedara el for en cada vuelta (dentro de una misma linea)
TOKENS=x,y,m-n Dice cuales son las vueltas validas del for, es decir, en que vueltas del for nuestra variable tomara un valor. se pueden poner posiciones sueltas: 2,3,4 o rangos: 1-4 o incluso los dos juntos: 1,3-5. ademas, si ponemos el *, se añade otra variable adicional que contendra el resto de la cadena que no haya llegado a ser procesada por el FOR
USEBACKQ Esto es para el uso de comillas, no es algo muy importante, pero puede ser util dependiendo de como se llamen los archivos que vayamos a tratar y demas. esto mirarlo si interesa en la ayuda
Lo que viene despues en la ayuda es sobre el uso de expansion de variables, que puede ser util, pero mejor mirarlo en la ayuda ademas, esto se puede entender mejor en la ayuda del SET
Bueno. hasta aqui es la ayuda del for de msdos explicada por mi, que posiblemente no os haya servido pa na. Vamos con unos ejemplos a ver si solucionan la cosa.
Primero explicare como funciona el FOR /F ["opciones"] .........
Pues vamos a ver, esto lo que hace es buscar en todas las filas de un archivo. Entonces, almacena en variables el trozo de cadena que existe entre un delimitador y otro, y asi hasta el nº de tokens. un ejemplo cutre seria, en la linea
hola buenos dias
si el delim=" " (espacio en blanco) y tokens=1,2,3. esto significa que queremos coger 3 (1,2,3) trozos de cadena que esten uno tras otro de forma contigua y delimitados por el espacio. asi obtendriamos 3 variables que almacenarian i=hola j=buenos k=dias
Pongamos ahora un ejemplo real por si no se ha entendido. Creamos el archivo de texto 1.txt con el siguiente contenido
----------- 1.txt ;hola buenos dias este es un manual, dedicado al for ;para.la.gente. que.quiera.apr ender ;y para los demas tambien hasta luego 1 =Hola 2=adios 3=buenas -----------------
vamos a realizar un primer FOR. abrimos la consola y ponemos
for /f "eol=; tokens=1 delims=," %i in (1.txt) do echo %i
Este for procesara todas las lineas menos las que empiecen por ; ya que eol=; En cada linea que procese solo dara tantas vueltas como "," se encuentre (delims=,). y almacenara en la variable %i, solamente la parte de la cadena que se encuentre entre el principio y la primera (tokens=1) aparicion de "," Para las lineas que no tengan "," se considera el primer token como la linea completa, porlo que en esas lineas en vez de pasar de ella, las tomara enteras en la variable. Asi, el resultado de este for seria:
este es el manual ---> falta lo que viene a partir de la "," porque no lo ha cogido debido al delims hasta luego | 1 =Hola |-->En estas, como no hay "," coge toda la linea 2=adios | 3=buenas |
Otro ejemplo mas claro seria:
for /f "eol=; tokens=1,2,3 delims= " %i in (1.txt) do echo %i %j %k
lo mismo daria poner la parte tokens asi: for /f "eol=; tokens=1-3 delims= " %i in (1.txt) do echo %i %j %k
Ahora queremos coger de cada linea, menos de las que empiecen por ; (eol=;) las cadenas que se encuentren entre token1 --> el principio y el primer " " (delims=" ") token2 --> el primer " " y el segundo " " token3 --> el segundo " " y el tercer " " y el resto lo desechariamos. Darse cuenta de que en este caso necesitamos coger 3 cosas por cada linea, por lo que no nos vale solo con la variable %i, si no que necesitaremos tambien las %j y %k. Para esto, j y k no se declaran en el for (como la %i, de hecho unicamente se dclara la primera que se vaya a usar, puede ser %i, %a, %1 o lo que sea), si no que se ponen en el la parte del comando a la hora de trabajar con ellas. Tener en cuenta tambien que si declaramos la variable %i en el for todas las que usemos deben ir consecutivas en orden alfabetico y nunca superar los 26 simbolos. seria %i %j %k %l %m.... si seleccionamos %a en el for, seria %a %b %c %d. y siempre diferenciando entre MAY y min.
Entonces en este ejemplo nos saldria lo siguiente:
este es un hasta luego 1 =Hola 2=adios 3=buenas
si queremos, para verlo mas claro, podemos meter algun caracter raro entre %i, %j y %k
for /f "eol=; tokens=1-3 delims= " %i in (1.txt) do echo %i ? %j ? %k
Obteniendo el siguiente resultado
este ? es ? un hasta ? luego ? 1 ? =Hola ? 2=adios ? ? 3=buenas ? ?
Vemos como en las lineas 3 y 4 aparecen las ? al final y sin nada entre medias, esto se debe a que la variable %i contiene 2=adios (todo hasta el final) y las variables %j y %k estan vacias
Un ultimo ejemplo para ver el uso del * seria. para ello le quitamos el ; al principio de todas las lineas que lo tuvieran:
for /f "tokens=1,2* delims= " %i in (1.txt) do echo %i ? %j ? %k
Ahora pone en las variables %i y %j: token1 (variable %i)--> entre el principio y el primer " " (delims=" ") token2 (variable %j)--> entre el primer " " y el segundo " " y en la variable %k, que viene definida por el token *, se pondra el resto de la cadena
asi el resultado seria:
hola ? buenos ? dias este ? es ? un manual, dedicado al for para.la.gente. que.quiera.apr ender ? ? y ? para ? los demas tambien hasta ? luego ? 1= ? hola ? 2=adios ? ? 3=buenas ? ?
--------------------------
por ultimo os pongo un ejemplo muy util cuando por ejemplo queremos buscar en un archivo de registro, un valor determinado.
imaginaros que quiero buscar en el archivo 1.reg, el valor de la clave SwapMouseButto ns. sabiendo que en el archivo 1.reg, existe una linea que pone SwapMouseButto ns=1. pero ademas hay muchas otras lineas similares como: mouse=9 but=6 ....
asi que si usamos el for normal sobre el archivo directamente no hay forma de sacar solo el valor que queremos por lo que podemos hacer un find sobre el archivo que nos devuelva unicamente la linea que contiene la palabra SwapMouseButto ns, y hacer el for sobre ella. con esto quiero decir, que ademas de sobre archivos, podemos aplicar el for sobre comandos que actuen sobre archivos y nos den lo que queremos de ellos de una forma mas especifica. este ejemplo seria asi:
FOR /F "tokens=1* delims==" %A IN ('FIND /I "SwapMouseButto ns" c:\1.reg') do echo %B
el resultado seria que muestra por pantalla: 1 si hubiesemos puesto ..... do echo %A mostraria por pantalla SwapMouseButto ns
PD. espero que os aya servido de algo.
|