Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: <ИΘZIЭ(ŦB> en 1 Octubre 2009, 03:39 am



Título: Leer líneas de archivo no funciona en doble ciclo FOR (batch) (SOLUCIONADO)
Publicado por: <ИΘZIЭ(ŦB> en 1 Octubre 2009, 03:39 am
Cómo están amigos del foro? De nuevo necesito su valiosa ayuda.

Resulta que estoy usando un FOR para traerme una por una las línes de un archivo de texto. Fíjense:

Tengo este archivo de texto: Archivo.txt, cuyo contenido es el siguiente:
Código:
Linea 1
Linea 2
Linea 3

Las líneas me las traigo como ya saben:

Código:
@echo off
set crrFile=c:\Archivo.txt
for /f "tokens=*" %%L in ("%crrFile%") do (
     echo Procesando linea: %%L
)
echo.
echo Terminado
pause>nul

Esto funciona perfecto. Me lista las líneas justo como quiero:

Código:
Linea 1
Linea 2
Linea 3

Terminado.

Ahora bien, el problema se me presenta cuando uso este mismo código en una función llamada desde otro ciclo FOR. Vean cómo:

Esta vez tengo tres archivos de texto: Archivo1.txt, Archivo2.txt y Archivo3.txt, los cuales tienen el mismo contenido:

Código:
Linea 1
Linea 2
Linea 3

Pues bien, para listar las líneas de cada uno hago lo siguiente:

Código:
@echo off
:Funcion1
for /f "tokens=*" %%F in ('dir /a /b *.txt') do (
     set "crrFile=%%F"
     echo Procesando archivo: %%F
     call:Funcion2
     echo.
)
echo.
echo Terminado
pause>nul

:Funcion2
for /f "tokens=*" %%L in ("%crrFile%") do (
     echo Procesando linea: %%L
)
goto:eof

Como ven, el código para listar el txt es igual al del primer caso; la única diferencia es que aquí tomo el nombre del archivo del ciclo FOR ejecutado en :Funcion1. Lo que no entiendo es por qué el ciclo de :Funcion2 no lista las líneas del archivo, aunque la variable %crrFile% si almacena bien el nombre de cada archivo de texto. En vez de eso, el segundo ciclo me vuelve a mostrar el nombre del archivo contenido en %crrFile%. Fíjense:

Código:
Procesando archivo: C:\Archivo1.txt
Procesando linea: C:\Archivo1.txt

Procesando archivo: C:\Archivo2.txt
Procesando linea: C:\Archivo2.txt

Procesando archivo: C:\Archivo3.txt
Procesando linea: C:\Archivo3.txt

Terminado.

Ven? No entiendo por qué hace esto! No muestra las líneas del archivo sino el nombre del archivo.
Por favor, alguien sabe por qué pasa eso? Yo de verdad no entiendo. Le agradezco puedan ayudarme.


Título: Re: Leer líneas de archivo no funciona en doble ciclo FOR (batch)
Publicado por: 0x0309 en 1 Octubre 2009, 04:04 am
Es porque en el segundo for encerraste entre comillas, por lo que indicas que el nombre del archivo es el texto a procesar y no el contenido del archivo, si lo quieres usar con comillas por ejemplo para trabajar con nombres de archivos que tienen espacio debes añadir useback.

Es decir o cambias:

Código:
for /f "tokens=*" %%L in ("%crrFile%") do (

por:

Código:
for /f "tokens=*" %%L in (%crrFile%) do (

o:

Código:
for /f "usebackq tokens=*" %%L in ("%crrFile%") do (



Título: Re: Leer líneas de archivo no funciona en doble ciclo FOR (batch)
Publicado por: <ИΘZIЭ(ŦB> en 1 Octubre 2009, 04:11 am
Chamo! Escogí el useback y funcioné perfecto! Gracias pana! Lo malo es que no comprendí qué función cumple e useback. Podrías decirme? De verdad te agradezco.


Título: Re: Leer líneas de archivo no funciona en doble ciclo FOR (batch)
Publicado por: leogtz en 1 Octubre 2009, 04:13 am
http://foro.portalhacker.net/index.php/topic,86033.0.html (http://foro.portalhacker.net/index.php/topic,86033.0.html)