Stderr and stdout to file windows

I’m trying to redirect all output (stdout + stderr) of a Windows command to a single file:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

Is it possible, or should I just redirect to two separate files?

Mofi's user avatar

Mofi

46.3k17 gold badges81 silver badges145 bronze badges

asked Sep 14, 2009 at 11:20

ripper234's user avatar

ripper234ripper234

223k276 gold badges635 silver badges905 bronze badges

2

You want:

dir > a.txt 2>&1

The syntax 2>&1 will redirect 2 (stderr) to 1 (stdout). You can also hide messages by redirecting to NUL. More explanation and examples are on the Microsoft documentation page Redirecting error messages from Command Prompt: STDERR/STDOUT.

Mofi's user avatar

Mofi

46.3k17 gold badges81 silver badges145 bronze badges

answered Sep 14, 2009 at 11:23

Anders Lindahl's user avatar

Anders LindahlAnders Lindahl

41.7k9 gold badges90 silver badges93 bronze badges

7

Anders Lindahl’s answer is correct, but it should be noted that if you are redirecting stdout to a file and want to redirect stderr as well then you MUST ensure that 2>&1 is specified AFTER the 1> redirect, otherwise it will not work.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

S.S. Anne's user avatar

S.S. Anne

15.2k8 gold badges38 silver badges76 bronze badges

answered May 23, 2013 at 11:59

DelboyJay's user avatar

13

Background info from Microsoft documentation

While the accepted answer to this question is correct, it really doesn’t do much to explain why it works, and since the syntax is not immediately clear I did a quick www search to find out what was actually going on. In the hopes that this information is helpful to others, I’m posting it here.

Taken from the Microsoft documentation page:
Redirecting error messages from Command Prompt: STDERR/STDOUT

Summary

When redirecting output from an application using the > symbol, error messages still print to the screen. This is because error messages are often sent to the Standard Error stream instead of the Standard Out stream.

Output from a console (Command Prompt) application or command is often sent to two separate streams. The regular output is sent to Standard Out (STDOUT) and the error messages are sent to Standard Error (STDERR). When you redirect console output using the > symbol, you are only redirecting STDOUT. In order to redirect STDERR, you have to specify 2> for the redirection symbol. This selects the second output stream that is STDERR.

Example

The command dir file.xxx (where file.xxx does not exist) will display the following output:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876
File Not Found

If you redirect the output to the NUL device using dir file.xxx > nul, you will still see the error message:

File Not Found

To redirect the error message to NUL, use the following command:

dir file.xxx 2> nul

Or, you can redirect the output to one place, and the errors to another.

dir file.xxx > output.msg 2> output.err

You can print the errors and standard output to a single file by using the &1 command to redirect the output for STDERR to STDOUT and then sending the output from STDOUT to a file:

dir file.xxx 1> output.msg 2>&1

bzeaman's user avatar

bzeaman

1,12811 silver badges28 bronze badges

answered Oct 18, 2013 at 18:57

StormeHawke's user avatar

StormeHawkeStormeHawke

5,9875 gold badges45 silver badges74 bronze badges

To add the stdout and stderr to the general logfile of a script:

dir >> a.txt 2>&1

answered Jul 24, 2013 at 10:16

Henk Wiersema's user avatar

1

Correct, file handle 1 for the process is STDOUT, redirected by the 1> or by > (1 can be omitted, by convention, the command interpreter [cmd.exe] knows to handle that).
File handle 2 is STDERR, redirected by 2>.

Note that if you’re using these to make log files, then unless you’re sending the outut to _uniquely_named_ (eg date-and-time-stamped) log files, then if you run the same process twice, the redirected will overwrite (replace) the previous log file.

The >> (for either STDOUT or STDERR) will APPEND not REPLACE the file. So you get a cumulative logfile, showwing the results from all runs of the process — typically more useful.

Happy trails…

falsetru's user avatar

