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
Перенаправление ввода-вывода в cmd
Перенаправление стандартных ввода-вывода и ошибок
С помощью переназначения устройств ввода/вывода одна программа может направить свой вывод на вход другой или перехватить вывод другой программы, используя его в качестве своих входных данных. Таким образом, имеется возможность передавать информацию от процесса к процессу при минимальных программных издержках. Практически это означает, что для программ, которые используют стандартные входные и выходные устройства, операционная система позволяет:
- выводить сообщения программ не на экран (стандартный выходной поток), а в файл или на принтер (перенаправление вывода);
- читать входные данные не с клавиатуры (стандартный входной поток), а из заранее подготовленного файла (перенаправление ввода);
- передавать сообщения, выводимые одной программой, в качестве входных данных для другой программы (конвейеризация или композиция команд).
Из командной строки эти возможности реализуются следующим образом. Для того, чтобы перенаправить текстовые сообщения, выводимые какой-либо командой из командной строки, в текстовый файл, нужно использовать конструкцию команда > имя_файла. Если при этом заданный для вывода файл уже существовал, то он перезаписывается (старое содержимое теряется), если не существовал создается. Можно также не создавать файл заново, а дописывать информацию, выводимую командой, в конец существующего файла. Для этого команда перенаправления вывода должна быть задана так: команда >> имя_файла. С помощью символа < можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла
Примеры перенаправления ввода/вывода в командной строке
Приведем несколько примеров перенаправления ввода/вывода.
1. Вывод результатов команды ping в файл ping ya.ru > ping.txt
2. Добавление текста справки для команды XCOPY в файл copy.txt: XCOPY /? >> copy.txt
В случае необходимости сообщения об ошибках (стандартный поток ошибок) можно перенаправить в текстовый файл с помощью конструкции команда 2> имя_файла В этом случае стандартный вывод будет производиться на экран. Также имеется возможность информационные сообщения и сообщения об ошибках выводить в один и тот же файл. Делается это следующим образом: команда > имя_файла 2>&1
Например, в приведенной ниже команде стандартный выходной поток и стандартный поток ошибок перенаправляются в файл copy.txt: XCOPY A:1.txt C: > copy.txt 2>&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.
Для задания перенаправления в существующие дескрипторы используется амперсанд (&), затем номер требуемого дескриптора (например, &номер_дескриптора). Например, для перенаправления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите:
При дублировании дескриптора происходит копирование всех его исходных характеристик. Например, если дескриптор доступен только для записи, то все его дубликаты будут доступны только для записи. Нельзя продублировать дескриптор с доступом только для чтения в дескриптор с доступом только для записи.
Перенаправление ввода команд ( )
Выходные данные практически всех команд высвечиваются в окне командной строки. Даже команды, выводящие данные на диск или принтер, выдают сообщения и запросы в окне командной строки.
Для перенаправления вывода команд из окна командной строки в файл или на устройство применяется оператор «>». Этот оператор используется с большинством команд. Например, для перенаправления вывода команды dir в файл Dirlist.txt введите:
Если файл Dirlist.txt не существует, интерпретатор команд Cmd.exe создаст его. Если файл существует, Cmd.exe заменит информацию в файле на данные, полученные от команды dir.
Для запуска команды netsh routing dump и последующей отправки результатов ее работы в Route.cfg введите:
Оператор «>» открывает заданный файл с доступом только для записи. Поэтому с помощью данного оператора файл прочитать нельзя. Например, при запуске программы с оператором перенаправления ».
Использование оператора « search.txt 2 &» для перенаправления ввода и дублирования
При перенаправлении вывода в файл и задании существующего имени файла интерпретатор команд Cmd.exe открывает файл с доступом только для записи и переписывает его содержимое. Если дескриптор задан, интерпретатор команд Cmd.exe дублирует файл в существующий дескриптор.
Для дублирования определенного пользователем дескриптора 3 в дескриптор 1 введите:
Для перенаправления всех выходных данных, включая выходные данные дескриптора 2 (STDERR), команды ipconfig в дескриптор 1 (STDOUT) и последующего перенаправления выходных данных в Output.log введите:
Использование оператора «>>» для добавления вывода
Для добавления выходных данных команды в конец файла без потери хранящейся в нем информации используется двойной символ «больше» (>>). Например, следующая команда добавляет список каталогов, созданный командой dir, в файл Dirlist.txt:
Для добавления выходных данных команды netstat в конец файла Tcpinfo.txt введите:
Иногда удобнее записывать это следующим образом:
n0.html» > %OutFile% ECHO ^ >> %OutFile% ECHO ^ >> %OutFile% ECHO ^ best page^ >> %OutFile% ECHO ^ >> %OutFile% ECHO ^ >> %OutFile% ECHO Hello World >> %OutFile% ECHO ^ >> %OutFile% ECHO ^
Использование оператора канала (|)
Оператор канала «вертикальная линия» (|) забирает выходные данные одной команды (по умолчанию STDOUT) и направляет их на вход другой команды (по умолчанию STDIN). Например, следующая команда сортирует каталог:
В данном примере обе команды запускаются одновременно, но команда sort приостанавливает работу до получения выходных данных команды dir. Команда sort использует выходные данные команды dir в качестве своих входных данных, а затем свои выходные данные отправляет в дескриптор 1 (STDOUT).
Комбинирование команд с операторами перенаправления
Комбинируя команды-фильтры с другими командами и именами файлов, можно создавать команды на заказ. Например, для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:
Выход команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле Loglist.txt в виде списка (например, NetshConfig.log, Logdat.svd и Mylog.bat).
При использовании более одного фильтра в одной команде их необходимо отделять с помощью канала (|). Например, следующая команда ищет в каждом каталоге диска C файлы, в названии которых присутствует строка «Log», и выводит их постранично на экран:
Наличие канала (|) указывает cmd.exe, что выход команды DIR нужно отправить команде-фильтру find. Команда find выбирает только те имена файлов, в которых содержится строка «LOG». Команда more выводит на экран имена файлов, полученные командой find с паузой после заполнения каждого экрана. Дополнительные сведения о командах-фильтрах смотри в разделе Использование фильтров.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Источник
Стандартные потоки вывода (stdout) Windows
С помощью переназначения устройств ввода/вывода одна программа может направить свой вывод на вход другой или перехватить вывод другой программы, используя его в качестве своих входных данных. Таким образом, имеется возможность передавать информацию от процесса к процессу при минимальных программных издержках.
Практически это означает, что для программ, которые используют стандартные входные и выходные устройства, операционная система позволяет:
Все вышесказанное является привычной обыденностью для любого пользователя любой nix системы, но в среде Windows, данные возможности применяются крайне редко, хотя на самом деле они там есть и всё практически идентично.
1. Перенаправление стандартного потока программы в файл с заменой содержимого файла
при этом на экран ничего кроме ошибок не выводится, а все записывается в лог. Если остановить пинг, и запустить заново, предыдущий лог полностью затирается новым.
2. Перенаправление стандартного потока программы в файл с до записью содержимого лога
Тоже самое, но при прерывание пинга и начале нового, старое содержимое лога не затрется, а новое дописывается в конец
3. Перенаправление потока ошибок программы в фаил с заменой содержимого
при этом, стандартный поток программы пойдет на экран, а ошибки будут записаны в лог, с заменой содержимого.
4. То же самое, но с до записью содержимого лога.
5. Следующая конструкция позволяет перенаправить информацию между потоками (между стандартным потоком и потоком ошибок, или наоборот).
или с до записью лога
В данном примере стандартный поток ошибок пересылается в стандартный поток (конструкция 2>&1 ) а потом стандартный поток (уже с завернутым в него потоком ошибок) посылается в лог.
6. В этом примере все наоборот, стандартный поток, пересылается в поток ошибок и уже поток ошибок перенаправляется в лог:
или с до записью лога
7. По аналогии с Linux системами в Windows можно перенаправить весь или часть вывода программы в виртуальное устройство, а проще говоря слить в мусор.
Таким устройством является nul, и делать перенаправление в него можно используя все выше представленные комбинации. Например
А теперь давайте немного разберемся в прикладных различиях между работой данных методов. В нормальных приложениях все разбито на потоки, но у большинства виндовых утилит это не так, пинг например, пишет все в стандартный поток (на экран), поэтому для него конструкция вида 2> не имеет смысла. Но есть еще не виндовые утилиты, для примера возьмем curl (мой любимый).
Он разделяет 3 вида вывода, вывод полезной информации, вывод служебной информации и вывод ошибок. Если перенаправить вывод так: > или >> или 1> или 1>> то по завершению запроса отобразится служебная информация о запросе, а вся полезная информация уйдет в лог (это именно то, что уходит по конвейеру | ).
А теперь сделаем заведомо ошибочный запрос, изменив протокол http на http3 не меняя вывода в лог. В итоге мы получим ошибку на экране.
Изменим вывод в лог на один из этих: 2> или 2>> ошибка ранее выводившаяся на экран, попала в лог, и на экране ничего не будет (служебной информации нет, так как запрос произведен не был).
И вывод был бы таким:
То есть, полная тишина, вся информация, как то полезный вывод, ошибки программы, служебная информация, все ушло в лог.
Делать пример с заворотом стандартного потока в поток ошибок ( 1>&2 ) я не буду, ибо там все точно так же.
Источник
Как перенаправить вывод команды в файл
Вместо этого вся информация, отображаемая в командной строке после выполнения команды, может быть сохранена в файл, который вы можете открыть в Windows для последующего использования или манипулирования им по своему усмотрению.
Как использовать операторы перенаправления
Самый простой способ научиться использовать эти операторы перенаправления — это посмотреть несколько примеров:
Оператор перенаправления > находится между командой ipconfig и именем файла. Если файл уже существует, он будет перезаписан. Если он еще не существует, он будет создан.
Помните, что при использовании оператора перенаправления > указанный файл создается, если он еще не существует, и перезаписывается, если он существует.
Оператор добавления перенаправления
Оператор двойной стрелки добавляет, а не заменяет файл:
Вот пример того, как может выглядеть этот файл LOG после экспорта в него команды:
Оператор перенаправления >> полезен, когда вы собираете похожую информацию с разных компьютеров или команд и хотите, чтобы все эти данные были в одном файле.
Используйте операторы перенаправления в пакетных файлах
Операторы перенаправления работают в пакетных файлах, включая команду так же, как в командной строке:
Источник
Перенаправление сообщений об ошибках из командной подсказки: STDERR/STDOUT
В этой статье описывается перенаправление сообщений об ошибках из командной подсказки.
Оригинальная версия продукта: Visual C++
Исходный номер КБ: 110930
Сводка
При перенаправлении выходных данных из приложения с помощью символа сообщения об ошибках > по-прежнему печатаются на экране. Это происходит потому, что сообщения об ошибках часто отправляются в поток стандартных ошибок вместо потока Standard Out.
Выход из приложения или команды консоли (Командная подсказка) часто отправляется в два отдельных потока. Регулярный вывод отправляется в Standard Out (STDOUT), а сообщения об ошибке отправляются в стандартную ошибку (STDERR). При перенаправлении вывода консоли с помощью > символа перенаправляется только STDOUT. Чтобы перенаправить STDERR, необходимо указать 2> для символа перенаправления. При этом выбирается второй поток вывода, который является STDERR.
Пример
Команда dir file.xxx (где file.xxx не существует) отображает следующий вывод:
Объем в диске F — серийный номер тома Конфеты трости 34EC-0876
Файл не найден
Если вы перенаправляете выход на устройство NUL с помощью, вы все равно увидите dir file.xxx > nul сообщение об ошибке:
Чтобы перенаправить сообщение об ошибке в NUL, используйте следующую команду:
Ошибки и стандартные выходные данные можно напечатать в одном файле с помощью команды, чтобы перенаправить выход для STDERR в STDOUT, а затем отправить выход из &1 STDOUT в файл:
Источник
To expand on davor’s answer, you can use PowerShell like this:
powershell "dir | tee test.txt"
If you’re trying to redirect the output of an exe in the current directory, you need to use .
on the filename, eg:
powershell ".something.exe | tee test.txt"
answered Dec 31, 2013 at 8:59
Saxon DruceSaxon Druce
17.4k5 gold badges49 silver badges71 bronze badges
13
I was able to find a solution/workaround of redirecting output to a file and then to the console:
dir > a.txt | type a.txt
where dir is the command which output needs to be redirected, a.txt a file where to store output.
answered Jul 17, 2009 at 6:59
12
Check this out: wintee
No need for cygwin.
I did encounter and report some issues though.
Also you might check unxutils because it contains tee (and no need for cygwin), but beware that output EOL’s are UNIX-like here.
Last, but not least, is if you have PowerShell, you could try Tee-Object. Type get-help tee-object
in PowerShell console for more info.
answered Sep 15, 2012 at 14:57
Davor JosipovicDavor Josipovic
5,2071 gold badge37 silver badges55 bronze badges
3
@tori3852
I found that
dir > a.txt | type a.txt
didn’t work (first few lines of dir listing only — suspect some sort of process forking and the second part, the ‘type’ command terminated before the dire listing had completed? ),
so instead I used:
dir > z.txt && type z.txt
which did — sequential commands, one completes before the second starts.
Brian Webster
29.9k48 gold badges150 silver badges225 bronze badges
answered Feb 2, 2011 at 5:25
Andy WelchAndy Welch
5574 silver badges2 bronze badges
1
Unfortunately there is no such thing.
Windows console applications only have a single output handle. (Well, there are two STDOUT
, STDERR
but it doesn’t matter here) The >
redirects the output normally written to the console handle to a file handle.
If you want to have some kind of multiplexing you have to use an external application which you can divert the output to. This application then can write to a file and to the console again.
answered Apr 28, 2009 at 6:48
Daniel RikowskiDaniel Rikowski
71k57 gold badges250 silver badges325 bronze badges
1
A simple C# console application would do the trick:
using System;
using System.Collections.Generic;
using System.IO;
namespace CopyToFiles
{
class Program
{
static void Main(string[] args)
{
var buffer = new char[100];
var outputs = new List<TextWriter>();
foreach (var file in args)
outputs.Add(new StreamWriter(file));
outputs.Add(Console.Out);
int bytesRead;
do
{
bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
} while (bytesRead == buffer.Length);
outputs.ForEach(o => o.Close());
}
}
}
To use this you just pipe the source command into the program and provide the path of any files you want to duplicate the output to. For example:
dir | CopyToFiles files1.txt files2.txt
Will display the results of dir as well as store the results in both files1.txt and files2.txt.
Note that there isn’t much (anything!) in the way of error handling above, and supporting multiple files may not actually be required.
T.S.
18k11 gold badges57 silver badges78 bronze badges
answered Apr 28, 2009 at 7:01
RichardRichard
1,1696 silver badges8 bronze badges
9
This works, though it’s a bit ugly:
dir >_ && type _ && type _ > a.txt
It’s a little more flexible than some of the other solutions, in that it works statement-by-statement so you can use it to append as well. I use this quite a bit in batch files to log and display messages:
ECHO Print line to screen and log to file. >_ && type _ && type _ >> logfile.txt
Yes, you could just repeat the ECHO statement (once for the screen and the second time redirecting to the logfile), but that looks just as bad and is a bit of a maintenance issue. At least this way you don’t have to make changes to messages in two places.
Note that _ is just a short filename, so you’ll need to make sure to delete it at the end of your batch file (if you’re using a batch file).
answered Mar 17, 2011 at 1:49
MTSMTS
1,8452 gold badges17 silver badges18 bronze badges
5
I’d like to expand a bit on Saxon Druce’s excellent answer.
As stated, you can redirect the output of an executable in the current directory like so:
powershell ".something.exe | tee test.txt"
However, this only logs stdout
to test.txt
. It doesn’t also log stderr
.
The obvious solution would be to use something like this:
powershell ".something.exe 2>&1 | tee test.txt"
However, this won’t work for all something.exe
s. Some something.exe
s will interpret the 2>&1
as an argument and fail. The correct solution is to instead only have apostrophes around the something.exe
and its switches and arguments, like so:
powershell ".something.exe --switch1 --switch2 … arg1 arg2 …" 2^>^&1 ^| tee test.txt
Notice though, that in this case you have to escape the special cmd-shell characters «>&|» with a «^» each so they only get interpreted by powershell.
answered Jun 18, 2016 at 11:07
アリスターアリスター
3322 silver badges7 bronze badges
5
mtee is a small utility which works very well for this purpose. It’s free, source is open, and it Just Works.
You can find it at http://www.commandline.co.uk.
Used in a batch file to display output AND create a log file simultaneously, the syntax looks like this:
someprocess | mtee /+ mylogfile.txt
Where /+ means to append output.
This assumes that you have copied mtee into a folder which is in the PATH, of course.
answered Oct 21, 2011 at 20:36
MarkMark
1811 silver badge2 bronze badges
2
I agree with Brian Rasmussen, the unxutils port is the easiest way to do this. In the Batch Files section of his Scripting Pages Rob van der Woude provides a wealth of information on the use MS-DOS and CMD commands. I thought he might have a native solution to your problem and after digging around there I found TEE.BAT, which appears to be just that, an MS-DOS batch language implementation of tee. It is a pretty complex-looking batch file and my inclination would still be to use the unxutils port.
answered Apr 28, 2009 at 7:06
Steve CraneSteve Crane
4,3085 gold badges39 silver badges63 bronze badges
2
If you have cygwin in your windows environment path you can use:
dir > a.txt | tail -f a.txt
answered May 16, 2014 at 13:12
jkdbajkdba
2,2983 gold badges22 silver badges33 bronze badges
2
dir 1>a.txt 2>&1 | type a.txt
This will help to redirect both STDOUT and STDERR
answered Nov 2, 2011 at 15:23
rashokrashok
12.7k16 gold badges88 silver badges100 bronze badges
2
I know this is a very old topic, but in previous answers there is not a full implementation of a real time Tee written in Batch. My solution below is a Batch-JScript hybrid script that use the JScript section just to get the output from the piped command, but the processing of the data is done in the Batch section. This approach have the advantage that any Batch programmer may modify this program to fit specific needs. This program also correctly process the output of CLS command produced by other Batch files, that is, it clear the screen when CLS command output is detected.
@if (@CodeSection == @Batch) @then
@echo off
setlocal EnableDelayedExpansion
rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version
rem Antonio Perez Ayala
rem The advantage of this program is that the data management is written in Batch code,
rem so any Batch programmer may modify it to fit their own needs.
rem As an example of this feature, CLS command is correctly managed
if "%~1" equ "" (
echo Duplicate the Stdout output of a command in the screen and a disk file
echo/
echo anyCommand ^| APATee teeFile.txt [/A]
echo/
echo If /A switch is given, anyCommand output is *appended* to teeFile.txt
goto :EOF
)
if "%2" equ ":TeeProcess" goto TeeProcess
rem Get the output of CLS command
for /F %%a in ('cls') do set "cls=%%a"
rem If /A switch is not provided, delete the file that receives Tee output
if /I "%~2" neq "/A" if exist %1 del %1
rem Create the semaphore-signal file and start the asynchronous Tee process
echo X > Flag.out
if exist Flag.in del Flag.in
Cscript //nologo //E:JScript "%~F0" | "%~F0" %1 :TeeProcess
del Flag.out
goto :EOF
:TeeProcess
rem Wait for "Data Available" signal
if not exist Flag.in goto TeeProcess
rem Read the line sent by JScript section
set line=
set /P line=
rem Set "Data Read" acknowledgement
ren Flag.in Flag.out
rem Check for the standard "End Of piped File" mark
if "!line!" equ ":_EOF_:" exit /B
rem Correctly manage CLS command
if "!line:~0,1!" equ "!cls!" (
cls
set "line=!line:~1!"
)
rem Duplicate the line in Stdout and the Tee output file
echo(!line!
echo(!line!>> %1
goto TeeProcess
@end
// JScript section
var fso = new ActiveXObject("Scripting.FileSystemObject");
// Process all lines of Stdin
while ( ! WScript.Stdin.AtEndOfStream ) {
// Read the next line from Stdin
var line = WScript.Stdin.ReadLine();
// Wait for "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
WScript.Sleep(10);
}
// Send the line to Batch section
WScript.Stdout.WriteLine(line);
// Set "Data Available" signal
fso.MoveFile("Flag.out", "Flag.in");
}
// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
WScript.Sleep(10);
}
// Send the standard "End Of piped File" mark
WScript.Stdout.WriteLine(":_EOF_:");
fso.MoveFile("Flag.out", "Flag.in");
answered May 20, 2013 at 3:07
AaciniAacini
64.6k12 gold badges72 silver badges108 bronze badges
2
I was also looking for the same solution, after a little try, I was successfully able to achieve that in Command Prompt. Here is my solution :
@Echo off
for /f "Delims=" %%a IN (xyz.bat) do (
%%a > _ && type _ && type _ >> log.txt
)
@Echo on
It even captures any PAUSE command as well.
answered Dec 2, 2014 at 19:50
Koder101Koder101
83415 silver badges28 bronze badges
Something like this should do what you need?
%DATE%_%TIME% > c:a.txt & type c:a.txt
ipconfig >> c:a.txt & type c:a.txt
ping localhost >> c:a.txt & type c:a.txt
pause
LarsTech
80.4k14 gold badges152 silver badges223 bronze badges
answered Apr 5, 2016 at 13:40
Richard KRichard K
511 silver badge1 bronze badge
1
Here’s a sample of what I’ve used based on one of the other answers
@echo off
REM SOME CODE
set __ERROR_LOG=c:errors.txt
REM set __IPADDRESS=x.x.x.x
REM Test a variable
if not defined __IPADDRESS (
REM Call function with some data and terminate
call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED
goto :EOF
)
REM If test happens to be successful, TEE out a message and end script.
call :TEE Script Ended Successful
goto :EOF
REM THE TEE FUNCTION
:TEE
for /f "tokens=*" %%Z in ("%*") do (
> CON ECHO.%%Z
>> "%__ERROR_LOG%" ECHO.%%Z
goto :EOF
)
answered Nov 2, 2011 at 18:17
send output to console, append to console log, delete output from current command
dir >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1
Andreas
5,3249 gold badges44 silver badges53 bronze badges
answered Jan 23, 2015 at 18:46
DennisDennis
1043 bronze badges
1
This is not another answer, but more an overview and clarification to the already existed answers like
Displaying Windows command prompt output and redirecting it to a file
and others
I’ve found for myself that there is a set of issues what makes a set of tee implementations are not reliable in the Windows (Windows 7
in mine case).
I need to use specifically a tee implementation because have already uses a batch script with self redirection:
@echo off
setlocal
... some conditions here ..
rem the redirection
"%COMSPEC%" /C call %0 %* 2>&1 | "<path_to_tee_utililty>" ".log<log_file_name_with_date_and_time>.%~nx0.log"
exit /b
:IMPL
... here the rest of script ...
The script and calls to some utilities inside the script can break the output if used together with a tee utility.
- The gnuwin32 implementation:
http://gnuwin32.sourceforge.net/packages/coreutils.htm
Pros:
- Correctly handles standard output together with a console progress bar, where the
r
character is heavily used.
Cons:
- Makes console progress bars to draw only in a log file, but it has not duplicated or visible in the console window.
- Throws multiple error messages
Cwrite error: No such file or directory
because seems the cmd interpreter closes the pipe/stdout too early and can not self close after that (spamming until termination). - Does not duplicate/print the output from the
pause
command (Press any key to continue...
) in the console window.
- The wintee implementation:
https://code.google.com/archive/p/wintee/
https://github.com/rbuhl/wintee
Pros:
- Shows a console progress bar both in the console window and in a log file (multiple prints).
- Does duplicate/print the output from the
pause
command (Press any key to continue...
) in the console window.
Cons:
- Incorrectly handles the
r
character, output is mixed and messed (https://code.google.com/archive/p/wintee/issues/7 ). - Having other issues: https://code.google.com/archive/p/wintee/issues
- The UnxUtils implementation:
http://unxutils.sourceforge.net/
https://sourceforge.net/projects/unxutils/files/unxutils/current/
Pros
- Shows a console progress bar both in the console window and in a log file (multiple prints).
- Correctly handles the
r
character. - Does duplicate/print the output from the
pause
command (Press any key to continue...
) in the console window.
Cons
Not yet found
- The ss64.net implementation:
http://ss64.net/westlake/nt
http://ss64.net/westlake/nt/tee.zip
Pros:
- Shows a console progress bar both in the console window and in a log file (multiple prints).
Cons:
- Incorrectly handles the
r
character, output is mixed and messed - For some reason does duplicate/print the output from the
pause
command (Press any key to continue...
) in the console window AFTER a key press.
- The ritchielawrence mtee implementation:
https://ritchielawrence.github.io/mtee
https://github.com/ritchielawrence/mtee
Pros
- Shows a console progress bar both in the console window and in a log file (multiple prints).
- Correctly handles the
r
character. - Does duplicate/print the output from the
pause
command (Press any key to continue...
) in the console window. - The error code retain feature w/o a need to use workaround with the
doskey
(/E
flag, Windows command interpreter: how to obtain exit code of first piped command )
Cons
-
Does not support forward slash characters in the path to a log file (https://github.com/ritchielawrence/mtee/issues/6 )
-
Has a race condition issue, when can not extract a pipe process exit code because it has closed before it’s access (https://github.com/ritchielawrence/mtee/issues/4 )
So, if you are choosing the tee utility implementation between the above, then a better choice is the UnxUtils
or mtee
.
If you are searching for a better implementation with more features and less issues, then you can use callf
utility:
https://github.com/andry81/contools/tree/HEAD/Utilities/src/callf/help.tpl
You can run instead of:
call test.bat | mtee /E 1.log
This:
callf.exe /ret-child-exit /tee-stdout 1.log /tee-stdout-dup 1 "" "cmd.exe /c call test.bat"
It is better because it can pipe stdout
separately from stderr
and you can even pipe between processes with Administrator privileges isolation using named pipes.
answered Jul 7, 2020 at 9:09
AndryAndry
2,16927 silver badges28 bronze badges
2
This is a variation on a previous answer by MTS, however it adds some functionality that might be useful to others. Here is the method that I used:
- A command is set as a variable, that can be used later throughout the code, to output to the command window and append to a log file, using
set _Temp_Msg_Cmd=
- the command has escaped redirection using the carrot
^
character so that the commands are not evaluated initially
- the command has escaped redirection using the carrot
- A temporary file is created with a filename similar to the batch file being run called
%~n0_temp.txt
that uses command line parameter extension syntax%~n0
to get the name of the batch file. - The output is appended to a separate log file
%~n0_log.txt
Here is the sequence of commands:
- The output and error messages are sent to the temporary file
^> %~n0_temp.txt 2^>^&1
- The content of the temporary file is then both:
- appended to the logfile
^& type %~n0_temp.txt ^>^> %~n0_log.txt
- output to the command window
^& type %~n0_temp.txt
- appended to the logfile
- The temporary file with the message is deleted
^& del /Q /F %~n0_temp.txt
Here is the example:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
This way then the command can simply be appended after later commands in a batch file that looks a lot cleaner:
echo test message %_Temp_Msg_Cmd%
This can be added to the end of other commands as well. As far as I can tell it will work when messages have multiple lines. For example the following command outputs two lines if there is an error message:
net use M: /D /Y %_Temp_Msg_Cmd%
answered Jul 27, 2015 at 16:36
Just like unix.
dir | tee a.txt
Does work On windows XP, it requires mksnt
installed.
It displays on the prompt as well as appends to the file.
Corey
1,1773 gold badges20 silver badges38 bronze badges
answered May 3, 2013 at 12:47
@echo on
set startDate=%date%
set startTime=%time%
set /a sth=%startTime:~0,2%
set /a stm=1%startTime:~3,2% - 100
set /a sts=1%startTime:~6,2% - 100
fullprocess.bat > C:LOGS%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat
This will create a log file with the current datetime and you can the console lines during the process
Vladimir
170k36 gold badges385 silver badges313 bronze badges
answered Dec 3, 2010 at 14:15
1
I use a batch subroutine with a «for» statement to get the command output one line at a time and both write that line to a file and output it to the console.
@echo off
set logfile=test.log
call :ExecuteAndTee dir C:Program Files
Exit /B 0
:ExecuteAndTee
setlocal enabledelayedexpansion
echo Executing '%*'
for /f "delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)
endlocal
Exit /B 0
answered Feb 27, 2014 at 21:45
Cody BarnesCody Barnes
3583 silver badges8 bronze badges
1
If you’re on the CLI, why not use a FOR loop to «DO» whatever you want:
for /F "delims=" %a in ('dir') do @echo %a && echo %a >> output.txt
Great resource on Windows CMD for loops: https://ss64.com/nt/for_cmd.html
The key here is setting the delimeters (delims), that would break up each line of output, to nothing. This way it won’t break on the default of white-space. The %a is an arbitrary letter, but it is used in the «do» section to, well… do something with the characters that were parsed at each line. In this case we can use the ampersands (&&) to execute the 2nd echo command to create-or-append (>>) to a file of our choosing. Safer to keep this order of DO commands in case there’s an issue writing the file, we’ll at least get the echo to the console first. The at sign (@) in front of the first echo suppresses the console from showing the echo-command itself, and instead just displays the result of the command which is to display the characters in %a. Otherwise you’d see:
echo Volume in drive [x] is Windows
Volume in drive [x] is Windows
UPDATE: /F skips blank lines and only fix is to pre-filter the output adding a character to every line (maybe with line-numbers via the command find). Solving this in CLI isn’t quick or pretty. Also, I didn’t include STDERR, so here’s capturing errors as well:
for /F "delims=" %a in ('dir 2^>^&1') do @echo %a & echo %a >> output.txt
Redirecting Error Messages
The carets (^) are there to escape the symbols after them, because the command is a string that’s being interpreted, as opposed to say, entering it directly on the command-line.
answered Feb 6, 2019 at 20:37
Had To AskHad To Ask
691 silver badge4 bronze badges
I just found a way to use the perl as alternative, e.g.:
CMD1 | perl -ne "print $_; print STDERR $_;" 2> OUTPUT.TEE
answered Jul 2, 2020 at 11:05
Following helps if you want something really seen on the screen — even if the batch file was redirected to a file. The device CON maybe used also if redirected to a file
Example:
ECHO first line on normal stdout. maybe redirected
ECHO second line on normal stdout again. maybe redirected
ECHO third line is to ask the user. not redirected >CON
ECHO fourth line on normal stdout again. maybe redirected
Also see good redirection description: http://www.p-dd.com/chapter7-page14.html
answered Jul 8, 2009 at 8:52
Baresi der LiberoBaresi der Libero
How do I display and redirect output
to a file. Suppose if I use dos
command, dir > test.txt ,this command
will redirect output to file test.txt
without displaying the results. how to
write a command to display the output
and redirect output to a file using
DOS i.e., windows command prompt, not
in UNIX/LINUX.
You may find these commands in biterscripting ( http://www.biterscripting.com ) useful.
var str output
lf > $output
echo $output # Will show output on screen.
echo $output > "test.txt" # Will write output to file test.txt.
system start "test.txt" # Will open file test.txt for viewing/editing.
answered Jan 10, 2010 at 21:35
This works in real time but is also kind a ugly and the performance is slow. Not well tested either:
@echo off
cls
SET MYCOMMAND=dir /B
ECHO File called 'test.bat' > out.txt
for /f "usebackq delims=" %%I in (`%MYCOMMAND%`) do (
ECHO %%I
ECHO %%I >> out.txt
)
pause
answered Sep 20, 2012 at 17:48
djangofandjangofan
28.3k61 gold badges194 silver badges285 bronze badges
1
An alternative is to tee stdout to stderr within your program:
in java:
System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));
Then, in your dos batchfile: java program > log.txt
The stdout will go to the logfile and the stderr (same data) will show on the console.
answered Nov 23, 2012 at 19:50
The CoordinatorThe Coordinator
12.9k11 gold badges43 silver badges73 bronze badges
I install perl on most of my machines so an answer using perl: tee.pl
my $file = shift || "tee.dat";
open $output, ">", $file or die "unable to open $file as output: $!";
while(<STDIN>)
{
print $_;
print $output $_;
}
close $output;
dir | perl tee.pl
or
dir | perl tee.pl dir.bat
crude and untested.
answered Feb 19, 2014 at 15:39
DannyKDannyK
1,34216 silver badges23 bronze badges