syslogをzip化して削除するバッチ
概要
Fortigateから出力されるsyslogが毎日1Gを超えていて、ログを保存しているパソコンの容量をひっ迫させる。中身はテキストファイルなので、zip化して元ファイルを消せば良いんだけど、手作業でやるのはめんどい。
今回は、毎日出力されるsyslogファイルを別フォルダに圧縮して、元ファイルを削除するバッチを作った話。
制約条件
フォルダ内のファイルを全部zip化して元ファイルを削除する処理は簡単だけど、それだと当日のsyslogまで削除されて困る。zip化するsyslogは最新ファイルを除外する必要がある。
zip化されていないファイルを削除されると困る。ファイルを削除する前にzipファイルが作成されているか確認が必要。
経緯
Copilotを使ってpowershellで作ろうとしたけどうまく動かず諦めてたところ、前回投稿の「フォルダ内の最新フォルダを開くバッチファイル」がヒントになって完成させることができた。構成とアルゴリズム
zip化する処理はタイムラグができるので、バッチファイルを2つ作ることにした。1つは、最新ファイル以外のsyslogファイルをzip化するバッチ。
もう1つは、zipフォルダ内に同じ名前のzipファイルがあるか確認して、あればsyslogファイルを削除するバッチ。
最新ファイルが判定する処理で、「setlocal enabledelayedexpansion」宣言したうえで、変数を「!」で挟むところがポイント。
この処理をしないとループ内で変数が更新されず、最新ファイル判定ができない。
注意事項と改善点
バッチファイルはsyslogファイルと同じフォルダに配置しないとうまく動かない。まとめ
今回は、syslogをzip化して退避するバッチファイルを作成した。タスクスケジューラから呼び出せば、手作業を0にできる。以下ソース
rem ①syslogの最新以外のファイルをZip化するバッチzipedLogCleaner.bat
@ECHO OFF
REM 対象フォルダ
SET targetFolder=C:\Users\709559\Documents\bat\zipbat\BKUP\
REM 対象ファイル
SET targetFiles=*.log
REM 対象フォルダ配下の対象ファイルを取得するコマンド(更新日付で降順)を作成
SET getFileListCmd=DIR /b /O-d %targetFolder%%targetFiles%
setlocal enabledelayedexpansion
FOR /F %%a IN ('%getFileListCmd%') DO (
if not exist %%~dpa\zip\%%~na.zip (
echo Zipファイルなしなので削除しない
) else (
del %%a
)
)
EXIT
rem syslogの最新以外のファイルをZip化するバッチsyslogZipper.bat
@ECHO OFF
REM 対象フォルダ
SET targetFolder=C:\Users\709559\Documents\bat\zipbat\BKUP\
REM 対象ファイル
SET targetFiles=*.log
REM 対象フォルダ配下の対象ファイルを取得するコマンド(更新日付で降順)を作成
SET getFileListCmd=DIR /b /O-d %targetFolder%%targetFiles%
REM カウンタ
setlocal enabledelayedexpansion
SET forCnt=1
FOR /F %%a IN ('%getFileListCmd%') DO (
if "!forCnt!"=="0" (powershell -Command Compress-Archive "%%a" "%%~dpa\zip\%%~na.zip")
SET forCnt=0
)
EXIT