2008-10-15 24 views
80

¿Cómo se puede leer un archivo (texto o binario) de un archivo por lotes? Hay una forma de leerlo en modo binario o modo de texto?Batch files: ¿Cómo leer un archivo?

+0

@ RookieTEC9: sí, sé que son 2 cosas completamente diferentes, pero necesitaba una respuesta que funcionara en msdos, no en windows nt (o versiones más recientes), también esta pregunta fue hecha hace 7 años, tenga eso en mente –

+0

@ RookieTEC9: Creo que tienes razón, ha pasado un tiempo desde esto. Eliminaré la etiqueta ms-dos –

+0

Puede usar el comando 'TYPE [fileName]' para MS-Dos. – RookieTEC9

Respuesta

37

Puede utilizar el comando para:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 

Tipo

for /? 

en el símbolo del sistema. ¡También puedes parse ini files!

+14

Este es un ejemplo bastante complejo, al analizar información muy específica de un archivo de texto con formato especial, sin dar ninguna explicación. Según 'for /?' El comando * analizaría cada línea en myfile.txt, ignorando las líneas que comienzan con un punto y coma, pasando el 2 ° y 3 ° token de cada línea al cuerpo, con tokens delimitados por comas y/o espacios . * –

57

Bajo cmd.exe al estilo NT, puede recorrer a través de las líneas de un archivo de texto con

FOR /F %i IN (file.txt) DO @echo %i 

Tipo "Ayuda" en el símbolo del sistema para obtener más información. (No sé si funciona en cualquier "DOS" que está utilizando)

+15

Debería ser '%% i'. –

+25

Este comando dejará de leer una línea si encuentra un carácter de espacio en blanco. Finalmente terminé usando FOR/F "tokens = *" %% i IN (archivo.txt) DO @ECHO %% i – Jason

+8

¡Funciona! y Si está usando la consola, pruebe% i si está usando un archivo bat entonces intente %% i. –

31

El FOR-LOOP generalmente funciona, pero hay algunos problemas. FOR no acepta líneas vacías y las líneas con más de ~ 8190 son problemáticas. La expansión funciona solo de manera confiable, si la expansión demorada está deshabilitada.

La detección de CR/LF frente a una sola LF parece también un poco complicada.
También los caracteres NUL son problemáticos, ya que FOR-Loop cancela inmediatamente la lectura.

Direct lectura binaria parece por lo tanto casi imposible.

El problema con las líneas vacías se puede resolver con un truco. Prefija cada línea con un número de línea, utilizando el comando findstr, y después de leer, elimine el prefijo.

@echo off 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    echo(!var! 
    ENDLOCAL 
) 

alternar entre activar y expansión retardada con discapacidad es neccessary para el trabajo seguro con cuerdas, como ! o ^^^xy!z.
Esto se debe a que la línea set "var=%%a" solo es segura con DisabledDelayedExpansion, de lo contrario, los signos de admiración se eliminan y los caracteres de intercalación se utilizan como caracteres de escape (secundarios) y también se eliminan.
Pero usar la variable var es solo seguro con EnabledDelayedExpansion, ya que incluso un call %%var%% fallará con contenido como "&"&.

EDITAR: Añadido fija/variante p
Hay una segunda forma de leer un archivo con set /p, las únicas desventajas son que se limita a ~ 1024 caracteres por línea y se elimina caracteres de control al final de línea .
Pero la ventaja es que no necesita la conmutación retrasada y es más fácil de almacenar valores en las variables

@echo off 
setlocal EnableDelayedExpansion 
set "file=%~1" 

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n" 
set "len=!len:*: =!" 

<%file% (
    for /l %%l in (1 1 !len!) do (
    set "line=" 
    set /p "line=" 
    echo(!line! 
) 
) 

Para leerlo "binario" en un hexágono representación
Usted podría mirar SO: converting a binary file to HEX representation using batch file

+0

Gracias por el puntero sobre el uso de 'set/p'. Utilicé 'set/p value = SteveC

+0

Jeb, hice una pregunta relacionada con su solución anterior en http://stackoverflow.com/questions/11408295/with-dos -batch-file-how-to-parse-a-file-and-output-part-to-one-file-part-to-an – Nicholas

+0

¿Qué pasa con el carácter EOF (final de archivo), ASCII '0x1A' ? ¿'for/F' se comporta de la misma manera que con los caracteres NUL (' 0x00')? – aschipfl

-4

si quieren sólo para mostrarlo en cmd, puede utilizar esto:

cat myfile.txt 
+6

'cat' no es un comando de Windows , deberías usar 'type' para eso. –

0

Bueno theres al ot de diferentes maneras, pero si sólo desea mostrar el texto y lo almacene en cualquier lugar a continuación, sólo tiene que utilizar: findstr /v "randomtextthatnoonewilluse" filename.txt

0

Una manera muy fácil de hacerlo es utilizar el siguiente comando:

set /p mytextfile=< %pathtotextfile%\textfile.txt 
echo %mytextfile% 

Esta voluntad solo muestra la primera línea de texto en un archivo de texto. La otra manera de hacerlo es utilizar el siguiente comando:

type %pathtotextfile%\textfile.txt 

Esto pondrá todos los datos en el archivo de texto en la pantalla. ¡Espero que esto ayude!

Cuestiones relacionadas