Как эхо и отправить вывод консоли в файл в bat script?
У меня есть пакет script, который выполняет задачу и отправляет результат в текстовый файл. Есть ли способ показать вывод в окне консоли?
Пример:
c:\Windows>dir > windows-dir.txt
Есть ли способ показать вывод dir
в окне консоли, а также поместить его в текстовый файл?
Ответы
Ответ 1
Нет, вы не можете с чистым перенаправлением.
Но с некоторыми трюками (например, tee.bat) вы можете.
Я пытаюсь объяснить перенаправление немного.
Вы перенаправляете один из десяти потоков с помощью > файла или <файла
Это неважно, если перенаправление происходит до или после команды, поэтому эти две строки почти одинаковы.
dir > file.txt
> file.txt dir
Перенаправление в этом примере является всего лишь ярлыком для 1>, это означает, что поток 1 (STDOUT) будет перенаправлен.
Таким образом, вы можете перенаправить любой поток с добавлением числа, например 2> err.txt, и также разрешено перенаправлять несколько потоков в одну строку.
dir 1> files.txt 2> err.txt 3> nothing.txt
В этом примере "стандартный вывод" будет помещен в файл files.txt, все ошибки будут в файле err.txt, а stream3 - в none.txt(DIR не использует поток 3).
Stream0 - это STDIN
Stream1 - это STDOUT
Stream2 - это STDERR
Stream3-9 не используются
Но что произойдет, если вы попытаетесь перенаправить один и тот же поток несколько раз?
dir > files.txt > two.txt
"Может быть только один", и он всегда последний!
Так что он равен dir> two.txt
Хорошо, есть одна дополнительная возможность, перенаправление потока в другой поток.
dir 1>files.txt 2>&1
2> & 1 перенаправляет stream2 в stream1, а 1> files.txt перенаправляет все в files.txt.
Порядок важен здесь!
dir ... 1>nul 2>&1
dir ... 2>&1 1>nul
разные. Первый перенаправляет все (STDOUT и STDERR) в NUL,
но вторая строка перенаправляет STDOUT в NUL и STDERR в "пустой" STDOUT.
В качестве одного из выводов очевидно, что примеры Otávio Décio и andynormancx не работают.
command > file >&1
dir > file.txt >&2
Оба пытаются перенаправить stream1 два раза, но "может быть только один", и он всегда последний.
Итак, вы получаете
command 1>&1
dir 1>&2
И в первом примере перенаправление stream1 на stream1 не разрешено (и не очень полезно).
Надеюсь, поможет.
Ответ 2
Просто используйте версию Windows команды tee (см. http://unxutils.sourceforge.net) следующим образом:
mycommand > tee outpu_file.txt
Если вам также нужен вывод STDERR, используйте следующие.
2>&1
объединяет выход STDERR в STDOUT (основной поток).
mycommand 2>&1 | tee output_file.txt
Ответ 3
Если вам не нужен вывод в режиме реального времени (т.е. когда программа записывает его), вы можете добавить
type windows-dir.txt
после этой строки.
Ответ 4
Решение, которое сработало для меня, было: dir > a.txt | введите a.txt.
Ответ 5
Да, есть способ показать один вывод команды на консоли (экране) и в файле. Используя ваш пример, используйте...
@ECHO OFF
FOR /F "tokens=*" %%I IN ('DIR') DO ECHO %%I & ECHO %%I>>windows-dir.txt
Подробное объяснение:
Команда 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
Ответ 6
command > file >&1
Ответ 7
Если вы хотите добавить вместо замены выходной файл, вы можете использовать
dir 1>> files.txt 2>> err.txt
или
dir 1>> files.txt 2>>&1
Ответ 8
Мне нравится отвечать на вопрос, но для меня было не так тривиально загружаться как wintee, который также является открытым исходным кодом и только дает функциональность тройника (полезно, если вы просто хотите использовать тэ, а не весь набор утилит unix). Я узнал об этом из ответа davor на Отображение вывода командной строки Windows и перенаправление ее в файл, где вы также найдете ссылку на утилиты unix.
Ответ 9
Моим вариантом было следующее:
Создайте подпрограмму, которая принимает сообщение, и автоматизирует процесс отправки его на консоль и файл журнала.
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
Если вы добавите переменную в сообщение, обязательно удалите кавычки в ней перед отправкой ее в подпрограмму или она может ввернуть вашу партию.
Конечно, это работает только для эха.
Ответ 10
Я сделал простую консоль С#, которая может обрабатывать вывод в реальном времени как на экран 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 tee
foo | tee xxx.log
А вот репозиторий, в который входит Tee.exe, если у вас нет инструмента для компиляции https://github.com/iamshiao/Tee
Ответ 11
Решение, предоставляемое "Tomas R", отлично подходит для вопроса OP и доступно для него.
Try:
chkdsk c: > output.txt | type output.txt
Выход этой команды включает процент завершения, который последовательно выводится в файл, поэтому он будет выглядеть немного беспорядочным (т.е. текст будет добавлен по мере его продвижения). Это не происходит с битами, которые выводятся на STDOUT (экран). Так будет, если вы просто выполните ту же команду без перенаправления.