Windowsコマンドプロンプトの出力を表示してファイルにリダイレクトする


371

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

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

UNIX のコマンドと同様に、Windowsコマンドプロンプトで出力を表示し、出力ファイルにリダイレクトするコマンドをどのように記述できますteeか?


63
そして、MSDOSと呼ぶのをやめてください!cmd.exeとbraindead command.comの類似点はごくわずかで、小さくなっています。
paxdiablo 2009


テキストを出力するDLLをロードするコンソールアプリケーションがある場合、これらは機能しません。メインアプリケーションテキストはファイルにリダイレクトされますが、dllからの出力はコンソールウィンドウに表示されず、引き続き表示されます。dllからテキストをキャプチャする方法が見つかりませんでした。
Brian Reinhold 2013

1
まだファイルにパイプして、そのファイルでテール(stackoverflow.com/questions/187587/…)を使用することもできます
x29a

コマンドラインユーティリティを使用していて、画面に表示されているものとまったく同じ形式でファイルに出力をリダイレクトしたい場合、youtube-dlを使用してリンクを抽出し、出力をtxtファイルにリダイレクトできますが、その形式はプロンプトで、ファイルに1行として表示されます。
beastboy

回答:


153

davorの答えを拡張するには、次のように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
そのノートdirPowerShellの別名であるGet-ChildItemCMDの内部のようにされていないdirコマンド。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は出力を保存するファイルです。


100
これは答えを満たしますが、データが生成されるときではなく、dirコマンドが完了した後にデータを出力します。
リーリフェル

10
動作しますが、コマンドがstdinからの入力を待機する場合は、行き詰まります。
Vitim.us 2013

5
私はこの単純な答えが好きです!またはのような一部のコマンドの出力には&、aではなくa |が必要であることがわかりましたping7z.exe
Wes Larson

の代わりにインタラクティブコマンドでは機能しませんdir。例:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt。システムレポートファイルが別のプロセスによってロックされています。
ソパラホデアリエール2016

4
@lii re:handle output to stderr- 2>&1リダイレクトを次のように追加します。stderr とstdoutを混在させる必要dir 2>&1 > a.txt & type a.txtあります。
ジェシーチザム2017年

97

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


17
このリンクは、UNIXコマンドteeのWindows実装を指しているため、Windowsでは機能します。
Brian Rasmussen

3
ええ、答えとコメントに投票します。CygWinにはすべてが揃っているので、実際にはCygWinを好みますが、一部の人々は、選択して選択できる非DLLツールを好みます。
paxdiablo 2009

3
多くのUnixユーティリティもGnuWin32プロジェクトによって移植されています。gnuwin32.sourceforge.netを参照してください。
VladV 2009

2
UnxUtilsは2003年に最後に更新されました。GnuWin32はもう少し最新です。
quack quixote、

9
私のように、GnuWin32のteeパッケージを見つけるのに苦労した場合、それはgnuwin32.sourceforge.net/packages/coreutils.htmにあります。
Nigel Touch

49

これをチェックしてください:wintee

cygwinは必要ありません。

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

また、teeが含まれている(そしてcygwinは不要)ので、unxutilsを確認することもできますが、ここでは出力EOLがUNIXに似ていることに注意してください。

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


4
なぜ反対票か。ここでの返信の95%には、共通点が1つあります。最初のコマンドが完了した後でのみ出力がリダイレクトされます。コメントを読んでください。UNIXユーティリティはteeリアルタイムで出力します。wtee同じ機能を持っています。バグを気にしないのであれば、それで十分です。
Davor Josipovic

これは、Powershell 4.0以降ではなく、私にとって有効な唯一のソリューションです。いいぞ!
アレックス

46

あずきっく

見つけた

dir > a.txt | type a.txt

動作しませんでした(dirリストの最初の数行のみ-何らかのプロセスの分岐が疑われ、2番目の部分、 'type'コマンドはdireリストが完了する前に終了しましたか?)。

dir > z.txt && type z.txt

実行したコマンド-順次コマンド。2番目のコマンドが開始する前に完了します。


