Как эхо и отправить вывод консоли в файл в сценарии bat?

у меня есть пакетный скрипт, который выполняет задачу и отправляет вывод в текстовый файл. Есть ли способ показать вывод в окне консоли?

Например:

c:Windows>dir > windows-dir.txt

есть ли способ получить вывод dir отобразить в окне консоли, а также поместить его в текстовый файл?

11 ответов


отредактированный бит >> tldr; нет, вы не можете.

Я пытаюсь объяснить перенаправление немного.

вы перенаправляете один из десяти потоков с > или
Это неважно, если перенаправление происходит до или после команды, таким образом, эти две линии почти одинаковы.

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 - это STDERR
Stream3-9 не используется

но что произойдет, если вы попытаетесь перенаправить один и тот же поток несколько раз?

dir > files.txt > two.txt

"может быть только один", и это всегда последний!
Таким образом, он равен реж > два.txt

ОК, Есть одна дополнительная возможность, перенаправление потока в другой поток.

dir 1>files.txt 2>&1 

2>&1 перенаправляет stream2 в stream1 и 1>файлы.txt перенаправляет все файлы.txt.
Здесь важен порядок!

dir ... 1>nul 2>&1
dir ... 2>&1 1>nul

разные. Первый перенаправляет все (STDOUT и STDERR) на NUL,
но вторая строка перенаправляет STDOUT на NUL и STDERR на "пустой" STDOUT.

как один вывод, очевидно, почему примеры Отавио Декио и 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, то используйте следующее.
The 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

подробное описание:

на 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

command > file >&1

Если вы хотите добавить вместо замены выходного файла, вы можете использовать

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 и log

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

и вот репозиторий, который включает в себя тройник.exe в случае, если у вас нет инструмента для компиляции https://github.com/iamshiao/Tee


решение, предоставленное "Tomas R", идеально подходит для вопроса OP и изначально доступно.

попробовать: chkdsk c: > выход.txt / тип вывода.txt

вывод этой команды включает в себя процент завершения, который последовательно выводится в файл, поэтому он будет выглядеть немного беспорядочно (т. е. текст будет добавлен по мере его выполнения). Это не происходит с битами, которые получают вывод в STDOUT (экран). Это как если бы вы просто делаете ту же команду без перенаправления.