falsetru

358k63 gold badges735 silver badges638 bronze badges

answered Feb 6, 2014 at 4:28

Max Vitesse's user avatar

There is, however, no guarantee that the output of SDTOUT and STDERR are interweaved line-by-line in timely order, using the POSIX redirect merge syntax.

If an application uses buffered output, it may happen that the text of one stream is inserted in the other at a buffer boundary, which may appear in the middle of a text line.

A dedicated console output logger (I.e. the "StdOut/StdErr Logger" by 'LoRd MuldeR') may be more reliable for such a task.

See: MuldeR’s OpenSource Projects

answered Feb 27, 2018 at 13:30

LigH's user avatar

LigHLigH

511 silver badge4 bronze badges

In a batch file (Windows 7 and above) I found this method most reliable

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Obviously, use whatever commands you want and the output will be directed to the text file.
Using this method is reliable HOWEVER there is NO output on the screen.

answered Sep 12, 2019 at 20:12

PanamaPHat's user avatar

1

I’m trying to redirect all output (stdout + stderr) of a Windows command to a single file:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

Is it possible, or should I just redirect to two separate files?

Mofi's user avatar

Mofi

46.3k17 gold badges81 silver badges145 bronze badges

asked Sep 14, 2009 at 11:20

ripper234's user avatar

ripper234ripper234

223k276 gold badges635 silver badges905 bronze badges

2

You want:

dir > a.txt 2>&1

The syntax 2>&1 will redirect 2 (stderr) to 1 (stdout). You can also hide messages by redirecting to NUL. More explanation and examples are on the Microsoft documentation page Redirecting error messages from Command Prompt: STDERR/STDOUT.

Mofi's user avatar

Mofi

46.3k17 gold badges81 silver badges145 bronze badges

answered Sep 14, 2009 at 11:23

Anders Lindahl's user avatar

Anders LindahlAnders Lindahl

41.7k9 gold badges90 silver badges93 bronze badges

7

Anders Lindahl’s answer is correct, but it should be noted that if you are redirecting stdout to a file and want to redirect stderr as well then you MUST ensure that 2>&1 is specified AFTER the 1> redirect, otherwise it will not work.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

S.S. Anne's user avatar

S.S. Anne

15.2k8 gold badges38 silver badges76 bronze badges

answered May 23, 2013 at 11:59

DelboyJay's user avatar

13

Background info from Microsoft documentation

While the accepted answer to this question is correct, it really doesn’t do much to explain why it works, and since the syntax is not immediately clear I did a quick www search to find out what was actually going on. In the hopes that this information is helpful to others, I’m posting it here.

Taken from the Microsoft documentation page:
Redirecting error messages from Command Prompt: STDERR/STDOUT

Summary

When redirecting output from an application using the > symbol, error messages still print to the screen. This is because error messages are often sent to the Standard Error stream instead of the Standard Out stream.

Output from a console (Command Prompt) application or command is often sent to two separate streams. The regular output is sent to Standard Out (STDOUT) and the error messages are sent to Standard Error (STDERR). When you redirect console output using the > symbol, you are only redirecting STDOUT. In order to redirect STDERR, you have to specify 2> for the redirection symbol. This selects the second output stream that is STDERR.

Example

The command dir file.xxx (where file.xxx does not exist) will display the following output:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876
File Not Found

If you redirect the output to the NUL device using dir file.xxx > nul, you will still see the error message:

File Not Found

To redirect the error message to NUL, use the following command:

dir file.xxx 2> nul

Or, you can redirect the output to one place, and the errors to another.

dir file.xxx > output.msg 2> output.err

You can print the errors and standard output to a single file by using the &1 command to redirect the output for STDERR to STDOUT and then sending the output from STDOUT to a file:

dir file.xxx 1> output.msg 2>&1

bzeaman's user avatar

bzeaman

1,12811 silver badges28 bronze badges

