Отображение вывода командной строки Windows и перенаправление его в файл

371

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

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

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

Эдвард Томсон
источник
63
И, пожалуйста, перестань называть это MSDOS! Сходства между cmd.exe и этим braindead command.com ничтожны и становятся все меньше.
paxdiablo
Ничто из этого не работает, если у вас есть консольное приложение, которое загружает DLL, которая выводит текст. Основной текст приложения перенаправляется в файл, но вывод из dll не отображается и продолжает отображаться в окне консоли. Я не нашел способ захватить текст из DLL.
Брайан Рейнхольд,
1
можно было бы просто передать в файл и использовать tail ( stackoverflow.com/questions/187587/… ) для этого файла
x29a
Что если я использую утилиту командной строки и хочу перенаправить вывод в файл в том же формате, что и на экране, я использовал youtube-dl для извлечения ссылок и мог перенаправить вывод в текстовый файл, но он не отформатирован как вы попадете в подсказку, в файле она будет представлена ​​одной строкой.
beastboy

Ответы:

153

Чтобы расширить ответ Давора , вы можете использовать PowerShell следующим образом:

powershell "dir | tee test.txt"

Если вы пытаетесь перенаправить вывод exe .\-файла в текущий каталог, вам нужно использовать имя файла, например:

powershell ".\something.exe | tee test.txt"
Саксонский друс
источник
8
Это самый близкий ответ: он работает при установке по умолчанию, так как PS уже есть на большинстве машин и, особенно, на серверах.
Stoleg
1
Это лучший ответ! Просто и работает "из коробки"
Джош Вертс
3
НРАВИТСЯ :) В любом случае {powershell "ping -n 10 localhost | tee test.txt"} лучше продемонстрирует, что происходит на вечеринке
grenix
4
обратите внимание, что dirв powershell это псевдоним, Get-ChildItemкоторый не похож на внутреннюю dirкоманду cmd . Вам нужна, powershell "cmd /c dir | tee test.txt"если вам нужна внутренняя версия cmd
phuclv
8
чтобы увидеть все выходные данные, не забудьте перенаправить STDERR в STDOUT 2>&1, напримерnode 2>&1 | tee debug_log.txt
Zhe Hu
132

Мне удалось найти решение / обходной путь перенаправления вывода в файл, а затем на консоль:

dir > a.txt | type a.txt

где dir - команда, вывод которой необходимо перенаправить, a.txt - файл, в котором следует сохранить вывод.

NSPKUWCExi2pr8wVoGNk
источник
100
Это удовлетворяет ответу, но выводит данные после выполнения команды dir, а не после того, как данные будут получены.
Ли Риффель
10
это будет работать, но вы застрянете, если команда будет ждать ввода от stdin.
Vitim.us
5
Мне нравится этот простой ответ! Я обнаружил, что &вместо a |требуется для вывода некоторых команд, например pingили7z.exe
Уэс Ларсон
Не работает для интерактивных команд вместо dir. Пример: chkdsk /f c: > c:\Temp.txt | c:\Temp.txt. Файл системного отчета заблокирован другим процессом.
Сопалахо де Арриерес
4
@lii re: handle output to stderr- Добавьте 2>&1перенаправление так, чтобы это было так: dir 2>&1 > a.txt & type a.txtи вы должны смешать stderr с stdout.
Джесси Чисхолм
97

Есть порт Win32 команды Unix tee, который делает именно это. Смотрите http://unxutils.sourceforge.net/ или http://getgnuwin32.sourceforge.net/

Брайан Расмуссен
источник
17
Ссылка указывает на реализацию Windows команды Tee в Windows, поэтому она работает в Windows.
Брайан Расмуссен
3
Да, голосование за ответ и комментарий. Я бы на самом деле предпочел CygWin, так как он имеет все, но некоторые люди предпочитают не-DLL инструменты, которые они могут выбирать.
paxdiablo
3
Многие утилиты Unix также портированы проектом GnuWin32, см. Gnuwin32.sourceforge.net .
VladV
2
UnxUtils последний раз обновлялся в 2003 году; GnuWin32 немного более современен.
Квик-кихот
9
Если вы, как и я, пытались найти teeпакет GnuWin32 , вы найдете его в gnuwin32.sourceforge.net/packages/coreutils.htm .
Найджел
49

Проверьте это: wintee

Нет необходимости в Cygwin.

Я столкнулся и сообщил о некоторых проблемах.

