バッチファイルのログ出力とデバッグテクニックを解説します。ログを残す習慣をつければ問題発生時の原因特定が格段に楽になります。
リダイレクトの基本(>・>>・2>)
コマンドの出力をファイルに書き出すには「リダイレクト」を使います。
| 記号 | 意味 | 例 |
|---|---|---|
| > | 上書き(ファイルが存在していたら消去して新規作成) | echo test > log.txt |
| >> | 追記(ファイルの末尾に追加) | echo test >> log.txt |
| 2> | エラー出力をファイルに書き出す | command 2> error.txt |
| >nul | 出力を捨てる(画面に表示しない) | command >nul |
| 2>&1 | エラー出力を標準出力に合流させる | command > log.txt 2>&1 |
@echo off
rem 上書きでログに書く
echo 処理開始: %DATE% %TIME% > C:\logs\process.log
rem 追記でログに書く
echo 処理ステップ1完了 >> C:\logs\process.log
echo 処理ステップ2完了 >> C:\logs\process.log
rem 標準出力とエラー出力を両方ログに書く
robocopy C:\work D:\backup /E > C:\logs\robocopy.log 2>&1
rem エラー出力だけ別ファイルに
robocopy C:\work D:\backup /E > C:\logs\output.log 2> C:\logs\error.log
rem 画面表示とファイル書き込みを同時に行う(for /f を使った方法)
echo 処理完了 | tee C:\logs\process.log実用的なログ出力テンプレート
@echo off
setlocal
rem ログファイルのパスを設定
set LOG=%~dp0logs\%~n0_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log
if not exist "%~dp0logs" mkdir "%~dp0logs"
rem ログ書き込み用の関数
call :LOG "=== 処理開始: %DATE% %TIME% ==="
call :LOG "ステップ1: フォルダ確認"
if exist "C:\work" (
call :LOG " OK: C:\workが存在します"
) else (
call :LOG " NG: C:\workが見つかりません"
exit /b 1
)
call :LOG "=== 処理完了: %DATE% %TIME% ==="
pause
exit /b 0
rem ===== ログ書き込みサブルーチン =====
:LOG
rem 画面表示とファイル書き込みを同時に
echo %~1
echo %DATE% %TIME% %~1 >> "%LOG%"
exit /b 0@echo onでデバッグする
バッチファイルの動作がおかしいとき、@echo on にすると実行されるコマンドが画面に表示されるため、どの行でどのコマンドが実行されているか確認できます。
@echo on ← onにすると実行コマンドが表示される
rem デバッグしたい範囲のみonにすることも可能
set A=Hello
set B=World
echo %A% %B%
@echo off ← 確認したいところだけonにして、終わったらoffに戻すまとめ
- > で上書き、>> で追記、2>&1 でエラー出力を合流させてログに残す
- >nul でコマンドの出力を捨てて画面をスッキリさせる
- ログ書き込みはサブルーチン化すると管理しやすい
- @echo on で実行コマンドを確認してデバッグできる
夜間に自動実行するバッチでエラーが起きると、翌朝ログファイルを見て原因を特定することになります。ログを残していないと調査が困難になるため、本番で使うバッチには必ずログ出力を入れるようにしています。
hobbyshift管理人



コメント