Відображення виводу командного рядка Windows та перенаправлення його у файл


371

Як я можу запустити додаток командного рядка в командному рядку Windows і одночасно відобразити та перенаправити вихід у файл?

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

Як я можу написати команду для відображення виводу та переадресації виводу у файл у командному рядку Windows, подібно до teeкоманди в Unix?


63
І будь ласка, перестаньте називати це MSDOS! Подібність між cmd.exe і цим braindead command.com є мізерною і стає меншою.
paxdiablo

4
можливий дублікат Як я можу
Джошуа Дрейк

Жоден з них не працює, якщо у вас є консольна програма, яка завантажує dll, який видає текст. Основний текст програми перенаправляється на файл, але вихід з dll не відображається і продовжує відображатися у вікні консолі. Я не знайшов способу захоплення тексту з DLL.
Брайан Райнхолд,

1
ще можна просто
передати

Що робити, якщо я використовую утиліту командного рядка і хочу переспрямувати вихід у файл у точно такому ж форматі, який відображається на екрані, я використовував youtube-dl для вилучення посилань і міг перенаправити вихід у файл txt, але його не відформатовано як ви отримаєте в підказці, у файлі його надходження як єдиний рядок.
beastboy

Відповіді:


153

Щоб розширити відповідь на Дейвор , ви можете використовувати PowerShell так:

powershell "dir | tee test.txt"

Якщо ви намагаєтесь переспрямувати висновок exe у поточному каталозі, вам потрібно використовувати .\ім'я файлу, наприклад:

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

8
Це найбільш близька відповідь: вона працює при встановленні за замовчуванням, оскільки PS вже є на більшості машин і, особливо, серверів.
Stoleg

1
Це найкраща відповідь! Простий і працює "поза коробкою"
Josh Werts

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
Чже Ху

132

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

dir > a.txt | type a.txt

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


100
Це задовольняє відповідь, але виводить дані після завершення команди dir, а не після отримання даних.
Лей Ріффер

10
він буде працювати, але ви застрягнете, якщо команда чекатиме введення від stdin.
Vitim.us

5
Мені подобається ця проста відповідь! Я виявив, що &замість а |потрібен для виведення деяких команд, наприклад, pingабо7z.exe
Уес Ларсон

Не працює для інтерактивних команд замість dir. Приклад: chkdsk /f c: > c:\Temp.txt | c:\Temp.txt. Файл системного звіту блокується іншим процесом.
Sopalajo de Arrierez

4
@lii re: handle output to stderr- Додайте 2>&1перенаправлення так, як це: dir 2>&1 > a.txt & type a.txtі у вас повинен бути stderr змішаний зі stdout.
Джессі Чизгольм

97

Існує порт Win32 teeкоманди Unix , який робить саме це. Дивіться http://unxutils.sourceforge.net/ або http://getgnuwin32.sourceforge.net/


17
Посилання вказує на реалізацію Windows для трійника команди Unix, тому воно працює в Windows.
Брайан Расмуссен

3
Так, голосування відповідь та коментар. Насправді я віддаю перевагу CygWin, оскільки в ньому є все, але деякі люди віддають перевагу інструментам, що не належать до DLL, які вони можуть вибирати та вибирати.
paxdiablo

3
Багато утиліт Unix також переносяться проектом GnuWin32, див. Gnuwin32.sourceforge.net .
ВладВ

2
UnxUtils востаннє оновлювався у 2003 році; GnuWin32 є трохи більш сучасним.
шарлатаний кіхот

9
Якщо ви, як я, намагалися знайти teeпакет GnuWin32 , ви знайдете його в gnuwin32.sourceforge.net/packages/coreutils.htm .
Nigel Touch

49

Перевірте це: wintee

Не потрібно цигуна.

Я зіткнувся і повідомив про деякі проблеми, хоча.

Крім того, ви можете перевірити unxutils, оскільки він містить трійник (і немає потреби в cygwin), але будьте обережні, що вихідні EOL такі, як UNIX.

І останнє, але не менш важливе, якщо у вас є PowerShell, ви можете спробувати Tee-Object. Введіть get-help tee-objectконсоль PowerShell для отримання додаткової інформації.


4
Чому голосування "за"? 95% відповідей тут мають одне спільне: висновок переспрямовується лише після завершення початкової команди: прочитайте коментарі. Утиліта UNIX teeвиводить в режимі реального часу. wteeмає однаковий функціонал. Якщо ви не заперечуєте над помилками, це буде добре.
Давор Йосипович

Це єдине рішення, яке працює для мене, не маючи Powershell> 4.0. Пальці вгору!
Олексій

46

@ tori3852

Я це виявив

dir > a.txt | type a.txt