17
コマンドが失敗した場合でもコマンドが確実に実行されるようにする場合は、の&代わりに使用してください。これは、コマンドになんらかの形式のエラーがあり、コンソールにログファイルを表示したい場合に役立ちます。これに関するマイクロソフトの記事を参照してください。ただし、これにはエラーレベル(0になる)に設定されるという問題があります。&&typedir%errorlevel%type
ADTC、2014

25

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

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

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


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の結果を表示するだけでなく、files1.txtとfiles2.txtの両方に結果を保存します。

上記のエラー処理の方法にはほとんど何もないため、実際には複数のファイルをサポートする必要がない場合があります。


5
うーん、tee / cygwinを無料でダウンロードするか、私のような苦労して稼いだ現金でMSVSを購入して、そのようなちょっぴり小さなプログラムを作成しますか?難しいですね:-)
paxdiablo 2009

19
コンパイルするのにビジュアルスタジオは必要ありません。コマンドラインツールは実際には無料です。リンクのgoogle ".net sdk download"だけです(直接リンクは変わっているようですが、googleは常に機能しているようです)。
クリス

13
Visual Studio Expressも無料ですが、私はまだteeを使用します。
ブライアンラスムッセン

7
cygwinはインストールが面倒です。これが私が探していたものだからあなたに賛成票を投じてください。
サマウサ

1
これはコンソールとファイルに同時に出力されないと思いますか?
mjaggard

20

これはうまくいきますが、少し見苦しいです:

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

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

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

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

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


2
これは、プロセスの実行後にコンテンツを表示する場合にのみ役立ちます。そして、それは解決するのが難しい問題ではありません。
Christopher Painter

1
ええ、これは元のポスターが求めていたものとは少し異なる問題に対処していると思います。
MTS

1
+1これは私がいつもやっていたことです。これは元の質問に対する正しい答えであり、そのようにマークする必要があると思います。@MTSが示唆しているトリックは、実際には2つのファイルに書き込むということです。1つはコマンド/行ごとに作成され(そのため、毎回上書きされる単一の ">")、次に画面にその行を入力します(タイプ)、そして最後に、あなたは再びそれを入力し、「>>」を使用して、ログファイルへの出力、すべての長い追加し、リダイレクトします。これは私が何年もの間行ってきた方法ですが、シンプルな " "一時ファイルが大好きです。私はいつも「tmp.txt」か何かをやってきました。後で削除します。
eduncan911 2013

これは良いアプローチですが、いくつかのエラーがキャプチャされないという問題がありました。typeただし、コマンドを(サブルーチン内の)別の行に置くことで修正されました。
ネイト・クック

アプリケーションに必要なものだけです。
2014年

16

mteeは、この目的に非常によく機能する小さなユーティリティです。それは無料であり、ソースはオープンであり、それはちょうどうまくいきます。

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

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

    someprocess | mtee /+ mylogfile.txt

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

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


1
これは、ファイルまたはコンソールに出力する前に、出力が完了するまで待機しているようです。
mellamokb 2013

14

Saxon Druceの優れた答えを少し詳しく説明します

前述のように、現在のディレクトリにある実行可能ファイルの出力を次のようにリダイレクトできます。

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

ただし、これはログのみです stdoutをしtest.txtます。ログも記録しませんstderr

明白な解決策は、次のようなものを使用することです:

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

ただし、これはすべてので機能するわけではありませんsomething.exe。一部something.exeのは2>&1、を引数として解釈して失敗します。正しい解決策は、代わりにsomething.exeとそのスイッチと引数の周りにアポストロフィのみを含めることです。

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

Windows 10でpyqt5.7をビルドするときにこれを試しましたが、かなり遅いです。コンソール出力はリアルタイムではなく、おそらくバッファリングされていますか?ログファイルは正しいように見えます
Shuman

3
それはすべて完全に間違っています。私にはまったく機能しません。最後のコマンドには'tee' is not recognized as an internal or external command明らかな理由があります。2>&1内部のCMDラインstderrに何らかの出力がPowerShellのからエラーが発生します。
Pavel P

