Problema al guardar nombre de archivo en variable (batch) SOLUCIONADO

Iniciado por <ИΘZIЭ(ŦB>, 17 Septiembre 2009, 06:04 AM

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

<ИΘZIЭ(ŦB>

Qué tal amigos del foro! Otra vez yo por aquí.

Acabo de toparme con un detallito que me complica la vida. Resulta que tengo un .txt que contiene enlistados los nombres de varios archivos en una carpeta. Luego recupero esos nombres y los guardo en una variable tipo matriz (o como se le llame), para lo cual uso el comando CALL SET dentro de un ciclo FOR, como me enseñaron aquí.

En fin, el problema es que hay archivos que tienen un espacio al inicio del nombre, pero la variable del FOR (%%a) se lo quita, lo que me deja ineficiente el script.

Déjenme mostrárselo:

Supongamos que esta es mi lista (Lista.txt):

Archivo1.txt
Archivo2.txt
Archivo3.txt
Archivo4.txt


Como ven, la línea 3 tiene almacenado el nombre de un archivo, pero ese espacio al inicio no es un error al crear la lista, sino que el archivo se llama así: " Archivo3.txt".
Ok. Entonces, para crear mi variable con los valores de cada línea hago esto:


set lin=0
for /f "tokens=*" %%a in (Lista.txt) do (
      set /a lin+=1
      call set list!lin!="%%a"
)


En este punto la variable list ya contiene el nombre de cada línea por separado, pero con el detalle de que la línea tres no se guardó así: " Archivo3.txt", como debería, sino así: "Archivo3.txt", lo cual inevitablemente me produce un error posteriormente.

Pues bien, tras haber analizado de dónde surge el error, noté que es en la variable del FOR (%%a); esta no se trae el valor con el espacio en blanco inicial, sino que lo quita. Por eso luego se guarda en la variable list de ese modo.

Así pues, ¿qué medida puedo tomar para recuperar el texto de la línea 3 tal cual como está en List.txt, con su respectivo espacio en blanco inicial? De verdad agradezco previamente su valiosa ayuda.

xassiz_

A lo mejor te sirve un delims..


for /f "delims= " %%%% in () do ()



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

<ИΘZIЭ(ŦB>

No amigo. No funciona. Sigue trayéndose el texto sin el espacio en blanco inicial.

¿Alguna otra sugerencia?

FranciskoAsdf

A ver según  lo que entiendo es que llamas a cada archivo para realizar alguna operación, a mi se me ocurre que podrias hacer un IF EXIST o no? por ejemplo:
nose si funcione solo es una idea nada mas xD (no soy muy bueno con los FOR xD)

set lin=0
for /f "tokens=*" %%a in (Lista.txt) do (
       set /a lin+=1
       call set list!lin!="%%a"
)
:ComprobarExistencia
IF NOT EXIST "%VariableConElNombreDelArchivo%" (SET "hola= %VariableConElNombreDelArchivo%") ELSE (GOTO :SiExiste)
IF NOT EXIST "%hola%" (GOTO :NoExistexD) ELSE (GOTO :ComprobarExistencia)

o algo asi, vas comprobando si existe cada archivo (supongo que seria un poko mas lento el proceso), porke si los tienes en una lista es porque en alguna parte los debes tener almacenados, tonces si no esta el archivo sin espacio, le das el espacio en una variable, y si el resultado es Correcto que haga otra cosa xD, soy medio complicado para dar explicaciones xD pero supongo que se entiende un poco ;S.-

Espero que te sea de ayuda, pero si no nada que hacer, y porfa no me puteen xDDDD

Saludos =)

Asdf debería ser algún tipo de función.

<ИΘZIЭ(ŦB>

Gracias amigo! Es una buena idea! Había estado pensando en alternativas ya que no me habían respondido, pero no hallaba ninguna, y esa es una muy buena. Ya mismo voy a probarla y luego te cuento.

<ИΘZIЭ(ŦB>

Listo! Fue más fácil de lo que pensé. Solo usé el IF EXIST y bastó. Fíjate:


set lin=0
for /f "tokens=*" %%a in (Lista.txt) do (
       set /a lin+=1
       If exist "%%a" call set list!lin!="%%a"
       If not exist "%%a" call set list!lin!=" %%a"
)


Así de fácil! De verdad gracias compañero!

Ahora bien, me pasa por la mente la posibilidad de que en algún momento me encuentre con un archivo que tenga más de un espacio en blanco, ante lo cual no funcionaría este código. En ese caso sí es necesario hacer un ciclo, aunque no sé si con un FOR. Voy a probar. Aunque me gustaría saber si hay una manera de detectar el nombre real de un archivo con espacios y todo con algún parámetro. Si alguien sabe se lo agradezco.

FranciskoAsdf

De nada, pense que no funcionaria, ya que soy un poko rustico para codificar xD, ahora lo del nombre del archivo, podrias usar y mezclar los siguientes comandos:

       %~f1        - regresa la ruta y el archivo de %1.
       %~d1        - regresa la letra de la unidad de %1.
       %~p1        - regresa solo la ruta del archivo %1.
       %~n1        - regresa solo el nombre de archivo %1.
       %~x1        - regresa solo la extension del archivo %1.
       %~s1        - regresa solo la ruta, con directorios, con nombres cortos del archivo %1.
       %~a1        - regresa los atributos del archivo.
       %~t1        - regresa la hora/fecha del archivo %1
       %~z1        - regresa el tamaño del archivo %1.


osea si quiiseras saber la ura y el nombre de un archivo deberia ser algo asi

set "nombrearchivo=%~f1"
pero debes pasarle como variable el nombre del archivo, osea podrias hacer una funcion:

:RutaYNombreDeArchivo
echo %~f1
GOTO :eof


y despues la llamas cuando la necesites

call :RutaYNombreDeArchivo a.txt

algo asi deberia ser ^^

saludos xD estoy en mi trabajo pero es cosa de investigar
:)

Asdf debería ser algún tipo de función.

<ИΘZIЭ(ŦB>

Bueno amigos del foro, les cuento que hallé una forma para contrarrestar este error que presenta la variable del FOR. Pude conseguirla gracias a la ayuda de unos compañeros, y pueden encontrarla en el otro tema relacionado que publiqué. Este es el enlace:

http://foro.elhacker.net/scripting/problema_con_variable_del_for_batch_solucionado-t268022.0.html

Gracias de nuevo.

Aranguez

Hola buenas noches, no llevo mucho tiempo en esto pero me intereso tu problema y lo simulé, a mi me funciona con cualquier cantidad de espacios con este codigo, si lo pules un poquito seguro que te funcionará:

@echo off
setlocal EnableDelayedExpansion
del salida.txt
@FOR /F "tokens=* delims=" %%a IN ('type c:\lista.txt') DO (
echo %%a>>salida.txt
)