Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: 0x0309 en 1 Abril 2009, 11:27 am



Título: [BATCH] Bug comando for (eol)
Publicado por: 0x0309 en 1 Abril 2009, 11:27 am
El comando for del cmd.exe tiene un bug con la opción /f.

El manual dice que eol es el último carácter  de la línea y en realidad es el primero, por lo que debería llamarse bol (begin of line)

El bug está en la opción eol del comando for /f, la opción por defecto es ';' el manual no dice nada de esto, por lo que si tenemos líneas que comienzen con ; estas serán ignoradas (y creíamos que leíamos todas las líneas de un archivo  :huh:).

Yo pensé que esto se solucionaba sobreescribiendo la opción eol así: eol=
Pero descubrí otro problema, si se ingresa más de una opción, el espacio separador entre la opción eol= y siguienteOpción es considerado por eol además de separador de opción, como carácter de comienzo de línea, por lo que líneas que comienzen con espacio son ignoradas.

Entonces, pensé que la solución era escribir eol= al final para que no hubiera ninguna otra opción a continuación y así realmente sobreescibir la opción por defecto (';') y leer todas las líneas de un archivo, y yo daba el tema por solucionado cuando hoy intentando hacer un script realmente útil para convertir unos textos con otro formato (el batch de utilidad) cuando descubrí que la opción eol es aún más tonta, y considera las comillas de cierre de opciones como carácter por lo que líneas que comienzen con '"' no son leídas.

Ahora ¿cómo leemos todas las líneas de un archivo con for /f?
Aún no le encuentro solución, ni me interesa, solo lo digo para que sepan.

Ejemplo:

archivo.txt
Código:
texto normal
;punto y coma
   con espacio al principio
"entre comillas"

lee.bat
Código:
@echo off
Echo.Contenido del archivo:
Echo.texto normal
Echo.;punto y coma
Echo.   con espacio al principio
Echo."entre comillas"
Echo.

Echo.Ahora las lecturas de for /f.
echo.
echo.Opcion: "tokens=* delims="
for /f "tokens=* delims=" %%a in (archivo.txt) do echo.%%a
echo.

echo.Opcion: "eol= tokens=* delims="
for /f "eol= tokens=* delims=" %%a in (archivo.txt) do echo.%%a
echo.

echo.Opcion: tokens=* delims= eol=
for /f "tokens=* delims= eol=" %%a in (archivo.txt) do echo.%%a
echo.
pause


resultado:
Código:
Opcion: "tokens=* delims="
texto normal
   con espacio al principio
"entre comillas"

Opcion: "eol= tokens=* delims="
texto normal
;punto y coma
"entre comillas"

Opcion: tokens=* delims= eol=
texto normal
;punto y coma
   con espacio al principio


O se pierden las líneas que comienzan con ; o espacio o comillas dobles.

Queda la pregunta de cómo leer todas las líneas. Me molesta el error, porque cmd.exe es un software viejo, desde el windows nt (1995) que existe, y además de que la documentación lo llama eol cuando debería llamarse bof (revisen la documentación, dice carácter de final de línea) no menciona que la opción por defecto es ';' y me molesta más aún cuando perdí tiempo buscando solución al resultado de mi script. Esto lo he probado en windows seven. 14 años cmd.exe con el error del eof, ¿no creen que es mucho?


Título: Re: [BATCH] Bug comando for (eol)
Publicado por: SmartGenius en 1 Abril 2009, 14:06 pm
jajjaa...me dio risa lo de 14 años y nada que lo solucionan..es que definitivamente en microsoft no terminan de hacer las vainas...aparte ahora estan concentrados en otras vainas...y ya no prestan mucha atencion a lo relacionado con DOS....

Saludos.


Título: Re: [BATCH] Bug comando for (eol)
Publicado por: leogtz en 1 Abril 2009, 17:25 pm
Una pena, yo pensé que la solución era eol=" cuando me avisaste  :-\

Tendremos que utilizar un caracter poco comun o no imprimible  :-\

Saludos.