バッチファイルを使って自動処理を行う際、ログファイルの内容に応じて処理を分岐させたい場面があります。たとえば、エラーが出ていれば通知を送る、一定の行数以上であればログを別ファイルに分割する、といった実装が可能です。
本記事では、ログファイルの行数を数える方法と、特定キーワードの有無を判定する方法について、具体的なバッチファイルのコードとともに解説します。
1. ログファイルの行数をカウントする方法
find /v ""
コマンドを使用することで、行数をカウントすることができます。以下はその基本例です。
@echo off
setlocal enabledelayedexpansion
set "logfile=output.log"
set "linecount=0"
for /f "usebackq" %%A in (`find /v "" ^< "%logfile%"`) do (
set /a linecount+=1
)
echo 行数は !linecount! 行です。
if !linecount! gtr 100 (
echo 行数が100行を超えています。処理Aを実行します。
REM call :ProcessA
) else (
echo 行数が100行以下です。処理Bを実行します。
REM call :ProcessB
)
ポイント:
find /v ""
で全行を抽出(改行を含む行すべてにマッチ)for /f
ループで1行ずつ処理し、カウントアップenabledelayedexpansion
でループ内の変数更新に対応
2. 特定のキーワードが含まれているか判定
findstr
を使えば、特定キーワードがログに含まれているか簡単に判定できます。
@echo off
set "logfile=output.log"
set "keyword=ERROR"
findstr /i "%keyword%" "%logfile%" > nul
if %errorlevel%==0 (
echo ログに"%keyword%"が含まれています。エラー処理を行います。
REM call :ErrorHandler
) else (
echo キーワードは含まれていません。通常処理を続行します。
REM call :NormalProcess
)
補足:/i
は大文字・小文字を無視して検索するオプションです。
3. 応用例:行数とキーワードの両方で分岐
両方の条件を組み合わせた複合的な判断も可能です。
@echo off
setlocal enabledelayedexpansion
set "logfile=output.log"
set "linecount=0"
set "keyword=ERROR"
:: 行数をカウント
for /f "usebackq" %%A in (`find /v "" ^< "%logfile%"`) do (
set /a linecount+=1
)
:: キーワードチェック
findstr /i "%keyword%" "%logfile%" > nul
set "found_error=%errorlevel%"
:: 条件分岐
if !linecount! gtr 100 (
if %found_error%==0 (
echo 大量のログかつエラー検出。即時対応が必要です。
REM call :EmergencyResponse
) else (
echo 大量のログだがエラーなし。記録処理を行います。
REM call :ArchiveProcess
)
) else (
echo 通常ログサイズ。定期処理を続行します。
REM call :RoutineJob
)
まとめ
バッチファイルでログファイルを解析することで、次のような柔軟な処理が実現できます。
- ログの行数を条件にした処理の分岐(肥大化したログの圧縮など)
- エラーメッセージの検出による通知や修復処理の実行
- 複数条件を組み合わせた自動運用の実現
システム管理やバックアップ運用などでの応用範囲は広く、人的なチェック工数を減らす手段として非常に有効です。ぜひご自身の環境に合わせてカスタマイズして活用してみてください。