内部からバッチファイルのstdoutとstderrをリダイレクトする方法はありますか?.
のようなものを想像しています
set STDOUT=stdout.log
echo Some text
a.exe
b.exe
c.exe
Some text
とa.exe
、b.exe
とc.exe
の両方の出力がstdout.log
に移動する場合
これは可能ですか?
コマンドのコレクション全体に対して1回リダイレクトする方が、個々のコマンドを(追加して)リダイレクトするよりも効率的です。リダイレクトの初期化には時間がかかります。リダイレクトされたいくつかのコマンドでは目立たない場合がありますが、繰り返しが多いループで実行すると、非常に重要になります。
1つの方法は、リダイレクトされたコマンドのブロック全体を括弧で囲み、括弧の外にリダイレクトすることです。
>stdout.log 2>&1 (
echo Some text
a.exe
b.exe
c.exe
)
別のオプションは、コマンドをサブルーチンに入れ、CALLをリダイレクトすることです
call :redirect >stdout.log 2>&1
exit /b
:redirect
echo Some text
a.exe
b.exe
c.exe
exit /b
はい、stdoutをリダイレクトしてファイルに追加する必要があります(1>> %STDOUT%
)そしてstderrをstdout(2>&1
):
set STDOUT=stdout.log
echo Some text 1>> %STDOUT% 2>&1
a.exe 1>> %STDOUT% 2>&1
b.exe 1>> %STDOUT% 2>&1
c.exe 1>> %STDOUT% 2>&1
@EitanTは、あなたの質問がstderrとstdoutの両方を同じファイルに書き込むことを必ずしも意味しないことを正しく指摘しました。したがって、完全を期すために、個別のファイルに書き込むバージョンを次に示します。
set STDOUT=stdout.log
set STDERR=stderr.log
echo Some text 1>> %STDOUT% 2>> %STDERR%
a.exe 1>> %STDOUT% 2>> %STDERR%
b.exe 1>> %STDOUT% 2>> %STDERR%
c.exe 1>> %STDOUT% 2>> %STDERR%