コンソール出力をエコーし​​てbatスクリプトのファイルに送信するにはどうすればよいですか?


136

タスクを実行して出力をテキストファイルに送信するバッチスクリプトがあります。コンソールウィンドウにも出力を表示する方法はありますか?

例えば:

c:\Windows>dir > windows-dir.txt

出力をdirコンソールウィンドウに表示し、テキストファイルに出力する方法はありますか?


ここでは、実行できるリダイレクトといくつかの例について説明します。<br>お
役に立てば幸いです


2009年2月2日の16:38に質問された質問は、ほぼ3か月後の2009年4月28日の06:32に質問された質問の複製とは見なされないことに注意してください。
Compo

回答:


216

いいえ、純粋なリダイレクトではできません。
しかし、いくつかのトリック(tee.batなど)を使用すると、できます。

リダイレクトについて少し説明します。

>ファイルまたは<ファイルを使用して10個のストリームの1つをリダイレクトします。
リダイレクトがコマンドの前または後にある場合は重要ではないため、これらの2行はほぼ同じです。

dir > file.txt
> file.txt dir

この例のリダイレクトは1>のショートカットにすぎません。つまり、ストリーム1(STDOUT)がリダイレクトされます。
したがって、2> err.txtのような番号を前に付けて任意のストリームをリダイレクトでき、複数のストリームを1行でリダイレクトすることもできます。

dir 1> files.txt 2> err.txt 3> nothing.txt

この例では、「標準出力」はfiles.txtに入れられ、すべてのエラーはerr.txtに入れられ、stream3はnothing.txtに入れられます(DIRはストリーム3を使用しません)。
Stream0はSTDIN
Stream1はSTDOUT
Stream2はSTDERR
Stream3-9は使用されません

しかし、同じストリームを複数回リダイレクトしようとするとどうなりますか?

dir > files.txt > two.txt

「1つしかあり得ない」そしてそれは常に最後のものです!
したがって、dir> two.txtと同じです。

さて、ストリームを別のストリームにリダイレクトする可能性があります。

dir 1>files.txt 2>&1 

2>&1は stream2をstream1にリダイレクトし、1> files.txtはすべてをfiles.txtにリダイレクトします。
順序はここで重要です!

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

異なっています。最初の行はすべて(STDOUTおよびSTDERR)をNULに
リダイレクトしますが、2行目はSTDOUTをNULにリダイレクトし、STDERRを「空の」STDOUTにリダイレクトします。

1つの結論として、OtávioDécioとandynormancxの例が機能しない理由は明らかです。

command > file >&1
dir > file.txt >&2

どちらもstream1を2回リダイレクトしようとしますが、「1つしか存在できません」であり、常に最後のストリームになります。
だからあなたは得る

command 1>&1
dir 1>&2

また、最初のサンプルでは、​​stream1からstream1へのリダイレクトは許可されていません(そしてあまり役に立ちません)。

それが役に立てば幸い。


24
ネイティブウィンドウは、シェルとそれは不可能です
fantastory

7
@fantastory可能です。dbenhamWindows バッチの
jeb

97
この投稿全体を読んで、すべてが「いいえ」として要約できることを確認しただけでは、信じられません。
Charles McKelvey 2016

1
2番目のメカニズム「複製の処理」はどうですか?私は実験した3<&2後、(代わりに、GTのLTに注意)、および3>errors.txt。しかし、これはひどく終わりました-後続のすべてのstderr出力はerrors.txt(つまり-他のコマンドからも)キャプチャされました。
Tomasz Gandor

でも使用できますfor /f "delims=" %%v in ('dir') do echo %%v>>file.txt
scriptmastere02 2018年

32