Также вы можете проверить unxutils, потому что он содержит tee (и не нуждается в cygwin), но помните, что выходные EOL- ы здесь похожи на UNIX.

И последнее, но не менее важное: если у вас есть PowerShell, вы можете попробовать Tee-Object. Введите get-help tee-objectконсоль PowerShell для получения дополнительной информации.

Давор Йосипович
источник
4
Почему голосование против? 95% ответов здесь имеют одну общую черту: вывод перенаправляется только после завершения начальной команды: прочитайте комментарии. Утилита UNIX teeвыводит в режиме реального времени. wteeимеет такую ​​же функциональность. Если вы не возражаете против ошибок, это будет хорошо.
Давор Йосипович
Это единственное решение, работающее на меня, без Powershell> 4.0. Недурно!
Alex
46

@ tori3852

я нашел это

dir > a.txt | type a.txt

не сработало (только первые несколько строк списка dir - есть подозрение, что какой-то процесс разветвился, а во второй части команда 'type' прервалась до того, как завершился директория direct?), поэтому вместо этого я использовал

dir > z.txt && type z.txt

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

Энди Уэлч
источник
17
Вы должны использовать &вместо, &&если вы хотите, чтобы typeкоманда выполнялась, даже если dirкоманда не выполнена. Это полезно, когда в вашей команде произошла какая-то ошибка, и вы все еще хотите увидеть файл журнала на консоли. См. Статью Microsoft по этому вопросу . Однако проблема %errorlevel%заключается в том, чтобы установить уровень ошибки type(который будет равен 0).
ADTC
25

К сожалению, такого нет.

Консольные приложения Windows имеют только один дескриптор вывода. (Ну, есть два STDOUT, STDERRно это не имеет значения) >Перенаправляет вывод, обычно записываемый в дескриптор консоли, в дескриптор файла.

Если вы хотите использовать мультиплексирование, вам нужно использовать внешнее приложение, на которое вы можете перенаправить вывод. Это приложение затем может записать в файл и снова в консоль.

Даниэль Риковски
источник
3
teeна * nix это тоже отдельное приложение, а не какое-то перенаправление на оболочку
phuclv
22

Простое консольное приложение C # сделало бы трюк:

using System;
using System.Collections.Generic;
using System.IO;

namespace CopyToFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            var buffer = new char[100];
            var outputs = new List<TextWriter>();

            foreach (var file in args)
                outputs.Add(new StreamWriter(file));

            outputs.Add(Console.Out);

            int bytesRead;
            do
            {
                bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
                outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
            } while (bytesRead == buffer.Length);

            outputs.ForEach(o => o.Close());
        }
    }
}

Чтобы использовать это, вы просто передаете исходную команду в программу и указываете путь к любым файлам, которым вы хотите продублировать вывод. Например:

dir | CopyToFiles files1.txt files2.txt 

Отобразит результаты dir, а также сохранит результаты в файлах file1.txt и files2.txt.

Обратите внимание, что в способе обработки ошибок, описанном выше, не так много (ничего!), И поддержка нескольких файлов может на самом деле не требоваться.

Ричард
источник
5
Хм, скачай tee / cygwin даром или купи MSVS с моими с трудом заработанными деньгами для такой маленькой и непривлекательной программы? Это сложный вопрос :-)
paxdiablo
19
Вам не нужна визуальная студия для компиляции, инструменты командной строки на самом деле бесплатны. просто Google ". NET SDK скачать" для ссылки (прямая ссылка, кажется, меняется вокруг, но Google всегда, кажется, работает).
Крис
13
Visual Studio Express также бесплатен, но я бы все равно использовал для этого тройник.
Брайан Расмуссен
7
Cygwin - это боль в установке. Upvote для вас, потому что это то, что я искал.
Самаурса
1
Я не думаю, что это выводит на консоль и файлы одновременно?
Мьяггард
20

Это работает, хотя это немного уродливо:

dir >_ && type _ && type _ > a.txt

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

ECHO Print line to screen and log to file.  >_ && type _ && type _ >> logfile.txt

Да, вы могли бы просто повторить оператор ECHO (один раз для экрана и второй раз для перенаправления в лог-файл), но это выглядит так же плохо и является проблемой технического обслуживания. По крайней мере, так вам не нужно вносить изменения в сообщения в двух местах.

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

