How do I echo and send console output to a file in a bat script?

I have a batch script that executes a task and sends the output to a text file. Is there a way to have the output show on the console window as well? For Example:

c:\Windows>dir > windows-dir.txt 

Is there a way to have the output of dir display in the console window as well as put it into the text file?

39.3k 7 7 gold badges 87 87 silver badges 117 117 bronze badges asked Feb 2, 2009 at 16:38 JamesEggers JamesEggers 12.9k 14 14 gold badges 63 63 silver badges 89 89 bronze badges Here are explained the redirections you can make, and some examples.
Hope it helps :) Commented Sep 21, 2012 at 11:10 Possible Duplicate: Displaying Windows command prompt output and redirecting it to a file Commented Feb 12, 2013 at 5:14

Please note, @Vadzim, that a question asked on Feb 2 2009 at 16:38 cannot be deemed to be a duplicate of a question asked almost three months later on Apr 28 2009 at 06:32.

Commented Dec 10, 2017 at 12:41

12 Answers 12

No, you can't with pure redirection.
But with some tricks (like tee.bat) you can.

I try to explain the redirection a bit.

You redirect one of the ten streams with > file or < file
It is unimportant, if the redirection is before or after the command, so these two lines are nearly the same.

dir > file.txt > file.txt dir 

The redirection in this example is only a shortcut for 1>, this means the stream 1 (STDOUT) will be redirected.
So you can redirect any stream with prepending the number like 2> err.txt and it is also allowed to redirect multiple streams in one line.

dir 1> files.txt 2> err.txt 3> nothing.txt 

