web-dev-qa-db-ja.com

バッチファイル内からstdoutとstderrをリダイレクトする

内部からバッチファイルのstdoutとstderrをリダイレクトする方法はありますか?.

のようなものを想像しています

set STDOUT=stdout.log
echo Some text
a.exe
b.exe
c.exe

Some texta.exeb.exec.exeの両方の出力がstdout.logに移動する場合

これは可能ですか?

18
sashoalm

コマンドのコレクション全体に対して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
30
dbenham

はい、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%
6
zb226