МТС
источник
2
Это полезно, только если вы хотите отобразить содержимое ПОСЛЕ запуска вашего процесса. И это не сложно решить.
Кристофер Пейнтер
1
Да, я думаю, это решает проблему, немного отличающуюся от того, о чем спрашивал оригинальный плакат.
МТС
1
+1 Так я всегда это делал. Я считаю, что это правильный ответ на исходный вопрос и должен быть помечен как таковой. Уловка, на которую намекает @MTS, заключается в том, что вы на самом деле пишете в два файла: по одному, который создается для каждой команды / строки (отсюда один «>», который перезаписывается каждый раз), а затем вы вводите эту строку на экран ( тип ), и, наконец, вы набираете его снова и перенаправляете его вывод, весь длинный APPENDING, в ваш файл журнала с помощью «>>». Вот как я делал это годами, хотя мне нравится простой " " временный файл. Я всегда делал "tmp.txt" или что-то в этом роде. Да, удалите его потом.
eduncan911
Это хороший подход, но у меня были проблемы с некоторыми ошибками, которые не были зафиксированы. Размещение typeкоманд в отдельных строках (в подпрограмме) исправило это.
Нейт Кук
Как раз то, что мне нужно для моего приложения.
Алан
16

mtee - небольшая утилита, которая очень хорошо работает для этой цели. Это бесплатно, источник открыт, и это просто работает.

Вы можете найти его на http://www.commandline.co.uk .

Используемый в пакетном файле для отображения выходных данных и одновременного создания файла журнала, синтаксис выглядит следующим образом:

    someprocess | mtee /+ mylogfile.txt

Где / + означает добавить вывод.

Это предполагает, что вы скопировали mtee в папку, которая находится в PATH, конечно.

отметка
источник
1
Кажется, что это ожидает завершения вывода, а затем выводит его в файл или консоль.
mellamokb
14

Я хотел бы немного рассказать о превосходном ответе саксонца Дрюса .

Как уже говорилось, вы можете перенаправить вывод исполняемого файла в текущий каталог следующим образом:

powershell ".\something.exe | tee test.txt"

Тем не менее, это только регистрирует stdoutв test.txt. Это также не входит stderr.

Очевидное решение было бы использовать что-то вроде этого:

powershell ".\something.exe 2>&1 | tee test.txt"

Тем не менее, это не будет работать для всех something.exeс. Некоторые something.exes будут интерпретировать 2>&1как аргумент и потерпят неудачу. Правильное решение - вместо этого иметь только апострофы вокруг something.exeи его переключатели и аргументы, вот так:

powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt
ア リ ス タ ー
источник
Я пробовал это при сборке pyqt5.7 на windows 10, он довольно вялый, вывод на консоль не в реальном времени, может быть, он буферизован? хотя лог-файл выглядит корректно
Shuman
3
Все это совершенно неправильно. Это не работает для меня. Последняя команда дает 'tee' is not recognized as an internal or external commandпо понятным причинам. С 2>&1внутренней CMD линии любой выход на стандартный вывод ошибок приводит к ошибкам из PowerShell.
Павел П
Может быть ссылкой на командлет PowerShell Tee-Object - technet.microsoft.com/en-us/library/ee177014.aspx
Бернд,
9

Я согласен с Брайаном Расмуссеном, порт unxutils - самый простой способ сделать это. В разделе « Пакетные файлы » своих страниц сценариев Роб ван дер Вуд предоставляет обширную информацию об использовании команд MS-DOS и CMD. Я подумал, что у него может быть собственное решение вашей проблемы, и, покопавшись там, я нашел TEE.BAT , который, похоже, является реализацией пакетного языка MS-DOS. Это довольно сложный пакетный файл, и я по-прежнему хотел бы использовать порт unxutils.

Стив Крейн
источник
Эта штука с мишенями выглядит красиво. Надеюсь, что ОП проверит это.
Джей
10
Обратите внимание, что использование TEE.BAT будет выводить после завершения команды, так же, как пример "dir> a.txt | type a.txt", размещенный поблизости.
Adzm
8

Если у вас есть Cygwin в вашем пути среды Windows, вы можете использовать:

 dir > a.txt | tail -f a.txt
jkdba
источник
7
Если вы собираетесь использовать Cygwin, он поставляется с тройником.
Мистер Лама
7

dir 1>a.txt 2>&1 | type a.txt

Это поможет перенаправить STDOUT и STDERR

rashok
источник
Это не работает Я попытался использовать это для запуска JBoss run.bat, и он задыхается во время запуска, и сервер зависает. Есть проблемы с этим методом ...
djangofan
@raja Ashok, не работает для меня. Я пробовал python.exe 1> file.txt 2> & 1 | введите file.txt
нео
4

