Archivos por lotes: ¿Cómo leer un archivo?

97

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

Lucas Gabriel Sánchez
fuente
@ 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 se hizo hace 7 años, tenlo en cuenta
Lucas Gabriel Sánchez
@ RookieTEC9: Creo que tienes razón, ha pasado un tiempo desde esto. Quitaré la etiqueta ms-dos
Lucas Gabriel Sánchez
1
Puede utilizar el comando TYPE [fileName]para MS-Dos.
RookieTEC9
prueba esto funcionó para mí - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Respuestas:

40

Puede usar el comando for:

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

Tipo

for /?

en el símbolo del sistema. Además, puede analizar archivos ini .

Johnstok
fuente
25
Este es un ejemplo bastante complejo, que analiza información muy específica de un archivo de texto con formato particular, 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 segundo y tercer token de cada línea al cuerpo de for, con tokens delimitados por comas y / o espacios.
Martin Prikryl
2
Su ejemplo es de la ayuda de cmd.exe. Debe agregar una pista para eso o copiar la descripción completa.
Th. Thielemann
70

En cmd.exe estilo NT, puede recorrer las líneas de un archivo de texto con

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

Escriba "ayuda para" en el símbolo del sistema para obtener más información. (no sé si eso funciona en cualquier "DOS" que esté usando)

devio
fuente
22
Debería serlo %%i.
Jim Fell
32
Este comando dejaría de leer una línea si encontrara un carácter de espacio en blanco. Finalmente terminé usando FOR / F "tokens = *" %% i IN (file.txt) DO @ECHO %% i
Jason
9
¡Funciona! y si está usando la consola, pruebe% i si está usando un archivo bat y luego pruebe %% i.
Steven Du
41

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

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

La lectura binaria directa parece, por tanto, casi imposible.

El problema de las líneas vacías se puede solucionar con un truco. Prefije cada línea con un número de línea, usando el comando findtr, 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 la expansión retardada habilitada y deshabilitada es necesario para el trabajo seguro con cadenas, como !o ^^^xy!z.
Eso es porque la línea set "var=%%a"solo es segura con DisabledDelayedExpansion ; de lo contrario, los signos de exclamación se eliminan y los signos de intercalación se usan como caracteres de escape (secundarios) y también se eliminan.
Pero usar la variable varsolo es seguro con EnabledDelayedExpansion , ya que incluso a call %%var%%fallará con contenido como "&"&.

EDITAR: Variante set / p agregada
Hay una segunda forma de leer un archivo con set /p, las únicas desventajas son que está limitado a ~ 1024 caracteres por línea y elimina los caracteres de control al final de la línea.
Pero la ventaja es que no necesita el cambio retrasado y es más fácil almacenar valores en 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 una representación hexadecimal,
podría mirar SO: convertir un archivo binario en una representación HEX usando un archivo por lotes

jeb
fuente
Gracias por el puntero sobre el uso de set /p. Solía set /p value=< result.txtobtener la primera línea de un archivo de texto
SteveC
Jeb, hice una pregunta relacionada basada en su solución anterior en stackoverflow.com/questions/11408295/…
Nicholas
¿Qué pasa con el carácter EOF (fin de archivo), ASCII 0x1A? ¿Se for /Fcomporta de la misma manera que con los caracteres NUL ( 0x00)?
aschipfl
@aschipfl Supongo que el 0x1A se comporta en algunos casos como un salto de línea (o mejor, se traduce en un salto de línea). ¿Hay alguna forma de crear un SUB sin usar un archivo temporal?
jeb
esta debería ser la respuesta aceptada, es infalible incluso si las líneas comienzan con :o ;o contienen!
HackingAddict1337
11

Una forma muy sencilla de hacerlo es utilizar el siguiente comando:

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

Esto solo mostrará la primera línea de texto en un archivo de texto. La otra forma de hacerlo es usar el siguiente comando:

type %pathtotextfile%\textfile.txt

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

J. Bond
fuente
1

Bueno, hay muchas formas diferentes, pero si solo desea MOSTRAR el texto y no GUARDARLO en ningún lugar, simplemente use: findstr /v "randomtextthatnoonewilluse" filename.txt

NetvorMcWolf
fuente
0

Código corregido:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause
Celes
fuente
Del código principal de la página. Las citas no están colocadas correctamente, el código no es adecuado para archivos con nombres con espacios. El mio es. Les doy aquí el truco del ^^^^
Celes
Tiene razón con las comillas alrededor del nombre del archivo, pero su código tiene algunos problemas: eol=y delims=son superfluos, set line=%%adeben usar comillas y sin alternar el modo de expansión retardada, el código no puede leer signos de exclamación
jeb
-5

Un código que muestra el contenido del archivo myfile.txt en la pantalla

set% filecontent% = 0
tipo% filename% >>% filecontent%
echo% filecontent%

Jani Pierwszy
fuente
3
por favor al menos intente el código antes de publicar. Eso es una tontería.
Stephan
¿Que esta pasando aqui? No tiene sentido
Gerhard hace