Windowsバッチファイル

バッチファイルのログ出力とデバッグ【リダイレクト・追記・タイムスタンプ付きログ】

Windowsバッチファイル
記事内に広告が含まれています。

バッチファイルのログ出力とデバッグテクニックを解説します。ログを残す習慣をつければ問題発生時の原因特定が格段に楽になります。

リダイレクトの基本(>・>>・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管理人

コメント

タイトルとURLをコピーしました