Как запустить приложение командной строки в командной строке Windows и одновременно отобразить и перенаправить выходные данные в файл?
Если, например, я должен был выполнить команду dir > test.txt
, это перенаправило бы вывод в файл, вызванный test.txt
без отображения результатов.
Как я мог написать команду для отображения вывода и перенаправить вывод в файл в командной строке Windows, аналогично tee
команде в Unix?
batch-file
cmd
stdout
tee
Эдвард Томсон
источник
источник
Ответы:
Чтобы расширить ответ Давора , вы можете использовать PowerShell следующим образом:
Если вы пытаетесь перенаправить вывод exe
.\
-файла в текущий каталог, вам нужно использовать имя файла, например:источник
dir
в powershell это псевдоним,Get-ChildItem
который не похож на внутреннююdir
команду cmd . Вам нужна,powershell "cmd /c dir | tee test.txt"
если вам нужна внутренняя версия cmd2>&1
, напримерnode 2>&1 | tee debug_log.txt
Мне удалось найти решение / обходной путь перенаправления вывода в файл, а затем на консоль:
где dir - команда, вывод которой необходимо перенаправить, a.txt - файл, в котором следует сохранить вывод.
источник
&
вместо a|
требуется для вывода некоторых команд, напримерping
или7z.exe
dir
. Пример:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. Файл системного отчета заблокирован другим процессом.handle output to stderr
- Добавьте2>&1
перенаправление так, чтобы это было так:dir 2>&1 > a.txt & type a.txt
и вы должны смешать stderr с stdout.Есть порт Win32 команды Unix
tee
, который делает именно это. Смотрите http://unxutils.sourceforge.net/ или http://getgnuwin32.sourceforge.net/источник
tee
пакет GnuWin32 , вы найдете его в gnuwin32.sourceforge.net/packages/coreutils.htm .Проверьте это: wintee
Нет необходимости в Cygwin.
Я столкнулся и сообщил о некоторых проблемах.
Также вы можете проверить unxutils, потому что он содержит tee (и не нуждается в cygwin), но помните, что выходные EOL- ы здесь похожи на UNIX.
И последнее, но не менее важное: если у вас есть PowerShell, вы можете попробовать Tee-Object. Введите
get-help tee-object
консоль PowerShell для получения дополнительной информации.источник
tee
выводит в режиме реального времени.wtee
имеет такую же функциональность. Если вы не возражаете против ошибок, это будет хорошо.@ tori3852
я нашел это
не сработало (только первые несколько строк списка dir - есть подозрение, что какой-то процесс разветвился, а во второй части команда 'type' прервалась до того, как завершился директория direct?), поэтому вместо этого я использовал
которые сделали - последовательные команды, одна завершается до запуска второй.
источник
&
вместо,&&
если вы хотите, чтобыtype
команда выполнялась, даже еслиdir
команда не выполнена. Это полезно, когда в вашей команде произошла какая-то ошибка, и вы все еще хотите увидеть файл журнала на консоли. См. Статью Microsoft по этому вопросу . Однако проблема%errorlevel%
заключается в том, чтобы установить уровень ошибкиtype
(который будет равен 0).К сожалению, такого нет.
Консольные приложения Windows имеют только один дескриптор вывода. (Ну, есть два
STDOUT
,STDERR
но это не имеет значения)>
Перенаправляет вывод, обычно записываемый в дескриптор консоли, в дескриптор файла.Если вы хотите использовать мультиплексирование, вам нужно использовать внешнее приложение, на которое вы можете перенаправить вывод. Это приложение затем может записать в файл и снова в консоль.
источник
tee
на * nix это тоже отдельное приложение, а не какое-то перенаправление на оболочкуПростое консольное приложение C # сделало бы трюк:
Чтобы использовать это, вы просто передаете исходную команду в программу и указываете путь к любым файлам, которым вы хотите продублировать вывод. Например:
Отобразит результаты dir, а также сохранит результаты в файлах file1.txt и files2.txt.
Обратите внимание, что в способе обработки ошибок, описанном выше, не так много (ничего!), И поддержка нескольких файлов может на самом деле не требоваться.
источник
Это работает, хотя это немного уродливо:
Он немного более гибкий, чем некоторые другие решения, поскольку он работает оператор за оператором, так что вы можете использовать его для добавления. Я использую это довольно часто в пакетных файлах для регистрации и отображения сообщений:
Да, вы могли бы просто повторить оператор ECHO (один раз для экрана и второй раз для перенаправления в лог-файл), но это выглядит так же плохо и является проблемой технического обслуживания. По крайней мере, так вам не нужно вносить изменения в сообщения в двух местах.
Обратите внимание, что _ - это просто короткое имя файла, поэтому вам нужно обязательно удалить его в конце вашего пакетного файла (если вы используете пакетный файл).
источник
type
команд в отдельных строках (в подпрограмме) исправило это.mtee - небольшая утилита, которая очень хорошо работает для этой цели. Это бесплатно, источник открыт, и это просто работает.
Вы можете найти его на http://www.commandline.co.uk .
Используемый в пакетном файле для отображения выходных данных и одновременного создания файла журнала, синтаксис выглядит следующим образом:
Где / + означает добавить вывод.
Это предполагает, что вы скопировали mtee в папку, которая находится в PATH, конечно.
источник
Я хотел бы немного рассказать о превосходном ответе саксонца Дрюса .
Как уже говорилось, вы можете перенаправить вывод исполняемого файла в текущий каталог следующим образом:
Тем не менее, это только регистрирует
stdout
вtest.txt
. Это также не входитstderr
.Очевидное решение было бы использовать что-то вроде этого:
Тем не менее, это не будет работать для всех
something.exe
с. Некоторыеsomething.exe
s будут интерпретировать2>&1
как аргумент и потерпят неудачу. Правильное решение - вместо этого иметь только апострофы вокругsomething.exe
и его переключатели и аргументы, вот так:источник
'tee' is not recognized as an internal or external command
по понятным причинам. С2>&1
внутренней CMD линии любой выход на стандартный вывод ошибок приводит к ошибкам из PowerShell.Я согласен с Брайаном Расмуссеном, порт unxutils - самый простой способ сделать это. В разделе « Пакетные файлы » своих страниц сценариев Роб ван дер Вуд предоставляет обширную информацию об использовании команд MS-DOS и CMD. Я подумал, что у него может быть собственное решение вашей проблемы, и, покопавшись там, я нашел TEE.BAT , который, похоже, является реализацией пакетного языка MS-DOS. Это довольно сложный пакетный файл, и я по-прежнему хотел бы использовать порт unxutils.
источник
Если у вас есть Cygwin в вашем пути среды Windows, вы можете использовать:
источник
dir 1>a.txt 2>&1 | type a.txt
Это поможет перенаправить STDOUT и STDERR
источник
Я знаю, что это очень старая тема, но в предыдущих ответах нет полной реализации Tee реального времени, написанной в пакетном режиме. Мое решение ниже - это гибридный скрипт Batch-JScript, который использует секцию JScript только для получения вывода из конвейерной команды, но обработка данных выполняется в секции Batch. Этот подход имеет то преимущество, что любой программист Batch может модифицировать эту программу в соответствии с конкретными потребностями. Эта программа также правильно обрабатывает вывод команды CLS, созданный другими пакетными файлами, то есть очищает экран при обнаружении вывода команды CLS.
источник
file.exe 2>output.txt
file.exe 2>&1|tee.bat
как показано здесь: superuser.com/questions/452763/…Я также искал такое же решение, после небольшой попытки мне удалось добиться этого в командной строке. Вот мое решение:
Он даже фиксирует любую команду PAUSE.
источник
Вот пример того, что я использовал, основываясь на одном из других ответов
источник
Что-то вроде этого должно делать то, что вам нужно?
источник
отправить вывод в консоль, добавить в журнал консоли, удалить вывод из текущей команды
источник
Это вариант предыдущего ответа от МТС, однако он добавляет некоторые функции, которые могут быть полезны для других. Вот метод, который я использовал:
set _Temp_Msg_Cmd=
^
символ моркови, так что команды не оцениваются изначально%~n0_temp.txt
который использует синтаксис расширения параметра командной строки%~n0
для получения имени пакетного файла.%~n0_log.txt
Вот последовательность команд:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Вот пример:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
Таким образом, команда может быть просто добавлена после более поздних команд в командный файл, который выглядит намного чище:
echo test message %_Temp_Msg_Cmd%
Это также может быть добавлено в конец других команд. Насколько я могу сказать, это будет работать, когда сообщения имеют несколько строк. Например, следующая команда выводит две строки, если есть сообщение об ошибке:
net use M: /D /Y %_Temp_Msg_Cmd%
источник
Это создаст файл журнала с текущей датой и временем, и вы можете использовать строки консоли во время процесса.
источник
Я использую пакетную подпрограмму с оператором for, чтобы получить вывод команды по одной строке за раз, и обе записать эту строку в файл и вывести ее на консоль.
источник
Если вы находитесь в CLI, почему бы не использовать цикл FOR, чтобы «делать» все, что вы хотите:
Отличный ресурс по Windows CMD для циклов: https://ss64.com/nt/for_cmd.html Ключевым моментом здесь является установка разделителей (разделителей), которые будут разбивать каждую строку вывода, на ничто. Таким образом, он не будет нарушен по умолчанию пустого пространства. % A - это произвольная буква, но она используется в разделе «do», чтобы ... ну что-то делать с символами, которые были проанализированы в каждой строке. В этом случае мы можем использовать амперсанды (&&) для выполнения 2-й команды echo для создания или добавления (>>) к файлу по нашему выбору. Безопаснее придерживаться этого порядка команд DO в случае, если при записи файла возникнет проблема, мы сначала по крайней мере выведем эхо на консоль. Знак (@) перед первым эхо-сигналом подавляет консоль от показа самой эхо-команды и вместо этого просто отображает результат команды, которая должна отображать символы в% a. В противном случае вы увидите:
ОБНОВЛЕНИЕ: / F пропускает пустые строки, и единственное, что нужно исправить, - это предварительно отфильтровать вывод, добавив символ в каждую строку (возможно, с номерами строк через команду find). Решение этого в CLI не быстро и не красиво. Кроме того, я не включил STDERR, поэтому здесь также фиксируются ошибки:
Перенаправление сообщений об ошибках
Символы (^) предназначены для экранирования символов после них, потому что команда представляет собой строку, которая интерпретируется, а не вводится непосредственно в командной строке.
источник
Так же, как Unix.
dir | tee a.txt
Работает ли на Windows XP, требует
mksnt
установки.Он отображается в приглашении, а также добавляется в файл.
источник
Следующее помогает, если вы хотите что-то действительно видимое на экране - даже если командный файл был перенаправлен в файл. Устройство CON может также использоваться, если оно перенаправлено в файл
Пример:
Также смотрите хорошее описание перенаправления: http://www.p-dd.com/chapter7-page14.html
источник
Вы можете найти эти команды в biterscripting ( http://www.biterscripting.com ) полезными.
источник
Это работает в режиме реального времени, но также довольно уродливо, и производительность низкая. Не очень хорошо проверено:
источник
%MYCOMMAND%
не закончится, и во многих случаях происходит сбой. Он пропускает пустые строки, строки , начинающиеся с;
неудачно с содержанием , как<space>/<TAB>
,ON
,OFF
или/?
. Но остальные могут иногда работать :-)Альтернативой является использование stdout для stderr в вашей программе:
в яве:
Затем в вашем DOS пакетном файле:
java program > log.txt
Stdout перейдет в лог-файл, а stderr (те же данные) отобразится на консоли.
источник
Я устанавливаю perl на большинство моих машин, поэтому отвечаю, используя perl: tee.pl
реж | perl tee.pl или dir | perl tee.pl dir.bat
грубый и непроверенный.
источник
Другой вариант - разделить канал, а затем перенаправить вывод так, как вам нравится.
Сохраните вышеперечисленное в файл .bat. Он также разделяет вывод текста в файловом потоке 1 на файловый поток 3, который вы можете перенаправить по мере необходимости. В приведенных ниже примерах я вызывал приведенный выше скрипт splitPipe.bat ...
источник
c:\cygwin64\bin\script.exe
и введитеcmd
и введитеexit
и введите (выходит из Cygwin's cmd.exe)exit
и введите (выходит из Cygwin's script.exe)источник