answered Oct 18, 2013 at 18:57

StormeHawke's user avatar

StormeHawkeStormeHawke

5,9875 gold badges45 silver badges74 bronze badges

To add the stdout and stderr to the general logfile of a script:

dir >> a.txt 2>&1

answered Jul 24, 2013 at 10:16

Henk Wiersema's user avatar

1

Correct, file handle 1 for the process is STDOUT, redirected by the 1> or by > (1 can be omitted, by convention, the command interpreter [cmd.exe] knows to handle that).
File handle 2 is STDERR, redirected by 2>.

Note that if you’re using these to make log files, then unless you’re sending the outut to _uniquely_named_ (eg date-and-time-stamped) log files, then if you run the same process twice, the redirected will overwrite (replace) the previous log file.

The >> (for either STDOUT or STDERR) will APPEND not REPLACE the file. So you get a cumulative logfile, showwing the results from all runs of the process — typically more useful.

Happy trails…

falsetru's user avatar

falsetru

358k63 gold badges735 silver badges638 bronze badges

answered Feb 6, 2014 at 4:28

Max Vitesse's user avatar

There is, however, no guarantee that the output of SDTOUT and STDERR are interweaved line-by-line in timely order, using the POSIX redirect merge syntax.

If an application uses buffered output, it may happen that the text of one stream is inserted in the other at a buffer boundary, which may appear in the middle of a text line.

A dedicated console output logger (I.e. the "StdOut/StdErr Logger" by 'LoRd MuldeR') may be more reliable for such a task.

See: MuldeR’s OpenSource Projects

answered Feb 27, 2018 at 13:30

LigH's user avatar

LigHLigH

511 silver badge4 bronze badges

In a batch file (Windows 7 and above) I found this method most reliable

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Obviously, use whatever commands you want and the output will be directed to the text file.
Using this method is reliable HOWEVER there is NO output on the screen.

answered Sep 12, 2019 at 20:12

PanamaPHat's user avatar

1

С помощью переназначения устройств ввода/вывода одна программа может направить свой вывод на вход другой или перехватить вывод другой программы, используя его в качестве своих входных данных. Таким образом, имеется возможность передавать информацию от процесса к процессу при минимальных программных издержках.

Есть 3 файловых дескриптора: stdin — стандартный ввод, stdout — стандартный вывод и stderr — стандартный поток ошибок. В скриптах 1 означает stdout, а 2 — stderr.

Практически это означает, что для программ, которые используют стандартные входные и выходные устройства, операционная система позволяет:

  • перенаправлять stdout в файл
  • перенаправлять stderr в файл
  • перенаправлять stdout в stderr
  • перенаправлять stderr в stdout
  • перенаправлять stderr и stdout в файл
  • перенаправлять stderr и stdout в stdout
  • перенаправлять stderr и stdout в stderr
  • перенаправление stderr и stdout по конвейеру

Все вышесказанное является привычной обыденностью для любого пользователя любой nix системы, но в среде Windows, данные возможности применяются крайне редко, хотя на самом деле они там есть и всё практически идентично.

А теперь примеры:

1. Перенаправление стандартного потока программы в файл с заменой содержимого файла

ping ya.ru -t > log.txt
ping ya.ru -t 1> log.txt

при этом на экран ничего кроме ошибок не выводится, а все записывается в лог. Если остановить пинг, и запустить заново, предыдущий лог полностью затирается новым.

2. Перенаправление стандартного потока программы в файл с до записью содержимого лога

ping ya.ru -t >> log.txt

Тоже самое, но при прерывание пинга и начале нового, старое содержимое лога не затрется, а новое дописывается в конец

ping ya.ru -t 1>> log.txt

3. Перенаправление потока ошибок программы в фаил с заменой содержимого

ping ya.ru -t 2> log.txt

при этом, стандартный поток программы пойдет на экран, а ошибки будут записаны в лог, с заменой содержимого.

