【bat】標準出力と標準エラーをリダイレクトする方法|> と 2> の違い

バッチファイルでコマンドを実行すると、結果は通常コンソール画面に表示されます。
しかし実運用では「ログファイルに保存したい」「エラーだけ別に記録したい」「標準出力と標準エラーをまとめたい」といった場面が多くあります。
ここでは、Windowsコマンドプロンプトでの標準出力・標準エラーのリダイレクト方法と、> と 2> の違いを解説します。

標準出力と標準エラーとは

WindowsやUNIX系OSのコマンドは、結果を標準出力(stdout)標準エラー(stderr)に分けて出力します。

  • 標準出力(1番)…通常の実行結果
  • 標準エラー(2番)…エラーメッセージ

リダイレクトでは、この「出力番号」を指定してファイルに書き込ませることができます。

標準出力をリダイレクトする(>)

>は標準出力をファイルに書き込みます。既存ファイルは上書きされ、>>とすると追記になります。

@echo off
rem 正常系の出力をファイルに保存
dir C:\Windows > out.txt

rem 追記モード
echo --- >> out.txt

標準エラーをリダイレクトする(2>)

標準エラーは「2」を指定します。エラーメッセージを別ファイルに保存したいときに有効です。

@echo off
rem 存在しないディレクトリを指定 → エラーを error.txt に出力
dir C:\NoSuchFolder 2> error.txt

標準出力と標準エラーを分けて保存する

標準出力は >、標準エラーは 2> を使って別々のファイルに保存できます。

@echo off
dir C:\ > out.txt 2> error.txt

標準出力と標準エラーをまとめて保存する(2>&1)

標準エラーを標準出力に合流させるには2>&1を使います。
これで両方を同じファイルにまとめられます。

@echo off
dir C:\ > all.txt 2>&1

処理順序が重要で、まず標準出力のリダイレクトを書いてから「2>&1」を指定します。
順番を逆にすると意図通りに動かないことがあります。

標準出力と標準エラーを同時に画面とファイルに出す(tee 的な使い方)

cmd には tee コマンドがありませんが、PowerShell を呼び出すことで実現できます。

@echo off
dir C:\ 2>&1 | powershell -NoProfile -Command "tee -FilePath all.txt"

まとめ

バッチでログを取るときは「通常出力は >、エラーは 2>」を基本に覚えておけば大丈夫です。
エラーも含めて一緒に残したい場合は「2>&1」でまとめると便利です。
実運用では「成功時ログ」「エラーログ」「両方まとめたログ」を用途に応じて使い分けるとトラブル解析がしやすくなります。