Перенаправление 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
правильно, дескриптор файла 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") может быть более надежным для такой задачи. См.: Малдера