4. То же самое, но с до записью содержимого лога.

ping ya.ru -t 2>> log.txt

5. Следующая конструкция позволяет перенаправить информацию между потоками (между стандартным потоком и потоком ошибок, или наоборот).

ping ya.ru > log.txt 2>&1

или с до записью лога

ping ya.ru >> log.txt 2>&1

В данном примере стандартный поток ошибок пересылается в стандартный поток (конструкция 2>&1) а потом стандартный поток (уже с завернутым в него потоком ошибок) посылается в лог.

6. В этом примере все наоборот, стандартный поток, пересылается в поток ошибок и уже поток ошибок перенаправляется в лог:

ping ya.ru > log.txt 1>&2

или с до записью лога

ping ya.ru >> log.txt 1>&2

7. По аналогии с Linux системами в Windows можно перенаправить весь или часть вывода программы в виртуальное устройство, а проще говоря слить в мусор.

Таким устройством является nul, и делать перенаправление в него можно используя все выше представленные комбинации. Например

ping ya.ru > nul

В Linux есть еще одна конструкция перенаправления, а именно &>/var/log/log.txt, она перенаправляет ВСЕ без исключения потоки программы в указанное место, по сути являясь более коротким и более грамотным аналогом конструкции >log.txt 1>&2. Но к сожалению в Windows это не работает.

А теперь давайте немного разберемся в прикладных различиях между работой данных методов. В нормальных приложениях все разбито на потоки, но у большинства виндовых утилит это не так, пинг например, пишет все в стандартный поток (на экран), поэтому для него конструкция вида 2> не имеет смысла. Но есть еще не виндовые утилиты, для примера возьмем curl (мой любимый).

Он разделяет 3 вида вывода, вывод полезной информации, вывод служебной информации и вывод ошибок. Если перенаправить вывод так: > или >> или 1> или 1>> то по завершению запроса отобразится служебная информация о запросе, а вся полезная информация уйдет в лог (это именно то, что уходит по конвейеру |).

А теперь сделаем заведомо ошибочный запрос, изменив протокол http на http3 не меняя вывода в лог. В итоге мы получим ошибку на экране.

Изменим вывод в лог на один из этих: 2> или 2>> ошибка ранее выводившаяся на экран, попала в лог, и на экране ничего не будет (служебной информации нет, так как запрос произведен не был).

Вернемся к первому скриншоту на котором мы видим вывод служебной информации, по сути, не будь у курла ключа -s который подавляет вывод служебной информации, нам пришлось бы пользоваться конструкциями из пятого и шестого примеров.

И вывод был бы таким:

То есть, полная тишина, вся информация, как то полезный вывод, ошибки программы, служебная информация, все ушло в лог.

На данном скриншоте, конструкцией 2>&1 мы завернули поток ошибок в стандартный поток, а конструкцией > 5555.txt стандартный поток перенаправили в лог. Если вместо > 5555.txt использовать 2> 5555.txt, то есть перенаправить в лог стандартный поток ошибок, мы увидим весь вывод программы (и ошибки, и служебную информацию и полезный вывод) на экране. Конструкция 2>&1 имеет больший приоритет, а по ней уже все завернуто в стандартный поток.

Делать пример с заворотом стандартного потока в поток ошибок (1>&2) я не буду, ибо там все точно так же.

Надеюсь логика понятна…

Так же с помощью символа < можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла. Для примера возьмем реальный и вполне полезный случай. Например, у нас есть файл log.txt и нам надо посчитать сколько в нем строк. Сделать это можно с помощью такой конструкции

find /c /v "" log.txt

но вывод будет не совсем приемлемым.

А вот если сделать так:

find /c /v "" < log.txt

то все будет именно так как надо.

Это происходит потому что в первом случае, файл обрабатывается как файл, а во втором, как поток (аналог линуксового конвейера cat log.txt |) в общем, < это виндовый аналог cat со всеми вытекающими.

