タスクを実行し、出力をテキストファイルに送信するバッチスクリプトがあります。出力をコンソールウィンドウにも表示する方法はありますか?
例えば:
c:\Windows>dir > windows-dir.txt
dir
コンソールウィンドウに表示出力を表示したり、テキストファイルに出力したりする方法はありますか?
タスクを実行し、出力をテキストファイルに送信するバッチスクリプトがあります。出力をコンソールウィンドウにも表示する方法はありますか?
例えば:
c:\Windows>dir > windows-dir.txt
dir
コンソールウィンドウに表示出力を表示したり、テキストファイルに出力したりする方法はありますか?
いいえ、純粋なリダイレクトではできません。
しかし、いくつかのトリック ( tee.bat など) を使えばできます。
リダイレクトについて少し説明します。
10 個のストリームの 1 つを> fileまたは< file
でリダイレクトします。リダイレクトがコマンドの前か後かは重要ではないため、これら 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つしかない」、そしてそれは常に最後の1つです!
したがって、dir > two.txtと同じです。
OK、ストリームを別のストリームにリダイレクトするという追加の可能性があります。
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ávio Décio と andynormancx の例が機能しない理由は明らかです。
command > file >&1
dir > file.txt >&2
どちらも stream1 を 2 回リダイレクトしようとしますが、「できるのは 1 つだけ」であり、常に最後になります。
だからあなたは得る
command 1>&1
dir 1>&2
また、最初のサンプルでは、stream1 から stream1 へのリダイレクトは許可されていません (あまり役に立ちません)。
それが役に立てば幸い。
UNIX の tee コマンド ( http://unxutils.sourceforge.netにある)の Windows バージョンを次のように使用します。
mycommand > tee outpu_file.txt
STDERR 出力も必要な場合は、次を使用します。
は2>&1
、STDERR 出力を STDOUT (プライマリ ストリーム) に結合します。
mycommand 2>&1 | tee output_file.txt
リアルタイムで(つまり、プログラムが出力を書き込んでいるときに)出力が必要ない場合は、次のように追加できます。
type windows-dir.txt
その行の後。
私のために働いた解決策は次のとおりでした: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
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
メッセージに変数を追加する場合は、変数をサブルーチンに送信する前に必ず引用符を削除してください。そうしないと、バッチが台無しになる可能性があります。もちろん、これはエコーに対してのみ機能します。
私は atn の答えが好きですが、winteeとしてダウンロードするのは簡単ではありませんでした。これもオープンソースであり、tee 機能のみを提供します (unix ユーティリティのセット全体ではなく、tee だけが必要な場合に役立ちます)。これについては、davor のDisplaying Windows command prompt output and redirecting it to a file への回答から学びました。ここには、UNIX ユーティリティへの参照もあります。
「Tomas R」が提供するソリューションは、OP の質問に最適であり、ネイティブで利用できます。
試してください: chkdsk c: > output.txt | output.txt と入力します
このコマンドの出力には、ファイルに連続して出力される完了率が含まれるため、少し乱雑に見えます (つまり、進行するにつれてテキストが追加されます)。これは、STDOUT (画面) に出力されるビットには発生しません。リダイレクトせずに同じコマンドを実行すると、このようになります。