Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Batch files: How to read a file?

How you can read a file (text or binary) from a batch file? There is a way to read it in a binary mode or text mode?

like image 272
Lucas Gabriel Sánchez Avatar asked Oct 15 '08 19:10

Lucas Gabriel Sánchez


People also ask

How do I read the contents of a batch file?

Using a BAT file in Windows is as simple as double-clicking or double-tapping it. You don't need to download any special program or tool. To use the first example from above, entering that text into a text file with a text editor and then saving the file with the .

How do I read a file in CMD?

Since CMD files store commands in plain text format, they can be opened and edited with a text editor, such as Notepad or Wordpad. You can also create your own CMD scripts with a text editor by adding one or more commands on separate lines and saving the file as a CMD file.


2 Answers

Under NT-style cmd.exe, you can loop through the lines of a text file with

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

Type "help for" on the command prompt for more information. (don't know if that works in whatever "DOS" you are using)

like image 186
devio Avatar answered Sep 20 '22 06:09

devio


The FOR-LOOP generally works, but there are some issues. The FOR doesn't accept empty lines and lines with more than ~8190 are problematic. The expansion works only reliable, if the delayed expansion is disabled.

Detection of CR/LF versus single LF seems also a little bit complicated.
Also NUL characters are problematic, as a FOR-Loop immediatly cancels the reading.

Direct binary reading seems therefore nearly impossible.

The problem with empty lines can be solved with a trick. Prefix each line with a line number, using the findstr command, and after reading, remove the prefix.

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

Toggling between enable and disabled delayed expansion is neccessary for the safe working with strings, like ! or ^^^xy!z.
That's because the line set "var=%%a" is only safe with DisabledDelayedExpansion, else exclamation marks are removed and the carets are used as (secondary) escape characters and they are removed too.
But using the variable var is only safe with EnabledDelayedExpansion, as even a call %%var%% will fail with content like "&"&.

EDIT: Added set/p variant
There is a second way of reading a file with set /p, the only disadvantages are that it is limited to ~1024 characters per line and it removes control characters at the line end.
But the advantage is, you didn't need the delayed toggling and it's easier to store values in 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!   ) ) 

For reading it "binary" into a hex-representation
You could look at SO: converting a binary file to HEX representation using batch file

like image 32
jeb Avatar answered Sep 18 '22 06:09

jeb