忍者ブログ

syslogをzip化して削除するバッチ

2024年08月13日

概要

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

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字