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
46.3k17 gold badges81 silver badges145 bronze badges
asked Sep 14, 2009 at 11:20
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
46.3k17 gold badges81 silver badges145 bronze badges
answered Sep 14, 2009 at 11:23
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
15.2k8 gold badges38 silver badges76 bronze badges
answered May 23, 2013 at 11:59
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 specify2>
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 FoundIf 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
1,12811 silver badges28 bronze badges
answered Oct 18, 2013 at 18:57
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
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
358k63 gold badges735 silver badges638 bronze badges
answered Feb 6, 2014 at 4:28
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
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
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
46.3k17 gold badges81 silver badges145 bronze badges
asked Sep 14, 2009 at 11:20
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
46.3k17 gold badges81 silver badges145 bronze badges
answered Sep 14, 2009 at 11:23
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
15.2k8 gold badges38 silver badges76 bronze badges
answered May 23, 2013 at 11:59
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 specify2>
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 FoundIf 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
1,12811 silver badges28 bronze badges
answered Oct 18, 2013 at 18:57
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
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
358k63 gold badges735 silver badges638 bronze badges
answered Feb 6, 2014 at 4:28
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
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
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
- 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 .
- 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:
- command > output.txt. The standard output stream will be redirected to the file only, it will not be visible in the terminal.
- command >> output.txt.
- command 2> output.txt.
- command 2>> output.txt.
- command &> output.txt.
- command &>> output.txt.
- command | tee output.txt.
- 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
- Redirect stdout to one file and stderr to another file: command > out 2>error.
- 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