Перенаправить Windows cmd stdout и stderr в один файл
-
07-07-2019 - |
Вопрос
Я пытаюсь перенаправить весь вывод (stdout + stderr) команды DOS на один файл:
C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.
Возможно ли это, или я должен просто перенаправить на два отдельных файла?
Решение
Вы хотите:
dir > a.txt 2>&1
Синтаксис 2 > & amp; 1
перенаправит 2
(stderr) в 1
(stdout). Вы также можете скрыть сообщения, перенаправив их на NUL
, дополнительные пояснения и примеры на MSDN .
Другие советы
Ответ Андерса Линдала правильный, но следует отметить, что если вы перенаправляете стандартный вывод в файл и хотите перенаправить также стандартный поток ошибок, то вы ДОЛЖНЫ убедиться, что указан 2 > & amp; 1
< strong> ПОСЛЕ перенаправления 1 >
, иначе оно не будет работать.
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
Правильный путь: dir > a.txt 2 > & 1
. Чтобы добавить, используйте > >
.
Справочная информация из MSKB
Несмотря на то, что принятый ответ на этот вопрос правильный, на самом деле почему это не помогает, и поскольку синтаксис не сразу понятен, я быстро нашел Google, чтобы выяснить, что это такое. на самом деле происходило. В надежде, что эта информация будет полезна для других, я публикую ее здесь.
Взято из MS Support KB 110930 . Р> <Ч>
из MSKB110930
Перенаправление сообщений об ошибках из командной строки: STDERR / STDOUT
Резюме
При перенаправлении вывода из приложения с помощью '>' символ, сообщения об ошибках по-прежнему выводятся на экран. Это связано с тем, что сообщения об ошибках часто отправляются в поток стандартных ошибок вместо потока стандартных выходов.
Вывод из консольного приложения (командной строки) или команды часто отправляется в два отдельных потока. Обычный вывод отправляется на стандартный выход (STDOUT), а сообщения об ошибках отправляются на стандартную ошибку (STDERR). Когда вы перенаправляете консольный вывод, используя " > " символ, вы только перенаправляете STDOUT. Чтобы перенаправить STDERR, вы должны указать '2 >' для символа перенаправления. Это выбирает второй выходной поток, который является STDERR.
Пример
Команда
dir file.xxx
(гдеfile.xxx
не существует) отобразит следующий вывод:Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876 File Not Found
Если вы перенаправите вывод на устройство
NUL
, используяdir file.xxx > nul
, вы все равно увидите часть сообщения об ошибке, например:File Not Found
Чтобы перенаправить (только) сообщение об ошибке в
NUL
, используйте следующую команду:dir file.xxx 2> nul
Или вы можете перенаправить вывод в одно место, а ошибки - в другое.
dir file.xxx > output.msg 2> output.err
Вы можете распечатать ошибки и стандартный вывод в один файл, используя " & amp; 1 " команда перенаправить вывод для STDERR в STDOUT, а затем отправить вывод из STDOUT в файл:
dir file.xxx 1> output.msg 2>&1
Чтобы добавить stdout и stderr в общий файл журнала скрипта:
dir >> a.txt 2>&1
Правильно, дескриптор файла 1 для процесса - STDOUT, перенаправленный 1 >
или >
(1 может быть пропущен, как правило, интерпретатором команд [ cmd.exe] знает, как справиться с этим).
Дескриптор файла 2 - это STDERR, перенаправляемый 2 >
.
Обратите внимание, что если вы используете их для создания файлов журнала, то, если вы не отправляете выход в _uniquely_named_ (например, с отметкой даты и времени) файлы журнала, то, если вы запускаете один и тот же процесс дважды, перенаправляется перезапишет (заменит) предыдущий файл журнала.
>
(для STDOUT или STDERR) ПРИЛОЖИТ, а не ЗАМЕНИТ файл. Таким образом, вы получаете накопительный лог-файл, показывающий результаты всех запусков процесса - как правило, более полезный.
Счастливые тропы ...
Я только что выбрал ответ, поскольку @Anders только что опубликовал его, но ...
Из справки Windows я выполнил поиск перенаправления (URL мс-его: C:. \ WINDOWS \ Help \ Ntcmds.chm :: / redirection.htm )
Возможно, вы захотите прочитать о > > и | (труба) тоже.
Однако нет никакой гарантии, что выходные данные SDTOUT и STDERR будут переплетены построчно в своевременном порядке с использованием синтаксиса перенаправления слияния POSIX.
Если приложение использует буферизованный вывод, может случиться так, что текст одного потока будет вставлен в другой на границе буфера, которая может появиться в середине текстовой строки.
Выделенный консольный регистратор вывода (например, «StdOut / StdErr Logger» от LoRd MuldeR) может быть более надежным для такой задачи. См. OpenSource проекты MuldeR