Как я могу эхо и отправить вывод консоли в файл в сценарии bat?
у меня есть пакетный скрипт, который выполняет задачу и отправляет вывод в текстовый файл. Есть ли способ показать вывод в окне консоли?
Например:
c:Windows>dir > windows-dir.txt
есть ли способ иметь выход dir отобразить в окне консоли, а также поместить его в текстовый файл?
11 ответов:
отредактированный бит >> tldr; нет, вы не можете.
Я пытаюсь объяснить перенаправление немного.
вы перенаправляете один из десяти потоков с > file или
Неважно, если перенаправление происходит до или после команды, так что эти две линии почти одинаковы.dir > file.txt > file.txt dirперенаправление в этом примере является только ярлыком для 1>, это означает, что поток 1 (STDOUT) будет переориентированный.
Таким образом, вы можете перенаправить любой поток с добавлением числа как 2 > err.txt и это также позволяет перенаправлять несколько потоков в одной строке.dir 1> files.txt 2> err.txt 3> nothing.txtв этом примере "стандартный вывод" будет идти в файлы.txt, все ошибки будут в err.txt и stream3 уйдут в никуда.txt (DIR не использует поток 3).
Stream0-это STDIN
Потоке stream1 является stdout
Stream2 является стандартной ошибки
Stream3-9 не используетсяно что произойдет, если вы попытаетесь перенаправить один и тот же поток несколько раз?
dir > files.txt > two.txt"может быть только один", и это всегда последний!
Так что он равен реж > два.txtОК, Есть одна дополнительная возможность, перенаправление потока в другой поток.
dir 1>files.txt 2>&12>&1 перенаправляет stream2 в stream1 и 1>файлы.txt перенаправляет все файлы.txt.
Порядок здесь важен!dir ... 1>nul 2>&1 dir ... 2>&1 1>nulразные. Первый перенаправляет все (STDOUT и STDERR) на NUL,
но вторая строка перенаправляет стандартный вывод в Nul и stderr в "пустой" экран.в качестве одного из выводов очевидно, почему примеры Otávio Décio и andynormancx не могут работать.
command > file >&1 dir > file.txt >&2оба пытаются перенаправить stream1 два раза, но "может быть только один", и это всегда последний один.
Так вы получитеcommand 1>&1 dir 1>&2и в первом примере перенаправление stream1 в stream1 не допускается (и не очень полезно).
надеюсь, что это помогает.
просто используйте версию Windows команды Unix tee (найдено из http://unxutils.sourceforge.net) таким образом:
mycommand > tee outpu_file.txtЕсли Вам также нужен выход STDERR, то используйте следующее.
Элемент2>&1объединяет вывод STDERR в STDOUT (основной поток).mycommand 2>&1 | tee output_file.txt
Если вам не нужен вывод в реальном времени (т. е. как программа пишет его), вы можете добавить
type windows-dir.txtпосле этой строки.
решение, которое сработало для меня было: реж. > a.txt / тип a.txt.
Да, есть способ показать вывод одной команды на консоли (экране) и в файле. Используя Ваш пример, используйте...
@ECHO OFF FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txtподробное описание:
The
FORкоманда анализирует вывод команды или текста в переменную, на которую можно ссылаться несколько раз.для команды, например
DIR /B, заключить в одинарные кавычки, как показано в примере ниже. ЗаменитеDIR /Bтекст с желаемым команда.FOR /F "tokens=*" %%I IN ('DIR /B') DO ECHO %%I & ECHO %%I>>FILE.TXTдля отображения текста, заключите текст в двойные кавычки, как показано в примере ниже.
FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ECHO %%I & ECHO %%I>>FILE.TXT... И с упаковкой линии...
FOR /F "tokens=*" %%I IN ("Find this text on console (screen) and in file") DO ( ECHO %%I & ECHO %%I>>FILE.TXT )если у вас есть время, когда вы хотите выводить только на консоль (экран), а другие времена отправляются только в файл, а другие времена отправляются в оба, укажите предложение "DO" цикла FOR с помощью переменной, как показано ниже с
%TOECHOWHERE%.@ECHO OFF FOR %%I IN (TRUE FALSE) DO ( FOR %%J IN (TRUE FALSE) DO ( SET TOSCREEN=%%I & SET TOFILE=%%J & CALL :Runit) ) GOTO :Finish :Runit REM Both TOSCREEN and TOFILE get assigned a trailing space in the FOR loops REM above when the FOR loops are evaluating the first item in the list, REM "TRUE". So, the first value of TOSCREEN is "TRUE " (with a trailing REM space), the second value is "FALSE" (no trailing or leading space). REM Adding the ": =" text after "TOSCREEN" tells the command processor to REM remove all spaces from the value in the "TOSCREEN" variable. IF "%TOSCREEN: =%"=="TRUE" ( IF "%TOFILE: =%"=="TRUE" ( SET TEXT=On screen, and in "FILE.TXT" SET TOECHOWHERE="ECHO %%I & ECHO %%I>>FILE.TXT" ) ELSE ( SET TEXT=On screen, not in "FILE.TXT" SET TOECHOWHERE="ECHO %%I" ) ) ELSE ( IF "%TOFILE: =%"=="TRUE" ( SET TEXT=Not on screen, but in "FILE.TXT" SET TOECHOWHERE="ECHO %%I>>FILE.txt" ) ELSE ( SET TEXT=Not on screen, nor in "FILE.TXT" SET TOECHOWHERE="ECHO %%I>NUL" ) ) FOR /F "tokens=*" %%I IN ("%TEXT%") DO %TOECHOWHERE:~1,-1% GOTO :eof :Finish ECHO Finished [this text to console (screen) only]. PAUSE
Если вы хотите добавить вместо замены выходного файла, вы можете использовать
dir 1>> files.txt 2>> err.txtили
dir 1>> files.txt 2>>&1
Мне нравится ответ atn, но это было не так тривиально для меня, чтобы загрузить как wintee, который также является открытым исходным кодом и дает только функциональность tee (полезно, если вы просто хотите tee, а не весь набор утилит unix). Я узнал об этом из ответа Давора на отображение вывода командной строки Windows и перенаправление его в файл, где вы также найдете ссылку на утилиты Unix.
мой вариант был такой:
создайте подпрограмму, которая принимает сообщение и автоматизирует процесс его отправки в консоль и файл журнала.
setlocal set logfile=logfile.log call :screenandlog "%DATE% %TIME% This message goes to the screen and to the log" goto :eof :screenandlog set message=%~1 echo %message% & echo %message% >> %logfile% exit /bЕсли вы добавляете переменную в сообщение, обязательно удалите кавычки в нем перед отправкой его в подпрограмму или он может завинтить ваш пакет. Конечно, это работает только для Эха.
Я сделал простую консоль C#, которая может обрабатывать вывод в реальном времени как на экран cmd, так и на журнал
class Tee { static int Main(string[] args) { try { string logFilePath = Path.GetFullPath(args[0]); using (StreamWriter writer = new StreamWriter(logFilePath, true)) { for (int value; (value = Console.In.Read()) != -1;) { var word = Char.ConvertFromUtf32(value); Console.Write(word); writer.Write(word); } } } catch (Exception) { return 1; } return 0; } }использование пакетного файла совпадает с тем, как вы используете Unix
teefoo | tee xxx.logи вот репозиторий, который включает в себя тройник.exe в случае, если у вас нет инструмента для компиляции https://github.com/iamshiao/Tee
решение, предоставленное "Tomas R", идеально подходит для вопроса OP, и оно изначально доступно.
попробовать: chkdsk c: > выход.выход txt | type.txt
вывод этой команды включает в себя процент завершения, который последовательно выводится в файл, поэтому он будет выглядеть немного беспорядочным (т. е. текст будет добавлен по мере его выполнения). Это не происходит с битами, которые выводятся на STDOUT (экран). Это как если бы вы просто делаете ту же команду без перенаправления.
Comments