Come puoi leggere un file (testo o binario) da un file batch? C'è un modo per leggerlo in modalità binaria o in modalità testo?
TYPE [fileName]per MS-Dos.
Come puoi leggere un file (testo o binario) da un file batch? C'è un modo per leggerlo in modalità binaria o in modalità testo?
TYPE [fileName]per MS-Dos.
Risposte:
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 !
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.
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)
%%i.
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
set /p. Ho usato set /p value=< result.txtottieni la prima riga da un file di testo
0x1A? si for /Fcomporta allo stesso modo dei 0x00caratteri NUL ( )?
:o ;o contengono!
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!
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
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
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