Ответ 1
Вы хотите:
dir > a.txt 2>&1
Синтаксис 2>&1
перенаправит 2
(stderr) на 1
(stdout). Вы также можете скрыть сообщения, перенаправив на NUL
, больше объяснений и примеров в MSDN.
Я пытаюсь перенаправить весь вывод (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>&1
перенаправит 2
(stderr) на 1
(stdout). Вы также можете скрыть сообщения, перенаправив на NUL
, больше объяснений и примеров в MSDN.
Ответ андерса Линдала правильный, но следует отметить, что если вы перенаправляете стандартный вывод в файл и хотите перенаправить также стандартный поток ошибок, то вы ДОЛЖНЫ убедиться, что 2>&1
указан ПОСЛЕ перенаправления 1>
, иначе это не сработает.
REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
Хотя принятый ответ на этот вопрос верен, на самом деле он мало чем объясняет, почему он работает, и поскольку синтаксис не сразу ясен, я быстро нашел google, чтобы узнать, что происходит на самом деле. В надежде, что эта информация поможет другим, я размещаю ее здесь.
Взято из MS Support KB 110930.
Перенаправление сообщений об ошибках из командной строки: STDERR/STDOUT
Резюме
При перенаправлении вывода из приложения с использованием символа ">" на экран выводятся сообщения об ошибках. Это связано с тем, что сообщения об ошибках часто отправляются в поток стандартных ошибок вместо потока стандартного вывода.
Вывод приложения или команды консоли (Command Prompt) часто отправляется в два отдельных потока. Регулярный вывод отправляется в стандартный выход (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
Вы можете печатать ошибки и стандартный вывод в один файл с помощью команды "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) будет APPEND, а не ЗАМЕНИТЬ файл. Таким образом, вы получаете кумулятивный лог файл, отображающий результаты всех прогонов процесса - обычно более полезными.
Счастливые тропы...
Я просто отрубил ответ, потому что @Anders просто разместил его, но...
Из моей справки Windows я искал перенаправление (URL ms-its: C:\WINDOWS\Help\ntcmds.chm::/redirection.htm).
Вы можете прочитать о → и | (труба) тоже.
Однако нет никакой гарантии, что выходные данные SDTOUT
и STDERR
будут переплетены построчно в своевременном порядке с использованием синтаксиса перенаправления слияния POSIX
.
Если приложение использует буферизованный вывод, может случиться так, что текст одного потока будет вставлен в другой на границе буфера, которая может появиться в середине текстовой строки.
Выделенный консольный регистратор выходных данных (т.е. "StdOut/StdErr Logger"
от 'LoRd MuldeR'
) может быть более надежным для такой задачи.
Смотрите: Проекты с открытым исходным кодом MuldeR
В пакетном файле (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
Очевидно, используйте любые команды, которые вы хотите, и вывод будет направлен в текстовый файл. Использование этого метода является надежным ОДНАКО на экране НЕТ вывода.