タスクを実行して出力をテキストファイルに送信するバッチスクリプトがあります。コンソールウィンドウにも出力を表示する方法はありますか?
例えば:
c:\Windows>dir > windows-dir.txt
出力をdir
コンソールウィンドウに表示し、テキストファイルに出力する方法はありますか?
タスクを実行して出力をテキストファイルに送信するバッチスクリプトがあります。コンソールウィンドウにも出力を表示する方法はありますか?
例えば:
c:\Windows>dir > windows-dir.txt
出力をdir
コンソールウィンドウに表示し、テキストファイルに出力する方法はありますか?
回答:
いいえ、純粋なリダイレクトではできません。
しかし、いくつかのトリック(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へのリダイレクトは許可されていません(そしてあまり役に立ちません)。
それが役に立てば幸い。
3<&2
後、(代わりに、GTのLTに注意)、および3>errors.txt
。しかし、これはひどく終わりました-後続のすべてのstderr出力はerrors.txt
(つまり-他のコマンドからも)キャプチャされました。
for /f "delims=" %%v in ('dir') do echo %%v>>file.txt
。
WindowsバージョンのUNIX teeコマンド(http://unxutils.sourceforge.netにある)を次のように使用するだけです。
mycommand > tee outpu_file.txt
STDERR出力も必要な場合は、以下を使用します。STDOUTにSTDERR出力(プライマリストリーム)を合成します。2>&1
mycommand 2>&1 | tee output_file.txt
1>tee a.txt
に、stdoutをという名前のファイルにリダイレクトします。誰かがこの答えが彼らのために機能することを確認できますか?tee
tee
リアルタイムで出力が必要ない場合(つまり、プログラムが出力しているとき)、次のように追加できます。
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への移植に使用できるティーそのためのツールを...
私のために働いた解決策は次のとおりでした:dir> a.txt | a.txtと入力します。
はい、単一のコマンド出力をコンソール(画面)とファイルに表示する方法があります。あなたの例を使用して、使用してください...
@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=
代わりに使用する必要があります。
command > file >&1
私のオプションはこれでした:
メッセージを受け取り、メッセージをコンソールとログファイルの両方に送信するプロセスを自動化するサブルーチンを作成します。
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
変数をメッセージに追加する場合は、サブルーチンに送信する前にその中の引用符を必ず削除してください。そうしないと、バッチが台無しになります。もちろん、これはエコーに対してのみ機能します。
setlocal enabledelayedexpansion
単にsetlocal
2の代わりに使用します。2)サブルーチン内では>> !logfile!
なく、logfile変数に遅延展開を使用します>> %logfile%
。このように、コードブロック内(ifステートメント内など)から呼び出されたときに機能します。3)余分な変数が必要ないため、「メッセージの設定」行を削除しました。私たちはすでにそれを持っている$~1
ので、私はecho $~1
両方のエコーコマンドのために持っています。
コマンド画面とログの両方へのリアルタイム出力を処理できるシンプルな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を含むリポジトリです 。
私はあなたがこれに沿って何かを望んでいると思います:
echo Your Msg> YourTxtFile.txt
または、新しい行が必要な場合:
echo Your Msg>> YourTxtFile.txt
これらのコマンドはログに最適です。
注:これにより、コンピューター上のテキストファイル全体が誤動作して置き換えられる場合があります。
別の注:ファイルが存在しない場合は、ファイルが作成されます。
>
れるように設計ファイルを上書きするために使用します。>>
にAPPEND)