Отображение вывода командной строки Windows и перенаправление его в файл - PullRequest
334 голосов
/ 28 апреля 2009

Как я могу запустить приложение командной строки в командной строке Windows и одновременно выводить и перенаправлять вывод в файл?

Если, например, я должен был запустить команду dir > test.txt, это перенаправит вывод в файл с именем test.txt без отображения результатов.

Как можно написать команду для отображения вывода и перенаправить вывод в файл в командной строке Windows, аналогично команде tee в Unix?

Ответы [ 30 ]

126 голосов
/ 31 декабря 2013

Чтобы расширить ответ Давора , вы можете использовать PowerShell следующим образом:

powershell "dir | tee test.txt"

Если вы пытаетесь перенаправить вывод exe-файла в текущий каталог, вам нужно использовать .\ в имени файла, например:

powershell ".\something.exe | tee test.txt"
124 голосов
/ 17 июля 2009

Мне удалось найти решение / обходной путь перенаправления вывода в файл и затем на консоль:

dir > a.txt | type a.txt

, где dir - команда, выходные данные которой необходимо перенаправить, a.txt - файл, в котором следует сохранить выходные данные.

90 голосов
/ 28 апреля 2009

Есть порт Win32 команды Unix tee, который делает именно это. См http://unxutils.sourceforge.net/ или http://getgnuwin32.sourceforge.net/

48 голосов
/ 15 сентября 2012

Проверьте это: Wintee

Нет необходимости в Cygwin.

Я действительно столкнулся и сообщил о некоторых проблемах.

Также вы можете проверить unxutils , потому что он содержит тройник (и не нуждается в cygwin), но остерегайтесь того, что выходные EOL являются UNIX-подобными здесь.

И последнее, но не менее важное: если у вас есть PowerShell, вы можете попробовать Tee-Object. Для получения дополнительной информации введите get-help tee-object в консоли PowerShell.

43 голосов
/ 02 февраля 2011

@ tori3852

Я обнаружил, что

dir > a.txt | type a.txt

не сработало (только первые несколько строк в списке dir - есть подозрение, что какой-то процесс разветвился, а во второй части команда 'type' прервалась до того, как завершился ужасный список?), поэтому вместо этого я использовал:

dir > z.txt && type z.txt

which - последовательные команды, одна из которых завершается до запуска второй.

22 голосов
/ 28 апреля 2009

Простое консольное приложение на C # поможет:

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());
        }
    }
}

Чтобы использовать это, вы просто передаете исходную команду в программу и указываете путь к любым файлам, на которые хотите дублировать вывод. Например:

dir | CopyToFiles files1.txt files2.txt 

Отобразит результаты dir, а также сохранит результаты в файлах file1.txt и files2.txt.

Обратите внимание, что в способе обработки ошибок, описанном выше, не так много (ничего!), И поддержка нескольких файлов может на самом деле не требоваться.

21 голосов
/ 28 апреля 2009

К сожалению, такого нет.

Консольные приложения Windows имеют только один дескриптор вывода. (Ну, есть два STDOUT, STDERR, но это не имеет значения). > перенаправляет вывод, обычно записываемый в дескриптор консоли, в дескриптор файла.

Если вы хотите использовать мультиплексирование, вам нужно использовать внешнее приложение, на которое вы можете перенаправить вывод. Затем это приложение может снова записать в файл и в консоль.

18 голосов
/ 17 марта 2011

Это работает, хотя немного уродливо:

dir >_ && type _ && type _ > a.txt

Он немного более гибкий, чем некоторые другие решения, так как он работает оператор за оператором, так что вы можете использовать его для добавления. Я часто использую это в пакетных файлах для регистрации и отображения сообщений:

ECHO Print line to screen and log to file.  >_ && type _ && type _ >> logfile.txt

Да, вы можете просто повторить оператор ECHO (один раз для экрана и второй раз для перенаправления в файл журнала), но это выглядит так же плохо и является проблемой технического обслуживания. По крайней мере, таким образом вам не нужно вносить изменения в сообщения в двух местах.

Обратите внимание, что _ - это просто короткое имя файла, поэтому вам нужно обязательно удалить его в конце вашего пакетного файла (если вы используете пакетный файл).

16 голосов
/ 22 октября 2011

mtee - небольшая утилита, которая очень хорошо работает для этой цели. Это бесплатно, источник открыт, и он просто работает.

Вы можете найти его на http://www.commandline.co.uk.

Используется в пакетном файле для отображения вывода и одновременного создания файла журнала, синтаксис выглядит следующим образом:

    someprocess | mtee /+ mylogfile.txt

Где / + означает добавление вывода.

Это предполагает, что вы скопировали mtee в папку, которая находится в ПУТИ, конечно.

9 голосов
/ 28 апреля 2009

Я согласен с Брайаном Расмуссеном, порт unxutils - самый простой способ сделать это. В разделе Пакетные файлы на своих страницах сценариев Роб ван дер Вуд предоставляет обширную информацию об использовании команд MS-DOS и CMD. Я подумал, что у него может быть собственное решение вашей проблемы, и, покопавшись там, я нашел TEE.BAT , который, похоже, является реализацией пакетного языка MS-DOS для tee. Это довольно сложный пакетный файл, и я по-прежнему хотел бы использовать порт unxutils.

...