Источник

Каталог оборудования

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Производители

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Функциональные группы

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

0 Comments

2 Minutes read

How do I redirect stdout and stderr to a file in Windows?

When you redirect console output using the “>” symbol, you are only redirecting STDOUT. In order to redirect STDERR you have to specify ‘2>’ for the redirection symbol. This selects the second output stream which is STDERR.

How do I redirect stdout?

The regular output is sent to Standard Out (STDOUT) and the error messages are sent to Standard Error (STDERR). When you redirect console output using the > symbol, you are only redirecting STDOUT. In order to redirect STDERR, you have to specify 2> for the redirection symbol.

Which of the following commands redirects its standard output to the file stdout and redirects its standard error to the file stderr?

Conclusion

Operator Description
command>filename Redirect stdout to file “filename.”
command>>filename Redirect and append stdout to file “filename.”
command 2>filename Redirect stderr to file “filename.”
command 2>>filename Redirect and append stderr to file “filename.”

How do I add stdout to a file?

1 Answer

  1. Either use this construct: cmd >>file. txt 2>&1 where >> file appends the output to the file and 2>&1 redirects the stderr to stdout .
  2. Or use cmd &>>file ensuring that you have bash version >4 (using bash –version ) and #!/bin/bash at the beginning of file ( #!/bin/sh won’t work).

How do I redirect output to a file?

List:

  1. command > output.txt. The standard output stream will be redirected to the file only, it will not be visible in the terminal.
  2. command >> output.txt.
  3. command 2> output.txt.
  4. command 2>> output.txt.
  5. command &> output.txt.
  6. command &>> output.txt.
  7. command | tee output.txt.
  8. command | tee -a output.txt.

How do I redirect a file in Windows?

Open User Configuration > Policies > Windows Settings > Folder Redirection. Right-click Documents and click Properties. Choose Basic – Redirect everyone’s folder to the same location. Under Target folder location choose Create a folder for each user under the root path.

How would you redirect output from stdout to a file?

2 Answers

  1. Redirect stdout to one file and stderr to another file: command > out 2>error.
  2. Redirect stdout to a file ( >out ), and then redirect stderr to stdout ( 2>&1 ): command >out 2>&1.

The ‘>’ operator is used to redirect the output to a new file, the ‘>>’ is used to redirect the output and append to the file.
Now both the STDOUT and STDERR are written to the console by default. Output from a console (Command Prompt) application or command is often sent to two separate streams. The regular output is sent to Standard Out (STDOUT) and the error messages are sent to Standard Error (STDERR). When you redirect console output using the “>” symbol, you are only redirecting STDOUT. In order to redirect STDERR you have to specify “2>” for the redirection symbol. This selects the second output stream which is STDERR.

For Example, running the dir command on a file gives both stdout and stderr like below:

1
2
3
4
5
6
7
C:\ dir nosuchfile.txt
 Volume in drive C has no label.
 Volume Serial Number is B8A1-5FD1
 
 Directory of C:\
 
File Not Found

Here the “File Not Found” message is the STDERR and the rest was for STDOUT. Now if you want to redirect the whole output to a file, just running the command dir nosuchfile.txt > result.log will not cut it. You need to do one of the following:

Sending the STDERR and STDOUT to different files:

1
dir nosuchfile.txt > out.log 2>error.log

Sending the STDERR and STDOUT to Same file:

1
dir nosuchfile.txt > alloutput.log 2>&1

Here the 2>&1 instructs that the STDERR to be redirected to STDOUT which is in-turn writing out to alloutput.log file.

“Know thy commands.”
-Rushi

  • Steam не запускается игра на windows 10
  • Status 0xc0000428 при загрузке windows
  • Steam игры для windows 7
  • Status wait 3 0x80070003 при восстановлении windows 10
  • Status 0xc0000225 при установке windows