Problema con variable del FOR (Batch) SOLUCIONADO

Iniciado por <ИΘZIЭ(ŦB>, 20 Septiembre 2009, 01:11 AM

0 Miembros y 2 Visitantes están viendo este tema.

<ИΘZIЭ(ŦB>

Cómo están amigos del foro?

Acudo a uds nuevamente por un problema que ya me está desagradando. Es segunda vez que me pasa, y de veras me causa muchos problemas.

Ya publiqué otro tema donde mencioné que cuando uso el ciclo FOR para tomar una línea de un archivo de texo resulta que la variable del ciclo (%%x) no me lo trae exacta ante algunos detalles; el primero: cuando el primer caracter es un espacio en blanco, y ahora en segundo lugar: cuando la línea tiene un signo de exclamación (!). En ambos casos me quita ese caracter, por cuanto si la línea dice:

" Hola mundo!" (sin las comillas)

la variable %%x se trae:

"Hola mundo" (sin las comillas).

Esto de verdad es un problema, porque lo que contengo en esas líneas son nombres de archivos que posteriormente necesito renombrar, pero ante tal cambio el sistema no puede encontrar los archivos. Ejemplo:

MiLista.log

Archivo1.txt
!Archivo.txt
archivo.txt


Esa es mi lista. El código del batch es:


setlocal enabledelayedexpansion

set lin=0
for /f "tokens=*" %%a in (MiLista.log) do (
       set /a lin+=1
       call set lsn!lin!=" %%a"
       echo %%a
)

for /l %%n in (1,1,!lin!) do (
       echo Linea %%n: "!lsn%%n!"
)


Bien, esto genera el siguiente resultado:


Linea 1: "Archivo1.txt"       (Bien!)
Linea 2: "Archivo.txt"         (Mal! Falta el !)
Linea 3: "archivo.txt"         (Mal! Falta el espacio del inicio)


Así pues, podrán entender mi frustración. De verdad que esto inhabilita todo el resto de mi batch, así que me urge la ayuda de quien sepa cómo solucionarlo.

Debo acotar que sé que la función inicial (setlocal enabledelayedexpansion) suprime el signo de exclamación de algunas líneas, y que para poder verlo hay que usar el símbolo ^ al lado del mismo. Lo que no sé es cómo hacer eso aquí en en vista de que no sé cuál línea contendrá ese caracter.

De verdad agradezco la ayuda que puedan darme al respecto.

Guerrerohgp

que tal dos for? no se ta ha ocurrido?
ej:
for /f "tokens=*" %%H in (dir tu directorio /b) do (set var=%%H&call:HGP)
pause

:HGP
for /f "usebackq delims==" %%a in (`type %var%`) do @echo %%a
goto:eof


creo q con esto y experimentando un poco lo logras.
;D ;D ;D ;D
suerte!!

<ИΘZIЭ(ŦB>

Amigo, primero gracias por el interés. Estoy aquí revisando cada rato el foro porque estoy varado por eso. Ahora, quisiera algunos detalles que no entiendo bien, si no es molestia.

Yo soy nuevo programando en batch, por eso no sé algunas cosas. Por ejemplo, eso de usar el comando DIR dentro del FOR ¿cómo funciona? Yo en mi batch primero uso el dir para crear mi MiLista.log, y luego es que me traigo la lista al batch. ¿No es necesario hacer eso? ¿Podrías modificar tu ejemplo justo con los datos que yo suministré? O sea, usando el nombre del archivo que yo tengo (MiLista.log). ¿Dónde iría en ese ejemplo?

Te lo agradezco.

leogtz

Si quieres trabajar con los archivos en un directorio, podrías hacer esto, más resumido:

No testeado:
for /f "tokens=*" %%_ in ('dir /b "ruta"') do (
:: Borrar los archivos :
del /f /p "%%_"
)
Código (perl) [Seleccionar]

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

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

<ИΘZIЭ(ŦB>

Que tal Leo?

Probé lo que dices y funciona excepto por esto:


@echo off
set cont=0
for /f "tokens=*" %%_ in ('dir /b "ruta"') do (
       set /a cont+=1
       echo "(%cont%) %%_"
)


No me suma el %cont%. Todo el listado aparece con (0) al inicio. ¿Por qué?

leogtz

Código (perl) [Seleccionar]

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

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

Guerrerohgp

bueno , tarde no?

jeje, bueno esq la suma en for solo es valida con las variables retrasadas, osea solo se pueden llamar con
"!"

<ИΘZIЭ(ŦB>

Sí, eso es.

Bueno amigo Guerrero, aplicando la idea que me diste de los FOR pude hallar la solución que quería. Traté de implementar el otro método del amigo Leo, pero en vista de que tengo que volver a usar el delayexpansion que no me gusta, me quedo mejor con esta. Así lo hice:


@echo off
set lin=0
for /f "tokens=*" %%a in (MiLista.log) do (
        set textoLinea=%%a
        set /a lin+=1
        call:show
)
exit

:show
If not exist "%textoLinea%" call:iniSpace
echo "Línea %lin%: %textoLinea%"
goto:eof

:iniSpace
set "textoLinea= %textoLinea%"
If not exist "%textoLinea%" goto iniSpace
goto:eof


Con esto sí logro mi resultado deseado:


Linea 1: "Archivo1.txt"
Linea 2: "!Archivo.txt"
Linea 3: " archivo.txt"


Gracias de verdad por su preciado aporte! Siempre me sacan del apuro!

Guerrerohgp

de nada.  ;D ;D ;D y pon la solucion en los demas foros para q alla no c quede como no solucionad, suerte con el resto.