не спрацювало (лише перші перші рядки з переліком режиму - підозрюють, що процес розгортання процесу, а друга частина, команда 'type' припинилася до завершення жахливого списку?), тож замість цього я використав:

dir > z.txt && type z.txt

що зробив - послідовні команди, одна виконує до початку другої.


17
Ви повинні використовувати &замість, &&якщо ви хочете, щоб typeкоманда виконувалася, навіть якщо dirкоманда не вдалася. Це корисно, коли у вашій команді була якась помилка, і ви все ще хочете побачити файл журналу на консолі. Про це див . Статтю Microsoft . Однак це має %errorlevel%намір встановити рівень помилки type(який був би 0).
ADTC

25

На жаль, такого немає.

Програми для консолі Windows мають лише одну вихідну ручку. (Ну, є два STDOUT, STDERRале це не має значення.) >Вихід, який зазвичай записується на консольну ручку, перенаправляє на ручку файлу.

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


3
teeon * 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, а також зберегти результати як у файлах1.txt, так і у файлах2.txt.

Зауважте, що способів обробки помилок вище (нічого!) Не так багато, і підтримка декількох файлів насправді може не знадобитися.


5
Хм, завантажуйте tee / cygwin задарма або купуйте MSVS з моїми важко заробленими готівкою за дивовижну маленьку програму? Це важко :-)
paxdiablo

19
Для цього вам не потрібна візуальна студія, інструменти командного рядка фактично безкоштовні. просто Google "завантажити .net sdk" для посилання (начебто пряма посилання змінюється, але Google, здається, завжди працює).
Кріс

13
Візуальна Studio Express також безкоштовна, але я все одно просто використовую для цього трійник.
Брайан Расмуссен

7
cygwin - це біль встановити. Оновлення до вас, тому що саме це я шукав.
Самаурса

1
Я не думаю, що це одночасно виводить консоль і файли?
mjaggard

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, полягає в тому, що ви насправді записуєте у два файли: один, який створюється для кожної команди / рядка (звідси один ">", який перезаписується кожен раз), а потім ви вводите цей рядок на екран ( введіть ), і, нарешті, ви вводите його ще раз і перенаправляєте його вихід, весь довгий ДОДАТОК, у свій файл журналу з ">>". Так я роблю це протягом багатьох років, хоча мені подобається простий тимчасовий файл. Я завжди робив "tmp.txt" або заспокійливі. Так, видаліть його згодом.
eduncan911

Це хороший підхід, але у мене виникли проблеми з тим, що деякі помилки не потрапили в захват Розміщення typeкоманд на окремих рядках (у підпрограмі) виправлено це, однак.
Нейт Кук

Просто те, що мені було потрібно для моєї заявки.
Алан

16

mtee - це невелика утиліта, яка дуже добре працює для цієї мети. Це безкоштовно, джерело відкрите, і воно просто працює.

Ви можете знайти його на веб- сайті http://www.commandline.co.uk .

Використовується в пакетному файлі для відображення виводу І одночасно створювати файл журналу, синтаксис виглядає так:

    someprocess | mtee /+ mylogfile.txt

Де / + означає додавати вихід.

Це передбачає, що ви скопіювали mtee у папку, яка, звичайно, є у PATH.


1
Це, здається, чекає, поки вихід завершиться також перед виведенням у файл або консоль.
mellamokb

14

Я хотів би трохи розповісти про відмінну відповідь Saxon Druce .

Як зазначено, ви можете переспрямувати вихід виконуваного файлу в поточний каталог так:

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

Тим НЕ менше, це тільки реєструє stdoutв test.txt. Він також не реєструється stderr.

Очевидним рішенням було б використовувати щось подібне:

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

Однак це не спрацює для всіх something.exes. Деякі something.exes трактуватимуть 2>&1як аргумент і не вдасться. Правильне рішення - натомість мати лише апострофи навколо something.exeта його перемикачів та аргументів, як-от так:

powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt

Я спробував це, будуючи pyqt5.7 на Windows 10, це досить мляво, вихід консолі не в режимі реального часу, можливо, він буферний? Файл журналу виглядає правильно, але
Шуман

3
Все це абсолютно неправильно. Це не працює для мене взагалі. Остання команда дає 'tee' is not recognized as an internal or external commandз очевидних причин. У 2>&1внутрішньому рядку cmd будь-який вихід на stderr викликає помилки з shellhell.
Павло П

Може бути посиланням на командлет PowerShell Tee-Object - technet.microsoft.com/en-us/library/ee177014.aspx
Бернд

9

