Отображение вывода командной строки Windows и перенаправление его в файл - PullRequest
334 голосов
/ 28 апреля 2009

Как я могу запустить приложение командной строки в командной строке Windows и одновременно выводить и перенаправлять вывод в файл?

Если, например, я должен был запустить команду dir > test.txt, это перенаправит вывод в файл с именем test.txt без отображения результатов.

Как можно написать команду для отображения вывода и перенаправить вывод в файл в командной строке Windows, аналогично команде tee в Unix?

Ответы [ 30 ]

1 голос
/ 06 февраля 2019

Если вы используете CLI, почему бы не использовать цикл FOR, чтобы «делать» все, что вы хотите:

for /F "delims=" %a in ('dir') do @echo %a && echo %a >> output.txt

Отличный ресурс в Windows CMD для циклов: https://ss64.com/nt/for_cmd.html Ключевым моментом здесь является установка разделителей (разделителей), которые будут разбивать каждую строку вывода, на ничто. Таким образом, он не будет нарушен по умолчанию пустого пространства. % A - это произвольная буква, но она используется в разделе "do", чтобы ... ну что-то делать с символами, которые были проанализированы в каждой строке. В этом случае мы можем использовать амперсанды (&&) для выполнения 2-й команды echo для создания или добавления (>>) к файлу по нашему выбору. Безопаснее придерживаться этого порядка команд DO в случае, если при записи файла возникнет проблема, мы сначала по крайней мере выведем эхо на консоль. Знак (@) перед первым эхо-сигналом подавляет консоль от показа самой эхо-команды и вместо этого просто отображает результат команды, которая должна отображать символы в% a. В противном случае вы увидите:

объем эха на диске [x] для Windows
Объем на диске [x] для Windows

UPDATE: / F пропускает пустые строки, и единственное исправление - предварительная фильтрация выходных данных с добавлением символа в каждую строку (возможно, с номерами строк через команду find). Решение этого в CLI не быстро и не красиво. Кроме того, я не включил STDERR, поэтому здесь также фиксируются ошибки:

for /F "delims=" %a in ('dir 2^>^&1') do @echo %a & echo %a >> output.txt

Перенаправление сообщений об ошибках

Символы (^) предназначены для того, чтобы экранировать символы после них, потому что команда представляет собой строку, которая интерпретируется, а не вводится непосредственно в командной строке.

1 голос
/ 28 февраля 2014

Я использую пакетную подпрограмму с оператором for, чтобы получить вывод команды по одной строке за раз, и обе записать эту строку в файл и вывести ее на консоль.

@echo off
set logfile=test.log

call :ExecuteAndTee dir C:\Program Files

Exit /B 0

:ExecuteAndTee
setlocal enabledelayedexpansion
echo Executing '%*'
  for /f "delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)
endlocal
Exit /B 0
0 голосов
/ 08 июля 2009

Следующее помогает, если вы хотите, чтобы что-то действительно было видно на экране - даже если пакетный файл был перенаправлен в файл. Устройство CON может также использоваться, если оно перенаправлено в файл

Пример:

ECHO first line on normal stdout. maybe redirected
ECHO second line on normal stdout again. maybe redirected
ECHO third line is to ask the user. not redirected  >CON
ECHO fourth line on normal stdout again. maybe redirected

Также см. Хорошее описание перенаправления: http://www.p -dd.com / chapter7-page14.html

0 голосов
/ 11 января 2010

Как отобразить и перенаправить вывод в файл. Предположим, если я использую DOS команда, dir> test.txt, эта команда перенаправит вывод в файл test.txt без отображения результатов. как написать команду для отображения вывода и перенаправить вывод в файл, используя DOS, т.е. командная строка Windows, а не в UNIX / LINUX.

Вы можете найти эти команды в битрейскрипте (http://www.biterscripting.com) полезными.

var str output
lf > $output
echo $output                            # Will show output on screen.
echo $output > "test.txt"               # Will write output to file test.txt.
system start "test.txt"                 # Will open file test.txt for viewing/editing.
0 голосов
/ 19 февраля 2014

Я устанавливаю Perl на большинство своих машин, поэтому отвечаю с помощью perl: tee.pl

my $file = shift || "tee.dat";
open $output, ">", $file or die "unable to open $file as output: $!";
while(<STDIN>)
{
    print $_;
    print $output $_;
}
close $output;

dir | perl tee.pl или же реж | perl tee.pl dir.bat

сырая и непроверенная.

0 голосов
/ 03 мая 2013

Так же, как unix.

dir | tee a.txt

Работает ли в Windows XP, требуется mksnt установлен.

Отображается в приглашении, а также добавляется в файл.

0 голосов
/ 10 декабря 2018

попробуйте это:
dir> test.txt и введите test.txt

0 голосов
/ 20 сентября 2012

Это работает в режиме реального времени, но также довольно уродливо, и производительность низкая. Не очень хорошо проверено:

@echo off
cls
SET MYCOMMAND=dir /B
ECHO File called 'test.bat' > out.txt
for /f "usebackq delims=" %%I in (`%MYCOMMAND%`) do (
  ECHO %%I
  ECHO %%I >> out.txt
) 
pause
0 голосов
/ 07 мая 2019

Другой вариант - разделить трубу, а затем перенаправить вывод так, как вам нравится.

    @echo off
    for /f "tokens=1,* delims=:" %%P in ('findstr /n "^"') do (
      echo.%%Q
      echo.%%Q>&3
    )
    @exit/b %errorlevel%

Сохраните вышеперечисленное в файл .bat. Он также разделяет вывод текста в файловом потоке 1 на файловый поток 3, который вы можете перенаправить по мере необходимости. В приведенных ниже примерах я вызывал приведенный выше скрипт splitPipe.bat ...

    dir | splitPipe.bat  1>con  2>&1  3>my_stdout.log

    splitPipe.bat 2>nul < somefile.txt
0 голосов
/ 23 ноября 2012

Альтернативой является использование stdout для stderr в вашей программе:

в Java:

System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));

Затем, в вашем пакетном файле: java program > log.txt

Стандартный вывод перейдет в файл журнала, а стандартный вывод (те же данные) отобразится на консоли.

...