Перенаправление окон УМК stdout и stderr в один файл

Я'м пытаясь перенаправить поток вывода (stdout + stderr, в) из Дос команда в один файл:

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

Возможно ли это, или я должен просто перенаправить в двух отдельных файлах?

Комментарии к вопросу (2)
Решение

Вы хотите:

dir > a.txt 2>&1

Синтаксис 2>&1 перенаправить 2 (поток stderr) на " 1 " (стандартный вывод). Вы также можете скрыть сообщения, перенаправив нуль, более подробное объяснение и примеры в MSDN.

Комментарии (9)

Андерс Линдал'ы ответ правильный, но следует отметить, что если вы не перенаправление stdout в файл и хотите перенаправить stderr, а затем вы должны убедиться, что 2>&1 указан после в 1> перенаправление, иначе ничего не получится.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
Комментарии (14)

Справочная информация от МСКБ

Хотя принято отвечать на этот вопрос правильно, это действительно не'т многое сделать, чтобы объяснить почему он работает, и так как синтаксис не сразу понятно, я сделал быстрый Google, чтобы выяснить, что происходит на самом деле. В надежде, что эта информация будет полезной для других, Я'м его размещения здесь.

Взято из MS поддержка КБ 110930.


От MSKB110930

перенаправление сообщений об ошибках в командной строке: поток stderr/stdout в

резюме

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

выход из консоли (командной строки) приложения или команды часто посылали два отдельных потока. Обычный вывод направляется в стандартный выход (stdout) и сообщения об ошибках передаются в стандартный файл ошибок (stderr). Когда вы перенаправить вывод консоли, используя " и>" и символ, вы не только перенаправление stdout. Для того, чтобы перенаправить stderr, необходимо указать '2>' для символа перенаправления. Выбор второй выходной поток, поток stderr.

пример

файл команду реж.ХХХ файл (где`.ХХХ не существует) появится следующий вывод:

объем в диск F-это конфеты объема трость серийный номер 34EC-0876

файл не найден

Если вам перенаправить вывод в нул устройство, используя файл dir.ХХХ > нуль`, вы все еще увидите сообщение об ошибке вывода, Как это:

файл не найден

В редиректа (только) сообщение об ошибке нуль, используйте следующую команду:

файл dir.ХХХ 2> нул

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

файл dir.ХХХ > выход.МСГ 2> выход.подстраховаться

вы можете печатать ошибок и стандартный вывод в один файл с помощью " и&АМП;1" в команду, чтобы перенаправить вывод в поток stderr в stdout, а затем направив вывод в стандартный вывод в файл:

файл dir.ХХХ 1> выход.сообщение 2>&1

Комментарии (0)

Чтобы добавить stdout и stderr в общий лог-файл скрипта:

dir >> a.txt 2>&1
Комментарии (1)

Правильно, дескриптор файла 1 для процесса стандартный вывод, перенаправляться 1> или в > (1 может быть опущен, по соглашению, командный интерпретатор [cmd.exe] знает, что справиться с этим). Дескриптор файла 2-это поток stderr, перенаправляются 2>.

Обратите внимание, что если вы're, используя эти файлы журналов, а затем, если вы'вновь отправляю outut в _uniquelynamed (например дата и время) лог-файлы, то если запустить тот же процесс дважды, перенаправленные будет переписать (заменить) предыдущий файл журнала.

В >> (для stdout или stderr) будет добавлять не заменить файл. Таким образом, вы получаете накопительный журнал, showwing результаты всех тиражей сам процесс - как правило, более эффективны.

Счастливого пути...

Комментарии (0)

Я только что выхваченное ответ как @Андерс просто запостил, но...

Из моего окна помочь, я искал на редирект (URL-адрес ms-its:C:\WINDOWS\Help\ntcmds.chm::/redirection.htm).

Вы можете прочитать о >> и | (трубы) тоже.

Комментарии (0)

Есть, правда, никакой гарантии, что выход SDTOUT и стандартный вывод переплелись построчно в своевременном порядке, используя в POSIX` перенаправить синтаксис слияния.

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

Выделенный консольный вывод логгера (т. е. в то"поток stdout/stderr, в регистратор и" на 'Лорд Малдер') может быть более надежным для такой задачи.

См.: Малдер'ы opensource проекты

Комментарии (0)

В пакетный файл (Windows 7 и выше) я нашел этот способ самый надежный

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

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

Комментарии (1)