Leer líneas de archivo no funciona en doble ciclo FOR (batch) (SOLUCIONADO)

Iniciado por <ИΘZIЭ(ŦB>, 1 Octubre 2009, 03:39 AM

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

<ИΘZIЭ(ŦB>

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:

Linea 1
Linea 2
Linea 3


Las líneas me las traigo como ya saben:


@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:


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:


Linea 1
Linea 2
Linea 3


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


@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:


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.

0x0309

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:

for /f "tokens=*" %%L in ("%crrFile%") do (

por:

for /f "tokens=*" %%L in (%crrFile%) do (

o:

for /f "usebackq tokens=*" %%L in ("%crrFile%") do (


<ИΘZIЭ(ŦB>

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.

leogtz

Código (perl) [Seleccionar]

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

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