Перенаправление Windows cmd stdout и stderr в один файл

Я пытаюсь перенаправить все выходные данные (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.

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

7 ответов


вы хотите:

dir > a.txt 2>&1

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


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

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

правильно: dir > a.txt 2>&1. Чтобы добавить, используйте >>.


Справочная информация от MSKB

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

принято от поддержка MS KB 110930.


от MSKB110930

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

резюме

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

вывод из консольного (командной строки) приложения или команды часто отправляется в два отдельных потоки. Обычный вывод отправляется в Standard Out (STDOUT), а сообщения об ошибках отправляются в Standard Error (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

вы можете напечатать ошибки и стандартный вывод в один файл с помощью Команда "&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>.

обратите внимание, что если вы используете их для создания файлов журнала, то, если вы не отправляете outut в Файлы журнала _uniquely_named_ (например, дата и время), то если вы запустите тот же процесс дважды, перенаправленный перезапишет (заменит) предыдущий журнал.

на >> (для STDOUT или STDERR) добавит не заменяет файл. Таким образом, вы получаете накопительный файл журнала, показывающий результаты всех запусков процесса - обычно более полезный.

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


Я просто вырезал ответ, так как @Anders только что опубликовал его, но...

из моей справки Windows я искал перенаправление (URL МС-своему:с:\Windows\помочь\ntcmds.Мп::/перенаправление.НТМ).

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


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

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

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