PowerShell Tee-Objectコマンドレットへの参照である可能性があります-technet.microsoft.com/en-us/library/ee177014.aspx
Bernd

9

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


そのtee.batは見栄えがいいです。OPがこれをチェックしてほしい。
ジェイ

10
近くに投稿された「dir> a.txt | type a.txt」の例のように、TEE.BATを使用すると、コマンドが完了した後に出力されます。
adzm

8

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

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

7
Cygwinを使用する場合は、Tシャツが付属しています。
Llama氏、2015年

7

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

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


これは機能しません。これを使用してJBoss run.batを起動しようとすると、起動時にチョークが発生し、サーバーがフリーズします。この方法には問題があります...
djangofan 2012

@raja ashok、私にはうまくいきません。私はpython.exe 1> file.txt 2>&1
neo

4

これは非常に古いトピックであることはわかっていますが、以前の回答では、バッチで記述されたリアルタイム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");

これがstderr出力をキャプチャできる方法はありますか?標準エラーストリームのすべてを出力する迷惑なexeがあります(つまり、通常ファイルに出力するには、次のようにします)file.exe 2>output.txt
Mark Deven

私はそれを考え出した。あなたはそれを使ってそれを行うことができますfile.exe 2>&1|tee.bat:ここに見られるようなsuperuser.com/questions/452763/...
マーク・DEVEN

4

私も同じ解決策を探していましたが、少し試した後、コマンドプロンプトで問題を解決することができました。これが私の解決策です:

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

PAUSEコマンドもキャプチャします。


3

これは、他の回答の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
)

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 2017年

3

コンソールに出力を送信、コンソールログに追加、現在のコマンドから出力を削除

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1

8
ここで何が起こっているのかを説明しますか?
John Demetriou

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%

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

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
これで同じプログラムを2回呼び出していませんか?
elcool 2012

1

「for」ステートメントを含むバッチサブルーチンを使用して、コマンド出力を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をfor内に配置します)。標準のサブ関数を呼び出して画面にエコーし、ログに書き込みます。これは、エコーを使用する代わりにスクリプト全体で使用するためです。 。それがなぜ他の人からの反対票を得たのかわからないので、私は反対票を入れました。
Ben Personick

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 ここで重要なのは、出力の各行を分割するデリミタ(delims)を何も設定しないことです。このようにして、デフォルトの空白で壊れることはありません。%aは任意の文字ですが、「do」セクションで使用され、まあ...各行で解析された文字を使用して何かを行います。この場合、アンパサンド(&&)を使用して2番目のエコーコマンドを実行し、選択したファイルに作成または追加(>>)できます。ファイルの書き込みに問題がある場合に備えて、DOコマンドのこの順序を維持する方が安全です。少なくとも最初にコンソールにエコーを取得します。最初のエコーの前のアットマーク(@)は、コンソールがエコーコマンド自体を表示するのを抑制し、代わりに、%aに文字を表示するコマンドの結果を表示します。そうでなければあなたは見るでしょう:

ドライブ[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インストールが必要です。

プロンプトに表示され、ファイルに追加されます。


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にリダイレクトします。UNIX / LINUXではなく、DOS、つまりWindowsコマンドプロンプトを使用して出力を表示し、出力をファイルにリダイレクトするコマンドの記述方法。

これらのコマンドは、バイタスクリプティング(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>ONOFFまたは/?。しかし、残りは時々うまくいくかもしれません:-)
jeb

0

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

Javaで:

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;

dir | perl tee.plまたはdir | perl tee.pl dir.bat

原油と未テスト。


0

もう1つのバリエーションは、パイプを分割し、必要に応じて出力をリダイレクトすることです。

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

上記を.batファイルに保存します。また、filestream 1のテキスト出力をfilestream 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. コマンドを開く
  8. 入力c:\cygwin64\bin\script.exeして入力
  9. 入力cmdして入力
  10. プログラムを実行する
  11. 入力exitして入力(Cygwinのcmd.exeを終了)
  12. 入力exitして入力(Cygwinのscript.exeを終了)
  13. プログラムの画面出力を「typescript」というテキストファイルで確認します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.