424

Windowsコマンドプロンプトでコマンドラインアプリケーションを実行し、出力を表示すると同時にファイルにリダイレクトするにはどうすればよいですか?

たとえば、コマンドを実行すると、結果を表示せずにdir > test.txt呼び出されたファイルに出力がリダイレクトされますtest.txt

How could I write a command to display the output and redirect output to a file in the Windows command prompt, similar to the tee command on Unix?

4

32 に答える 32

194

davor's answerを拡張するには、次のように PowerShell を使用できます。

powershell "dir | tee test.txt"

現在のディレクトリでexeの出力をリダイレクトしようとしている場合は.\、ファイル名で使用する必要があります。

powershell ".\something.exe | tee test.txt"
于 2013-12-31T08:59:47.527 に答える
142

出力をファイルにリダイレクトしてからコンソールにリダイレクトする解決策/回避策を見つけることができまし

dir > a.txt | type a.txt

ここで、dirは出力をリダイレクトする必要があるコマンドで、a.txtは出力を保存するファイルです。

于 2009-07-17T06:59:04.813 に答える
106

teeまさにそれを行う Unix コマンドの Win32 ポートがあります。http://unxutils.sourceforge.net/またはhttp://getgnuwin32.sourceforge.net/を参照してください。

于 2009-04-28T06:41:28.910 に答える
58

これをチェックしてください:ウィンティー

Cygwinは必要ありません。

ただし、いくつかの問題に遭遇して報告しました。

また、 tee が含まれている (そして cygwin は必要ない) unxutilsをチェックすることもできますが、ここでは出力 EOL が UNIX に似ていることに注意してください。

最後になりましたが、PowerShell を使用している場合は、Tee-Object を試すことができます。詳細については、 PowerShellget-help tee-objectコンソールに入力してください。

于 2012-09-15T14:57:49.803 に答える
50

@ tori3852

見つけた

dir > a.txt | type a.txt

動作しませんでした(dirリストの最初の数行のみ-あ​​る種のプロセスフォークが疑われ、2番目の部分は「type」コマンドが悲惨なリストが完了する前に終了しましたか?)、代わりに次を使用しました:

dir > z.txt && type z.txt

これは-シーケンシャルコマンドで、1つは2つ目が開始する前に完了します。

于 2011-02-02T05:25:18.113 に答える
27

残念ながらそのようなことはありません。

Windows コンソール アプリケーションには、1 つの出力ハンドルしかありません。(まあ、2 つありますがSTDOUTSTDERRここでは関係ありません) は>、通常はコンソール ハンドルに書き込まれる出力をファイル ハンドルにリダイレクトします。

ある種の多重化が必要な場合は、出力を転送できる外部アプリケーションを使用する必要があります。その後、このアプリケーションはファイルとコンソールに再び書き込むことができます。

于 2009-04-28T06:48:20.733 に答える
24

シンプルな 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 の結果を表示し、その結果を files1.txt と files2.txt の両方に保存します。

上記のエラー処理の方法にはあまり (何も!) なく、複数のファイルをサポートする必要がないことに注意してください。

于 2009-04-28T07:01:15.023 に答える
21

少し醜いですが、これは機能します:

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

ステートメントごとに機能するため、追加にも使用できるという点で、他のソリューションのいくつかよりも少し柔軟性があります。メッセージをログに記録して表示するために、バッチファイルでこれをかなり使用します。

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

はい、ECHO ステートメントを繰り返すこともできます (1 回は画面で、2 回目はログファイルへのリダイレクト)。少なくともこの方法では、2 つの場所でメッセージを変更する必要はありません。

_ は単なる短いファイル名であるため、バッチ ファイルの最後で必ず削除する必要があります (バッチ ファイルを使用している場合)。

于 2011-03-17T01:49:32.033 に答える
18

mtee は、この目的に非常に適した小さなユーティリティです。それは無料で、ソースはオープンで、ただ動くだけです。

http://www.commandline.co.ukで見つけることができ ます。

出力を表示し、同時にログ ファイルを作成するためにバッチ ファイルで使用されます。構文は次のようになります。

    someprocess | mtee /+ mylogfile.txt

/+ は、出力を追加することを意味します。

もちろん、これは mtee を PATH にあるフォルダーにコピーしたことを前提としています。

于 2011-10-21T20:36:05.677 に答える
10

Windows 環境のパスに cygwin がある場合は、次を使用できます。

 dir > a.txt | tail -f a.txt
于 2014-05-16T13:12:25.640 に答える
10

Brian Rasmussen に同意します。unxutils への移植は、これを行う最も簡単な方法です。彼のScripting PagesBatch Filesセクションで、Rob van der Woude は、MS-DOS および CMD コマンドの使用に関する豊富な情報を提供しています。私は彼があなたの問題に対するネイティブな解決策を持っているかもしれないと思って、そこを掘り下げた後、TEE.BATを見つけました. これはかなり複雑に見えるバッチ ファイルであり、やはり unxutils ポートを使用する傾向があります。

于 2009-04-28T07:06:33.873 に答える
8

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

これは、STDOUT と STDERR の両方をリダイレクトするのに役立ちます

于 2011-11-02T15:23:07.303 に答える
6

これは非常に古いトピックであることは知っていますが、以前の回答では、バッチで記述されたリアルタイム Tee の完全な実装はありません。以下の私の解決策は、パイプされたコマンドから出力を取得するためだけに JScript セクションを使用する Batch-JScript ハイブリッド スクリプトですが、データの処理は 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");
于 2013-05-20T03:07:04.657 に答える
4

これは、他の回答の1つに基づいて私が使用したもののサンプルです

@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
)
于 2011-11-02T18:17:52.297 に答える
3

これは 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%

これは、他のコマンドの最後にも追加できます。私が知る限り、メッセージに複数の行がある場合に機能します。たとえば、次のコマンドは、エラー メッセージがある場合に 2 行を出力します。

net use M: /D /Y %_Temp_Msg_Cmd%

于 2015-07-27T16:36:32.577 に答える
3

ユニックスのように。

dir | tee a.txt

Windows XP では動作しますが、mksntインストールが必要です。

プロンプトに表示されるだけでなく、ファイルに追加されます。

于 2013-05-03T12:47:31.410 に答える
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

これにより、現在の日時でログ ファイルが作成され、プロセス中にコンソール ラインを使用できます。

于 2010-12-03T14:15:07.237 に答える
0

出力を表示してファイルにリダイレクトするにはどうすればよいですか。dosコマンドdir>test.txtを使用すると、このコマンドは結果を表示せずに出力をファイルtest.txtにリダイレクトするとします。UNIX / LINUXではなく、DOS、つまりWindowsコマンドプロンプトを使用して、出力を表示し、出力をファイルにリダイレクトするコマンドを作成する方法。

これらのコマンドは、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.
于 2010-01-10T21:35:45.510 に答える
0

別の方法は、プログラム内でstdoutをstderrにティーすることです。

Javaの場合:

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

次に、dosバッチファイルで:java program > log.txt

stdoutはログファイルに移動し、stderr(同じデータ)がコンソールに表示されます。

于 2012-11-23T19:50:28.903 に答える
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

于 2009-07-08T08:52:25.397 に答える
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
于 2012-09-20T17:48:07.167 に答える