WindowsバージョンのUNIX teeコマンド(http://unxutils.sourceforge.netにある)を次のように使用するだけです。

mycommand > tee outpu_file.txt

STDERR出力も必要な場合は、以下を使用します。STDOUTにSTDERR出力(プライマリストリーム)を合成します。
2>&1

mycommand 2>&1 | tee output_file.txt

3
PowerShellのティー・オブジェクトが同様の機能を提供しています。Get-Process | Tee-Object -file c:\ scripts \ test.txt
Kevin Obee

私はこれをpowershellと通常のシェルの両方で試しました。コマンドを呼び出す代わり1>tee a.txtに、stdoutをという名前のファイルにリダイレクトします。誰かがこの答えが彼らのために機能することを確認できますか?teetee
mafu

@mafu確認できます。
チェルノ

@mafu上記の答えは少し正しくありません。パイプ "|"を使用する必要があります 上の例の「>」の代わりに。奇妙なことに、その場合、STDOUTとSTDERRの出力の順序がコマンドラインで混同されていました。下の例は私にとっても完璧に動作します。
チェルノ

また、sourceforgeのダウンロードが壊れていました。ここで代替ホストを見つけました:wzw.tum.de/public-html/syring/win32/UnxUtilsDist.html(ミュンヘン大学)
セルノ

9

リアルタイムで出力が必要ない場合(つまり、プログラムが出力しているとき)、次のように追加できます。

type windows-dir.txt

その行の後。


または同じ行(プロンプトで便利)上:dir > windows-dir.txt & type windows-dir.txt。これはブロックにも当てはまります( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt。ただし、出力をリアルタイムで必要とされている場合、あなたが例えばA Windowsへの移植に使用できるティーそのためのツールを...
mousio

7

私のために働いた解決策は次のとおりでした:dir> a.txt | a.txtと入力します。


2
これは低出力のコマンドで機能します。大きな出力コマンドでは、最初のバッファしか表示されないため機能しません。彼は、ログファイルに出力を保存するときに、リアルタイムの出力を求めています。
NetVicious 2016年

>の代わりに>>を使用すると問題が発生します
Nime Cloud '11

6

はい、単一のコマンド出力をコンソール(画面)とファイルに表示する方法があります。あなたの例を使用して、使用してください...

@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
)

コンソール(画面)にのみ出力が必要な場合と、ファイルにのみ送信される場合と、両方に送信される場合がある場合は、以下ので示すように、変数を使用してFORループの「DO」句を指定します%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

delims=代わりに使用する必要があります。
scriptmastere02 2018年

3
command > file >&1

データを画面に書き出さない場合は、バッファががらくたになるのではなく、バッチジョブを実行できるため、より高速になります。デバッグしている場合、>ファイル構文は使用しません。
ランダムデベロッパー

@andynormancx yupは、CMDからカットアンドペーストする代わりにタイプするのを忘れていました。
ランダムデベロッパー

構文をWindowsコマンドプロンプトで機能させることができず、代わりにtypeコマンドを使用しました。
JamesEggers、2009

&2は機能しますが、テストしてもファイルは作成されません。
JamesEggers、2009

5
「dir> file.txt>&2」を実行すると、file.txtが作成されません。ディレクトリの出力はコンソールにエコーされていますが、ファイルは作成されていません。">&2"が存在しない場合、ファイルが作成されます。
JamesEggers、2009

2

出力ファイルを置き換えるのではなく追加したい場合は、

dir 1>> files.txt 2>> err.txt

または

dir 1>> files.txt 2>>&1

2

私のオプションはこれでした:

メッセージを受け取り、メッセージをコンソールとログファイルの両方に送信するプロセスを自動化するサブルーチンを作成します。

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

変数をメッセージに追加する場合は、サブルーチンに送信する前にその中の引用符を必ず削除してください。そうしないと、バッチが台無しになります。もちろん、これはエコーに対してのみ機能します。


すごい!私は本当にこれが好きです!!3つの変更を加えましたが、気に入っていただければ幸いです。 1)setlocal enabledelayedexpansion単にsetlocal 2の代わりに使用します。2)サブルーチン内では>> !logfile!なく、logfile変数に遅延展開を使用します>> %logfile%。このように、コードブロック内(ifステートメント内など)から呼び出されたときに機能します。3)余分な変数が必要ないため、「メッセージの設定」行を削除しました。私たちはすでにそれを持っている$~1ので、私はecho $~1両方のエコーコマンドのために持っています。
ネイト

2

コマンド画面とログの両方へのリアルタイム出力を処理できるシンプルなC#コンソールを作成しました

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

そして、これは、https://github.com/iamshiao/Teeをコンパイルするためのツールがない場合に備えて、Tee.exeを含むリポジトリです


1

私はatnの答えが好きですが、winteeほどダウンロードするのは簡単ではありませんでした。これもオープンソースであり、tee機能のみを提供します(unixユーティリティのセット全体ではなくteeだけが必要な場合に役立ちます)。これについては、Windowsコマンドプロンプト出力の表示とファイルへのリダイレクトに対するdavorの回答から学びました。ここには、UNIXユーティリティへの参照もあります。


0

「Tomas R」が提供するソリューションは、OPの質問に最適であり、ネイティブで利用可能です。

試してみてください:chkdsk c:> output.txt | タイプoutput.txt

このコマンドの出力には、ファイルにシリアルに出力される完了率が含まれているため、少し乱雑に見えます(つまり、進行中にテキストが追加されます)。これは、STDOUT(画面)への出力を取得するビットには発生しません。これは、リダイレクトせずに同じコマンドを実行した場合の状態です。


-3

私はあなたがこれに沿って何かを望んでいると思います:

echo Your Msg> YourTxtFile.txt

または、新しい行が必要な場合:

echo Your Msg>> YourTxtFile.txt

これらのコマンドはログに最適です。

注:これにより、コンピューター上のテキストファイル全体が誤動作して置き換えられる場合があります。

別の注:ファイルが存在しない場合は、ファイルが作成されます。


1
いいえ、OPは出力をファイルにて画面に表示したいと考えていました。あなたはファイルに書き込むだけです。(そして>れるように設計ファイルを上書きするために使用します。>>APPEND
シュテファン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.