File batch: come leggere un file?


97

Come puoi leggere un file (testo o binario) da un file batch? C'è un modo per leggerlo in modalità binaria o in modalità testo?


@ RookieTEC9: sì, so che sono 2 cose completamente diverse, ma avevo bisogno di una risposta che funzionasse in msdos, non in Windows NT (o versioni più recenti), anche questa domanda è stata posta 7 anni fa, tienilo a mente
Lucas Gabriel Sánchez

@ RookieTEC9: Penso che tu abbia ragione, è passato un po 'di tempo da allora. Rimuoverò semplicemente il tag ms-dos
Lucas Gabriel Sánchez

1
È possibile utilizzare il comando TYPE [fileName]per MS-Dos.
RookieTEC9

provare questo ha funzionato per me - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Risposte:


40

Puoi usare il comando for:

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

genere

for /?

al prompt dei comandi. Inoltre, puoi analizzare i file ini !


25
Questo è un esempio piuttosto complesso, che analizza informazioni molto specifiche da un file di testo particolarmente formattato, senza fornire alcuna spiegazione. Secondo for /?il comando analizzerebbe ogni riga in miofile.txt, ignorando le righe che iniziano con un punto e virgola, passando il 2 ° e il 3 ° token da ogni riga al corpo for, con i token delimitati da virgole e / o spazi.
Martin Prikryl

2
Il tuo esempio è tratto dalla guida di cmd.exe. Dovresti aggiungere un suggerimento per questo o copiare l'intera descrizione.
Th. Thielemann

70

In cmd.exe in stile NT, puoi scorrere le righe di un file di testo con

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

Digitare "aiuto per" nel prompt dei comandi per ulteriori informazioni. (non so se funziona in qualunque "DOS" stai usando)


22
Dovrebbe essere %%i.
Jim Fell

32
Questo comando interrompe la lettura di una riga se trova uno spazio vuoto. Alla fine ho finito per usare i token FOR / F "= *" %% i IN (file.txt) DO @ECHO %% i
Jason

9
Funziona! e se stai usando la console prova% i se stai usando un file bat quindi prova %% i.
Steven Du

41

Il FOR-LOOP generalmente funziona, ma ci sono alcuni problemi. Il FOR non accetta righe vuote e le righe con più di ~ 8190 sono problematiche. L'espansione funziona in modo affidabile solo se l'espansione ritardata è disabilitata.

Anche il rilevamento di CR / LF rispetto a un singolo LF sembra un po 'complicato.
Anche i caratteri NUL sono problematici, poiché un FOR-Loop annulla immediatamente la lettura.

La lettura binaria diretta sembra quindi quasi impossibile.

Il problema con le righe vuote può essere risolto con un trucco. Aggiungere un prefisso a ciascuna riga con un numero di riga, utilizzando il comando findstr e, dopo aver letto, rimuovere il prefisso.

@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
)

La commutazione tra espansione ritardata abilitata e disabilitata è necessaria per lavorare in sicurezza con stringhe, come !o ^^^xy!z.
Questo perché la riga set "var=%%a"è sicura solo con DisabledDelayedExpansion , altrimenti i punti esclamativi vengono rimossi e gli accenti circolari vengono utilizzati come caratteri di escape (secondari) e vengono rimossi anche loro.
Ma l'utilizzo della variabile varè sicuro solo con EnabledDelayedExpansion , poiché anche un call %%var%%fallirà con contenuti come "&"&.

EDIT: Aggiunta la variante set / p
C'è un secondo modo di leggere un file con set /p, gli unici svantaggi sono che è limitato a ~ 1024 caratteri per riga e rimuove i caratteri di controllo alla fine della riga.
Ma il vantaggio è che non hai bisogno della commutazione ritardata ed è più facile memorizzare i valori nelle variabili

@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!
  )
)

Per leggerlo "binario" in una rappresentazione esadecimale
Potresti guardare SO: convertire un file binario in rappresentazione HEX usando un file batch


Grazie per il puntatore sull'uso di set /p. Ho usato set /p value=< result.txtottieni la prima riga da un file di testo
SteveC

Jeb, ho posto una domanda correlata basata sulla tua soluzione sopra in stackoverflow.com/questions/11408295/…
Nicholas

E il carattere EOF (end-of-file), ASCII 0x1A? si for /Fcomporta allo stesso modo dei 0x00caratteri NUL ( )?
aschipfl

@aschipfl Suppongo che lo 0x1A si comporti in alcuni casi come un linefeed (o meglio è tradotto in un linefeed). C'è un modo per creare un SUB senza utilizzare un file temporaneo?
jeb

questa dovrebbe essere la risposta accettata, è infallibile anche se le righe iniziano con :o ;o contengono!
HackingAddict1337

11

Un modo molto semplice per farlo è utilizzare il seguente comando:

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

Ciò visualizzerà solo la prima riga di testo in un file di testo. L'altro modo per farlo è usare il seguente comando:

type %pathtotextfile%\textfile.txt

Questo metterà tutti i dati nel file di testo sullo schermo. Spero che questo ti aiuti!


1

Bene, ci sono molti modi diversi, ma se vuoi solo VISUALIZZARE il testo e non MEMORIZZARLO ovunque, allora devi solo usare: findstr /v "randomtextthatnoonewilluse" filename.txt


0

Codice corretto:

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

Del codice principale della pagina. Le virgolette non sono posizionate correttamente, il codice non è adatto per file con nome con spazi. Il mio è. Vi do qui il trucco del ^^^^
Celes

Hai ragione con le virgolette intorno al nome del file, ma il tuo codice ha alcuni problemi: eol=e delims=sono superflui, set line=%%adovrebbero usare le virgolette e senza attivare la modalità di espansione ritardata, il codice non può leggere i punti esclamativi
jeb

-5

Un codice che visualizza il contenuto del file myfile.txt sullo schermo

set% filecontent% = 0
type% filecontent% >>% filecontent%
echo% filecontent%


3
per favore prova almeno il codice prima di postare. Sono solo sciocchezze.
Stephan

Che cosa sta succedendo qui? Non ha senso
Gerhard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.