In this example the "standard output" will go into files.txt, all errors will be in err.txt and the stream3 will go into nothing.txt (DIR doesn't use the stream 3).
Stream0 is STDIN
Stream1 is STDOUT
Stream2 is STDERR
Stream3-9 are not used

But what happens if you try to redirect the same stream multiple times?

dir > files.txt > two.txt 

"There can be only one", and it is always the last one!
So it is equal to dir > two.txt

Ok, there is one extra possibility, redirecting a stream to another stream.

dir 1>files.txt 2>&1 

2>&1 redirects stream2 to stream1 and 1>files.txt redirects all to files.txt.
The order is important here!

dir . 1>nul 2>&1 dir . 2>&1 1>nul 

are different. The first one redirects all (STDOUT and STDERR) to NUL,
but the second line redirects the STDOUT to NUL and STDERR to the "empty" STDOUT.

As one conclusion, it is obvious why the examples of Otávio Décio and andynormancx can't work.

command > file >&1 dir > file.txt >&2 

Both try to redirect stream1 two times, but "There can be only one", and it's always the last one.
So you get

command 1>&1 dir 1>&2 

And in the first sample redirecting of stream1 to stream1 is not allowed (and not very useful).

44k 21 21 gold badges 148 148 silver badges 746 746 bronze badges answered Jan 3, 2011 at 20:34 81.2k 18 18 gold badges 175 175 silver badges 232 232 bronze badges So it is impossible with native windows shell Commented Mar 7, 2014 at 10:24

What about the second mechanism "handle duplication"? I experimented with 3<&2 (note the LT instead of GT), and then 3>errors.txt . But this ended badly - all subsequent stderr output was captured to errors.txt (that is - from other commands too!).

Commented Sep 13, 2016 at 23:36 You could use for /f "delims=" %%v in ('dir') do echo %%v>>file.txt though. Commented Nov 18, 2018 at 3:15

@CharlesMcKelvey (and all upvoters) would you have accepted an answer that only says "No"? Or would you have preferred some explanation?

Commented Jan 10, 2020 at 17:03

Just use the Windows version of the UNIX tee command (found from http://unxutils.sourceforge.net) in this way:

mycommand > tee outpu_file.txt 

If you also need the STDERR output, then use the following.
The 2>&1 combines the STDERR output into STDOUT (the primary stream).

mycommand 2>&1 | tee output_file.txt 
12.8k 6 6 gold badges 67 67 silver badges 91 91 bronze badges answered Oct 29, 2011 at 18:57 369 3 3 silver badges 2 2 bronze badges

The PowerShell Tee-Object offers similar functionality. Get-Process | Tee-Object -file c:\scripts\test.txt

Commented Dec 2, 2016 at 12:17

I tried this in both powershell and the regular shell. 1>tee a.txt will redirect stdout to a file named tee instead of calling the tee command. Can anyone confirm this answer works for them?

Commented Jan 11, 2019 at 14:07 @mafu I can confirm this. Commented Feb 10, 2020 at 13:32

@mafu The answer above is slightly incorect. You have to use the pipe "|" instead of the ">" in the top example. Weirdly, the order of the STDOUT and STDERR output was mixed up on the command line in that case. The bottom example works perfectly for me though.

Commented Feb 10, 2020 at 13:49

Also, the sourceforge download was broken for me. I found an alternative host here: wzw.tum.de/public-html/syring/win32/UnxUtilsDist.html (University of Munich)

Commented Feb 10, 2020 at 13:50

If you don't need the output in real time (i.e. as the program is writing it) you could add

type windows-dir.txt 

after that line.

answered Feb 2, 2009 at 16:42 10k 7 7 gold badges 41 41 silver badges 59 59 bronze badges

or on the same line (useful at the prompt): dir > windows-dir.txt & type windows-dir.txt . This also applies to blocks: ( echo %date% echo %username% echo %time% pause>CON )>test.txt & type test.txt . However, if the output is required in real time, you can use e.g. a windows port of the tee tool for that…

Commented Apr 6, 2011 at 21:36

The solution that worked for me was: dir > a.txt | type a.txt.

1 1 1 silver badge answered Jul 17, 2009 at 7:27 NSPKUWCExi2pr8wVoGNk NSPKUWCExi2pr8wVoGNk 2,499 2 2 gold badges 22 22 silver badges 27 27 bronze badges

This works with command with low output. With large output command it don't works because it shows only the first buffer. He it's asking for a real time output while saving the output to a log file.

Commented May 2, 2016 at 8:58 It would be problematic if you use >> instead of > Commented May 11, 2016 at 8:21

Yes, there is a way to show a single command output on the console (screen) and in a file. Using your example, use.

@ECHO OFF FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt 

The FOR command parses the output of a command or text into a variable, which can be referenced multiple times.

For a command, such as DIR /B , enclose in single quotes as shown in example below. Replace the DIR /B text with your desired command.

FOR /F "tokens=*" %%I IN ('DIR /B') DO ECHO %%I & ECHO %%I>>FILE.TXT 

For displaying text, enclose text in double quotes as shown in example below.

FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ECHO %%I & ECHO %%I>>FILE.TXT 

. And with line wrapping.

FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ( ECHO %%I & ECHO %%I>>FILE.TXT ) 

If you have times when you want the output only on console (screen), and other times sent only to file, and other times sent to both, specify the "DO" clause of the FOR loop using a variable, as shown below with %TOECHOWHERE% .

@ECHO OFF FOR %%I IN (TRUE FALSE) DO ( FOR %%J IN (TRUE FALSE) DO ( SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit) ) GOTO :Finish :Runit REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops REM above when the FOR loops are evaluating the first item in the list, REM "TRUE". So, the first value of TOSCREEN is "TRUE " (with a trailing REM space), the second value is "FALSE" (no trailing or leading space). REM Adding the ": =" text after "TOSCREEN" tells the command processor to REM remove all spaces from the value in the "TOSCREEN" variable. IF "%TOSCREEN: =%"=="TRUE" ( IF "%TOFILE: =%"=="TRUE" ( SET TEXT=On screen, and in "FILE.TXT" SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT" ) ELSE ( SET TEXT=On screen, not in "FILE.TXT" SET TOECHOWHERE="ECHO %%I" ) ) ELSE ( IF "%TOFILE: =%"=="TRUE" ( SET TEXT=Not on screen, but in "FILE.TXT" SET TOECHOWHERE="ECHO %%I>>FILE.txt" ) ELSE ( SET TEXT=Not on screen, nor in "FILE.TXT" SET TOECHOWHERE="ECHO %%I>NUL" ) ) FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1% GOTO :eof :Finish ECHO Finished [this text to console (screen) only]. PAUSE