Я знаю, что это очень старая тема, но в предыдущих ответах нет полной реализации Tee реального времени, написанной в пакетном режиме. Мое решение ниже - это гибридный скрипт Batch-JScript, который использует секцию JScript только для получения вывода из конвейерной команды, но обработка данных выполняется в секции Batch. Этот подход имеет то преимущество, что любой программист Batch может модифицировать эту программу в соответствии с конкретными потребностями. Эта программа также правильно обрабатывает вывод команды CLS, созданный другими пакетными файлами, то есть очищает экран при обнаружении вывода команды CLS.

@if (@CodeSection == @Batch) @then


@echo off
setlocal EnableDelayedExpansion

rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version
rem Antonio Perez Ayala

rem The advantage of this program is that the data management is written in Batch code,
rem so any Batch programmer may modify it to fit their own needs.
rem As an example of this feature, CLS command is correctly managed

if "%~1" equ "" (
   echo Duplicate the Stdout output of a command in the screen and a disk file
   echo/
   echo anyCommand ^| APATee teeFile.txt [/A]
   echo/
   echo If /A switch is given, anyCommand output is *appended* to teeFile.txt
   goto :EOF
)

if "%2" equ ":TeeProcess" goto TeeProcess

rem Get the output of CLS command
for /F %%a in ('cls') do set "cls=%%a"

rem If /A switch is not provided, delete the file that receives Tee output
if /I "%~2" neq "/A" if exist %1 del %1

rem Create the semaphore-signal file and start the asynchronous Tee process
echo X > Flag.out
if exist Flag.in del Flag.in
Cscript //nologo //E:JScript "%~F0" | "%~F0" %1 :TeeProcess
del Flag.out
goto :EOF