Я погоджуюся з Брайаном Расмуссеном, порт непридатних - це найпростіший спосіб зробити це. У розділі " Пакетні файли " своїх сторінок сценаріїв Роб ван дер Вуд надає велику кількість інформації про використання команд MS-DOS та CMD. Я подумав, що він може мати власне рішення вашої проблеми, і після перекопання там я знайшов TEE.BAT , що, здається, саме це, реалізація пакетної мови MS-DOS tee. Це досить складний на вигляд пакетний файл, і моя схильність все-таки полягатиме у використанні порту unxutils.


Ця tee.bat річ виглядає приємно. Сподіваюся, що ОП це перевіряє.
Джей,

10
Зауважте, що використання TEE.BAT виведе після завершення команди, як і приклад "dir> a.txt | type a.txt", розміщений поруч.
adzm

8

Якщо у вашому середовищі Windows є вміст cygwin, ви можете використовувати:

 dir > a.txt | tail -f a.txt

7
Якщо ви збираєтесь використовувати Cygwin, він постачається з трійником.
Містер Лама

7

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

Це допоможе перенаправити як STDOUT, так і STDERR


Це не працює. Я намагався використовувати це для запуску JBoss run.bat, і він задихається під час запуску, і сервер замерзає. Є проблеми з цим методом ...
djangofan

@raja ashok, не працює для мене. Я спробував python.exe 1> file.txt 2> & 1 | тип file.txt
нео

4

Я знаю, що це дуже стара тема, але в попередніх відповідях відсутня повна реалізація Tee в реальному часі, написана в Партії. Моє рішення нижче - гібридний скрипт Batch-JScript, який використовує розділ JScript тільки для отримання виводу з команди pipeped, але обробка даних проводиться в розділі Batch. Цей підхід має перевагу в тому, що будь-який програміст Batch може модифікувати цю програму відповідно до конкретних потреб. Ця програма також правильно обробляє висновок команди CLS, що виробляється іншими файлами Batch, тобто очищає екран, коли виявляється вихід команди 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");

Будь-яким способом це може зафіксувати більш жорсткий вихід? У мене є роздратований 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.


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

Це зміна попередньої відповіді MTS, однак вона додає певної функціональності, яка може бути корисною для інших. Ось метод, який я використав:

  • Команда встановлюється у вигляді змінної, яку можна використовувати пізніше у всьому коді для виводу у вікно команди та додавання до файлу журналу, використовуючи 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%


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

Це створить файл журналу з поточним часом дат, і ви можете консольні рядки під час процесу


11
ви не двічі зателефонували в одну програму?
elcool

1

Я використовую пакетну підпрограму з оператором "для", щоб отримати команду виведення по одному рядку, і обидва записують цей рядок у файл і виводять його на консоль.

@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 поставив його всередині для), але тоді я просто закликаю свою стандартну підфункцію, щоб відлучитися до екрана і записати в журнал, тому що я використовую його протягом мого сценарію для заміни використання 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", щоб ... добре зробити щось з символами, які були проаналізовані в кожному рядку. У цьому випадку ми можемо використовувати ampersands (&&) для виконання другої команди echo для створення або додавання (>>) до обраного нами файлу. Безпечніше дотримуватися цього порядку команд DO у випадку, коли виникає проблема із записом файлу, ми, принаймні, спочатку отримаємо відлуння до консолі. Знак at (@) перед першим відлунням пригнічує показ консолі відображення самої команди echo, а замість цього просто відображає результат команди, яка повинна відображати символи у% a. Інакше ви побачите:

echo Volume in drive [x] is
Volume Windows in drive [x] is Windows

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

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

Перенаправлення повідомлень про помилки

Carets (^) є для того, щоб уникнути символів після них, оскільки команда - це рядок, який інтерпретується, на противагу цьому, вводячи його безпосередньо в командному рядку.


1

Так само, як і Unix.

dir | tee a.txt

Чи працює на Windows XP, його потрібно mksntвстановити.

Він відображається як підказки, так і додається до файлу.


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.

Ці команди можуть бути корисними для бітскриптування ( 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

6
Ні, це не в режимі реального часу, він чекає, поки %MYCOMMAND%закінчиться, і він виходить з ладу у багатьох випадках. Він пропускає порожні рядки, рядки , що починаються з ;невдало з вмістом , як <space>/<TAB>, ON, OFFабо /?. Але решта іноді можуть спрацювати :-)
jeb

0

Альтернативою є те, що в рамках вашої програми буде проходити трійник stdout:

в java:

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

Потім у вашому dos batchfile: 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

сирий і неперевірений.


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

-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та введіть (виходить із cmd.exe Cygwin)
  12. Введіть exitта введіть (виходить із Cygwin's script.exe)
  13. Дивіться вихідний екран вашої програми в текстовому файлі під назвою "typecript"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.