Я пытаюсь перенаправить весь вывод (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.
Это возможно, или я должен просто перенаправить на два отдельных файла?
windows
command-line
cmd
pipe
ripper234
источник
источник
Ответы:
Ты хочешь:
Синтаксис
2>&1
будет перенаправлять2
(stderr) на1
(stdout). Вы также можете скрыть сообщения от перенаправленияNUL
, более подробного объяснения и примеров по MSDN .источник
net stop w3svc >NUL 2>&1
.. спасибо!2> 2.txt
работает (или2> &1
)2 > 2.txt
нет;2 > &1
не.Ответ Андерса Линдаль является правильным, но следует отметить , что если вы перенаправлять стандартный вывод в файл и хотите , чтобы перенаправить поток ошибок, а затем вы должны убедиться , что
2>&1
указано ПОСЛЕ в1>
редирект, в противном случае он не будет работать.источник
dir 2>&1 > a.txt
, вы сначала перенаправите (>
) поток 2 (stderr) на поток 1 (stdout). Затем, после того, как они оба уже объединены, вы перенаправляете стандартный вывод (>
без спецификатора) в файл. Если вы хотите, чтобы stderr пошел куда-то еще, вы не можете сначала присоединиться к нему с помощью stdout.Справочная информация от MSKB
Хотя принятый ответ на этот вопрос является правильным, на самом деле он мало чем объясняет, почему он работает, и, поскольку синтаксис не сразу понятен, я быстро нашел Google, чтобы выяснить, что на самом деле происходит. В надежде, что эта информация будет полезна для других, я публикую ее здесь.
Взято из MS Support KB 110930 .
От MSKB110930
источник
Чтобы добавить stdout и stderr в общий файл журнала скрипта:
источник
>>
Присоединяет к файлу , в котором>
перезаписывает файл.Правильно, файловый дескриптор 1 для процесса - STDOUT, перенаправленный с помощью
1>
или>
(1 может быть опущено, по соглашению, интерпретатор команд [cmd.exe] знает, как обрабатывать это). Дескриптор файла 2 - STDERR, перенаправленный2>
.Обратите внимание, что если вы используете их для создания файлов журнала, то, если вы не отправляете выход в _uniquely_named_ (например, с отметкой даты и времени) файлы журнала, то, если вы запускаете один и тот же процесс дважды, перенаправленный перезапишет ( заменить) предыдущий файл журнала.
>>
(Для обоих STDOUT или STDERR) приложат не ЗАМЕНИТЬ файл. Таким образом, вы получаете накопительный лог-файл, показывающий результаты всех запусков процесса - как правило, более полезный.Счастливые тропы ...
источник
Однако нет никакой гарантии, что выходные данные
SDTOUT
иSTDERR
будут переплетены построчно в своевременном порядке, используяPOSIX
синтаксис перенаправления слияния.Если приложение использует буферизованный вывод, может случиться так, что текст одного потока будет вставлен в другой на границе буфера, которая может появиться в середине текстовой строки.
Выделенный вывод на консоль регистратор (т.е. с
"StdOut/StdErr Logger"
помощью'LoRd MuldeR'
) могут быть более надежными для такой задачи.Смотрите: Проекты с открытым исходным кодом MuldeR
источник
В пакетном файле (Windows 7 и выше) я нашел этот метод наиболее надежным
Очевидно, используйте любые команды, которые вы хотите, и вывод будет направлен в текстовый файл. С помощью этого метода является надежным Однако нет никакого вывода на экран.
источник
>con echo This goes to screen
Также полезно для ввода пользователем.>con set /p "var="Input: "
Примечание: эти строки будут отображаться только на экране и не будут перенаправлены в файл.