elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Leer líneas de archivo no funciona en doble ciclo FOR (batch) (SOLUCIONADO)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Leer líneas de archivo no funciona en doble ciclo FOR (batch) (SOLUCIONADO)  (Leído 8,836 veces)
<ИΘZIЭ(ŦB>

Desconectado Desconectado

Mensajes: 109


-cyman-


Ver Perfil
Leer líneas de archivo no funciona en doble ciclo FOR (batch) (SOLUCIONADO)
« 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.


« Última modificación: 1 Octubre 2009, 04:25 am por cyman » En línea

0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: Leer líneas de archivo no funciona en doble ciclo FOR (batch)
« Respuesta #1 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 (



En línea

<ИΘZIЭ(ŦB>

Desconectado Desconectado

Mensajes: 109


-cyman-


Ver Perfil
Re: Leer líneas de archivo no funciona en doble ciclo FOR (batch)
« Respuesta #2 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.
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Leer líneas de archivo no funciona en doble ciclo FOR (batch)
« Respuesta #3 en: 1 Octubre 2009, 04:13 am »

http://foro.portalhacker.net/index.php/topic,86033.0.html
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines