Batch files: How to read a file?

FileBatch File

File Problem Overview


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?

File Solutions


Solution 1 - File

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)

Solution 2 - File

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

Solution 3 - File

You can use the for command:

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

Type

for /?

at the command prompt. Also, you can parse ini files!

Solution 4 - File

One very easy way to do it is use the following command:

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

This will only display the first line of text in a text file. The other way you can do it is use the following command:

type %pathtotextfile%\textfile.txt

This will put all the data in the text file on the screen. Hope this helps!

Solution 5 - File

Well theres a lot of different ways but if you only want to DISPLAY the text and not STORE it anywhere then you just use: findstr /v "randomtextthatnoonewilluse" filename.txt

Solution 6 - File

Corrected code :

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLucas Gabriel S&#225;nchezView Question on Stackoverflow
Solution 1 - FiledevioView Answer on Stackoverflow
Solution 2 - FilejebView Answer on Stackoverflow
Solution 3 - FilejohnstokView Answer on Stackoverflow
Solution 4 - FileJ. BondView Answer on Stackoverflow
Solution 5 - FileNetvorMcWolfView Answer on Stackoverflow
Solution 6 - FileCelesView Answer on Stackoverflow