Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top