121

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?

4
  • @RookieTEC9: yes, I know that they are 2 completetly different things, but I needed an answer that worked in msdos, not windows nt (or newer versions), also this question was asked 7 years ago, have that in mind Commented Oct 26, 2015 at 18:42
  • @RookieTEC9: I think you're right, it's been a while since this. I'll just remove the ms-dos tag Commented Oct 26, 2015 at 18:48
  • 1
    You can use the command TYPE [fileName] for MS-Dos. Commented Nov 1, 2015 at 1:46
  • try this out it worked for me - stackoverflow.com/a/31919715/4534414 Commented Jul 26, 2018 at 13:48

7 Answers 7

88

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)

Sign up to request clarification or add additional context in comments.

2 Comments

This command would quit reading a line if it found a whitespace character. I eventually ended up using FOR /F "tokens=*" %%i IN (file.txt) DO @ECHO %%i
It works! and If you are using console try %i if you are using a bat file then try %%i .
46

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 "&"&.
In this example the line is output by echo(!line!, the use of echo( is necessary to be able to output empty lines, but also contents like /? or \..\windows\system32\calc.exe.

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

5 Comments

Thanks for the pointer on the use of set /p. I used set /p value=< result.txt get the first line from a text file
Jeb, I asked a related question based on your solution above in stackoverflow.com/questions/11408295/…
What about the EOF (end-of-file) character, ASCII 0x1A? does for /F behave the same way as with NUL (0x00) characters?
@aschipfl I suppose the 0x1A behaves in some cases like a linefeed (or better it is translated to a linefeed). Is there a way to create a SUB without using a temp file ?
this should be the accepted answer, it's foolproof even if the lines start with : or ; or contain !
40

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!

2 Comments

This is a pretty complex example, parsing very specific information from a particularly formatted text file, without giving any explanation. As per for /? the command would parse each line in myfile.txt, ignoring lines that begin with a semicolon, passing the 2nd and 3rd token from each line to the for body, with tokens delimited by commas and/or spaces.
Your example is from cmd.exe's help. You should add a hint for that or copy the whole description.
20

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!

1 Comment

Very big danger here: Limit on such a line is 1023 characters. So set /p reads ONLY first 1023 characters. Would be cool if you could add this to your answer.
2

settings.ini

name="John"
lastName="Doe"

script.bat

@echo off
for /f "tokens=1,2 delims==" %%a in (settings.ini) do (
    if %%a==name set %%a=%%b
    if %%a==lastName set %%a=%%b
)

echo %name% %lastName%

1 Comment

That's probably a solution, but not for the asked question
1

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

Comments

0

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

2 Comments

Of the main code of the page. Quotes are not positionned correctly, the code is not suited for files with name with spaces. Mine is. I give here the trick of the ^^^^
You're right with the quotes around the filename, but your code has some issues: eol= and delims= are superfluous, set line=%%a should use quotes and without toggling the delayed expansion mode, the code can't read exclamation marks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.