【Windows】不要になったログファイルを定期的に自動削除する
こんにちは。
最近uptimeが12分くらい
システムソリューション部のかわです。
いつのまにか春ですね。
個人的には春が一番好きでして、いろんなものが新しくなるので心機一転て感じです。
できれば過去の黒歴史もバッサリ捨て去りたいので、今回はWindowsのログローテートについて書きます。春からはどんどんいらないファイルは整理していきましょう。
実行環境
Windows 11 Pro
バッチファイルの準備
何らかの業務アプリケーションの操作ログファイルが「C:\Users\testuser\Documents\test」配下に保存されていくと仮定しましょう。
この日々追加されていく永久機関のようなログファイル。手動でポチポチ消すのは面倒ですよね。今回は、これを2週間経過後に定期削除してくれるバッチファイルを解説していきます。
まずはテキストエディタ等で▼のようなバッチファイル(.bat形式)を作成します。
"logrotate.bat"
@echo off setlocal set LOGDIR="C:\Users\testuser\Documents\test" forfiles /P "%LOGDIR%" /M *.log /C "cmd /C Del /S @path" /D -14 exit /B 0
これを、Windowsのタスクスケジューラに組込めば準備完了です。
プログラム解説
@echo off setlocal
▶ @echo offによって出力結果を表示させないようにします。setlocalを使うことで、このプログラム上で使用される環境変数が他に影響しない(ローカル化)ようになります。
set LOGDIR="C:\Users\testuser\Documents\test"
▶ 「LOGDIR」という変数に、今回対象のログ保存先パスを代入します。
forfiles /P "%LOGDIR%" /M *.log /C "cmd /C Del /S @path" /D -14
▶ ややこしいので部分ごとに分けましょう
下記ヘルプから、
/P で該当パスを参照して、
/M でファイルを検索(今回は「.log」という拡張子のファイル)、
/C で任意のコマンドを実行させて、
/D で経過日数を確認します。今回は14日=2週間。
forfilesコマンドヘルプ FORFILES [/P パス名] [/M 検索マスク] [/S] [/C コマンド] [/D [+ | -] {yyyy/MM/dd | dd}] 説明: ファイル (または、ファイルのセット) を選んで、そのファイル上の コマンドを実行します。これはバッチ ジョブの使用に便利です。 パラメーター一覧: /P パス名 検索を開始するパスを示します。 既定のフォルダーは現在実行中の ディレクトリ (.) です。 /M 検索マスク 検索マスクによってファイルを検索します。 既定の検索マスクは '*' です。 /S サブディレクトリに対しても処理を行うように forfiles に 指示します (例: "DIR /S")。 /C コマンド 各ファイルの実行するコマンドを示します。 コマンドの文字列は二重引用符で囲んでくだ さい。 既定のコマンドは "cmd /c echo @file" です。 次の変数をコマンドの文字列に使用することができ ます: @file - フィルの名前を返します。 @fname - 拡張子なしのファイル名を 返します。 @ext - ファイルの拡張子だけを返し ます。 @path - ファイルの完全なパスを返します。 @relpath - ファイルの相対パスを返し ます。 @isdir - ファイルの種類がディレクトリの場合 は "TRUE"を、ファイルの場合は "FALSE" を返します。 @fsize - ファイルのサイズをバイトで返し ます。 @fdate - ファイルの最終更新日を返し ます。 @ftime - ファイルの最終更新時刻を返し ます。 コマンド ラインに特殊文字を使用する場合は、 文字を 16 進数コードで 0xHH 形式で (例: タブは 0x09) 指定してください。CMD.EXE の 内部コマンドの前には "cmd /c" が必要 です。 /D 日付 最終更新日が指定された日かもしくはそれ 以降 (+)、または指定された日またはそれ 以前 (-) であるファイルを "yyyy/MM/dd" 形式を使っ て選択します。または、最終更新日が現在 の日にちより "dd" 日あと、もしくは "dd" 日 前であるファイルを選択します。有効な "dd" 値は 0 から 32768 の間です。 指定がない場合は、"+" が既定で使用さ れます。 /? ヘルプまたは使用法を表示します。
"cmd /C Del /S @path"
▶ この箇所で削除コマンドの「Del」、/S @pathで指定ファイルをすべてのサブディレクトリからも削除して、削除したファイル名を表示させます。
exit /B 0
▶ exitに「/B」を付与することでバッチ終了、終了コード「0」を指定することでエラーを返さずcmd.exeを終了できます。
実行結果
試しにコマンドプロンプトから以下を手動実行するとデバッグが可能です。
適当にファイルを置いて、/Dオプションを除いた結果を確認してみます。
testuser> forfiles /P "%LOGDIR%" /M *.log /C "cmd /C Del /S @path" 削除したファイル - C:\Users\testuser\Documents\test\test.log 削除したファイル - C:\Users\testuser\Documents\test\test1.log 削除したファイル - C:\Users\testuser\Documents\test\test2.log
ちゃんと削除されましたね。
ここまでできればもう一息。タスクスケジューラの設定をしていきます。
タスクスケジューラへの追加
Windowsの検索とかでタスクスケジューラーを開きます。
メニューから[タスクスケジューラライブラリ]>[タスクの作成]をクリック
▶ [全般]タブではタスク名や「ログオン時のみ実行」等の権限設定を行います。セキュリティオプションは実行したい内容によって任意で調節します。
▶ [トリガー]タブでは実行タイミングを設定します。今回は2/9から毎週日曜日0時としました。
▶ 最後に[操作]タブから作成したプログラムファイルを選択します。
あとはよしなに設定すればPC容量で悩むこともなくなって、4月からはバリバリ活躍できること間違いなし!過去は振り返らずがんばれ新成人!
~完~