:TeeProcess
   rem Wait for "Data Available" signal
   if not exist Flag.in goto TeeProcess
   rem Read the line sent by JScript section
   set line=
   set /P line=
   rem Set "Data Read" acknowledgement
   ren Flag.in Flag.out
   rem Check for the standard "End Of piped File" mark
   if "!line!" equ ":_EOF_:" exit /B
   rem Correctly manage CLS command
   if "!line:~0,1!" equ "!cls!" (
      cls
      set "line=!line:~1!"
   )
   rem Duplicate the line in Stdout and the Tee output file
   echo(!line!
   echo(!line!>> %1
goto TeeProcess


@end


// JScript section

var fso = new ActiveXObject("Scripting.FileSystemObject");
// Process all lines of Stdin
while ( ! WScript.Stdin.AtEndOfStream ) {
   // Read the next line from Stdin
   var line = WScript.Stdin.ReadLine();
   // Wait for "Data Read" acknowledgement
   while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(10);
   }
   // Send the line to Batch section
   WScript.Stdout.WriteLine(line);
   // Set "Data Available" signal
   fso.MoveFile("Flag.out", "Flag.in");
}
// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(10);
}
// Send the standard "End Of piped File" mark
WScript.Stdout.WriteLine(":_EOF_:");
fso.MoveFile("Flag.out", "Flag.in");
Aacini
источник
В любом случае это может захватить вывод stderr? У меня есть раздражающий exe-файл, который выводит все в стандартный поток ошибок (т. Е. Чтобы вывести в файл в обычном режиме, вы бы это сделалиfile.exe 2>output.txt
Марк Девен,
Я понял. Вы можете сделать это, используя, file.exe 2>&1|tee.batкак показано здесь: superuser.com/questions/452763/…
Марк Девен
4

Я также искал такое же решение, после небольшой попытки мне удалось добиться этого в командной строке. Вот мое решение:

@Echo off
for /f "Delims=" %%a IN (xyz.bat) do (
%%a > _ && type _ && type _ >> log.txt
)
@Echo on

Он даже фиксирует любую команду PAUSE.

Koder101
источник
3

Вот пример того, что я использовал, основываясь на одном из других ответов

@echo off
REM SOME CODE
set __ERROR_LOG=c:\errors.txt
REM set __IPADDRESS=x.x.x.x

REM Test a variable
if not defined __IPADDRESS (
     REM Call function with some data and terminate
     call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED
     goto :EOF
)

REM If test happens to be successful, TEE out a message and end script.
call :TEE Script Ended Successful
goto :EOF


REM THE TEE FUNCTION
:TEE
for /f "tokens=*" %%Z in ("%*") do (
     >  CON ECHO.%%Z
     >> "%__ERROR_LOG%" ECHO.%%Z
     goto :EOF
)
Эд Радке
источник
3

Что-то вроде этого должно делать то, что вам нужно?

%DATE%_%TIME% > c:\a.txt & type c:\a.txt
ipconfig >> c:\a.txt & type c:\a.txt
ping localhost >> c:\a.txt & type c:\a.txt
pause
Ричард К
источник
Почти, но он не отображается одновременно - если у вас есть долгосрочное задание, вы не получите никаких результатов в течение длительного времени.
JustAMartin
3

отправить вывод в консоль, добавить в журнал консоли, удалить вывод из текущей команды

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1
Деннис
источник
8
Не хочешь объяснить, что здесь происходит?
Джон Деметриу
2

Это вариант предыдущего ответа от МТС, однако он добавляет некоторые функции, которые могут быть полезны для других. Вот метод, который я использовал:

  • Команда задается как переменная, которую можно использовать позже в коде для вывода в командное окно и добавления в файл журнала, используя set _Temp_Msg_Cmd=
    • команда избежала перенаправления, используя ^символ моркови, так что команды не оцениваются изначально
  • Создается временный файл с именем файла, похожим на вызываемый запускаемый пакетный файл, %~n0_temp.txtкоторый использует синтаксис расширения параметра командной строки %~n0 для получения имени пакетного файла.
  • Вывод добавляется в отдельный файл журнала %~n0_log.txt

Вот последовательность команд:

  1. Вывод и сообщения об ошибках отправляются во временный файл ^> %~n0_temp.txt 2^>^&1
  2. В этом случае содержимое временного файла:
    • добавлен в лог-файл ^& type %~n0_temp.txt ^>^> %~n0_log.txt
    • вывод в командное окно ^& type %~n0_temp.txt
  3. Временный файл с сообщением удален ^& 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%

ClearBlueSky85
источник
1
@echo on

set startDate=%date%
set startTime=%time%

set /a sth=%startTime:~0,2%
set /a stm=1%startTime:~3,2% - 100
set /a sts=1%startTime:~6,2% - 100


fullprocess.bat > C:\LOGS\%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat

Это создаст файл журнала с текущей датой и временем, и вы можете использовать строки консоли во время процесса.

7thSphere
источник
11
Разве вы не вызываете одну и ту же программу дважды с этим?
elcool
1

Я использую пакетную подпрограмму с оператором 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
Коди Барнс
источник
Я делаю то же самое, когда пытаюсь захватить выходные данные из команды (IE помещает ее внутрь для for), но затем я просто вызываю свою стандартную подфункцию, чтобы выводить ее на экран и записывать в журнал, потому что я использую ее по всему сценарию вместо использования echo , Не уверен, почему это получило отрицательный отзыв от других, поэтому я проголосовал за него.
Бен Персоник
1

Если вы находитесь в 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. В противном случае вы увидите:

echo Громкость на диске [x] - Windows
Громкость на диске [x] - Windows

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

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

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

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

Должен был спросить
источник
1

Так же, как Unix.

dir | tee a.txt

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

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

user2346926
источник
0

Следующее помогает, если вы хотите что-то действительно видимое на экране - даже если командный файл был перенаправлен в файл. Устройство 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

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

Вы можете найти эти команды в biterscripting ( 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

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

@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
djangofan
источник
6
Нет, это не настоящее время, оно ждет, пока %MYCOMMAND%не закончится, и во многих случаях происходит сбой. Он пропускает пустые строки, строки , начинающиеся с ;неудачно с содержанием , как <space>/<TAB>, ON, OFFили /?. Но остальные могут иногда работать :-)
Джеб
0

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

в яве:

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

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

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

Координатор
источник
0

Я устанавливаю 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;

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

грубый и непроверенный.

DannyK
источник
0

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

    @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
user3726414
источник
-1
  1. https://cygwin.com/install
  2. Нажмите на ссылку "setup-x86_.exe"
  3. Запустите установщик
  4. На ~ 2-й странице выберите «зеркало» для загрузки (я искал домен .edu)
  5. Я сказал хорошо стандартным опциям
  6. Cygwin быстро закончил установку
  7. Открыть cmd
  8. Введите c:\cygwin64\bin\script.exeи введите
  9. Введите cmdи введите
  10. Запустите вашу программу
  11. Введите exitи введите (выходит из Cygwin's cmd.exe)
  12. Введите exitи введите (выходит из Cygwin's script.exe)
  13. Смотрите вывод на экран вашей программы в текстовом файле с именем «машинопись»
Джозеф Хансен
источник