システムログを削除するバッチを作ってみる

システムログを削除するバッチを作ってみる

目次

はじめに
バッチファイルとは?
文字列を表示してみる
主なコマンド
フォルダ/テキストファイルを作成してみる
ファイルネームを指定し、大量にテキストファイルを作ってみる
過去10日以上前のシステムログを削除するバッチを作ってみる
おわりに

はじめに

定期的にシステムログを削除するバッチファイルを作成するお仕事をいただきました。
せっかくなので、バッチファイルって何? どうやって作るの? という状態からの作成過程を共有していきたいと思います!

バッチファイルとは?

バッチファイル(batch file)は、Windowsのコマンドプロンプトで実行される一連のコマンドを記述したテキストファイルのことです。
拡張子は「.bat」や「.cmd」です。バッチファイルを実行すると、ファイルに記載されたコマンドが順に自動的に実行されます。

文字列を表示してみる

とりあえず、プログラミングのお約束の呪文を表示してみたいと思います。
下記コマンドをメモ帳で編集し、拡張子を「.bat」にして保存後実行します。

***
echo Hello,World!
pause
***

image.png

なんだかこれだとごちゃごちゃしてわかりづらいですね。
もうちょっとすっきりさせたいと思います。


***
echo off
echo Hello,World!
pause
***

image.png

一番上にコマンドが残っているのが気になります。もっとシンプルに!

***
@echo off
echo Hello,World!
pause
***

image.png

できました!
表示したい文字列だけを表示できました。
Hello,World!を見るとプログラミングの勉強してるな!って感じが出てワクワクしますね。

主なコマンド

バッチファイルで使用する主なコマンドの一覧です。

コマンド説明
echoメッセージを表示。
pause一時停止。
cls画面をクリア。
mkdir新しいフォルダを作成。
delファイルを削除。
copyファイルをコピー。
if条件分岐を実行。
for繰り返し処理を実行。
start外部プログラムやファイルを起動。

フォルダ/テキストファイルを作成してみる

では早速フォルダを削除するバッチ…を作る前に、削除するためのフォルダやテキストファイルを作成するためのバッチを作ってみます。
検証するときにいちいち手作業で作るのは面倒くさいからです。
とりあえず、デスクトップにtestフォルダを作りましょう。バッチ先生、お願いします!

***
@echo off
echo フォルダを作成しています…
mkdir “%USERPROFILE%\Desktop\test”
echo フォルダ “%USERPROFILE%\Desktop\test” を作成しました。
pause
***

image.png
image.png

一瞬で作成できました! らくちんです。
では中身も作ってもらいます。とりあえずテキストファイルを一つ作ってみましょう。

***
@echo off
echo フォルダを作成しています…
mkdir “%USERPROFILE%\Desktop\test”
echo フォルダ “%USERPROFILE%\Desktop\test” を作成しました。
pause

set “test=これはテストテキストです。”
echo %test% > “%USERPROFILE%\Desktop\test\sample.txt”
echo sample.txtを作成しました。
pause
***

image.png

ちょこちょこ失敗しましたが、想定通り動くものが作れました!

ファイルネームを指定し、大量にテキストファイルを作ってみる

さて削除バッチを…作る前に、もっと大量のテキストファイルを作ってみたいと思います。
あと、末尾に日時をいれたい!
できるなら、今日から3か月前までの日付をいれたい!
ひとつひとつやっていきます。
まずは「テキストファイルを大量に作る」ところから。
プログラミングっぽくなってきました。for文を使用します。

***
for /L %%N in (1,1,100) do (
echo これは%%N番目のファイルです。 > “%USERPROFILE%\Desktop\test\sample%%N.txt”
)
echo テキストファイルの作成が完了しました。
pause
***

・%%変数
ループ内で使う一時的な変数。バッチファイル内では必ず %% を使い、後ろに1文字のアルファベット(例: %%A, %%B)を指定します。

/L
for文のオプションで、数値のループを作成できます。

・(1, 1, 10)
開始値: 1
増加値: 1
終了値: 100

では実行してみます。

image.png

一瞬で大量にテキストができました!楽しい!数字を増やすだけで1万だって10万だって作れちゃいます!

次は、sample{変数}.txtの変数に、日時を入れたいですね。修正しましょう。
日付の扱いに関しては、cmdだけでもできるらしいですが、PowerShellを使ったほうが楽だとのことなので、PowerShellを利用します。
楽できるところは徹底的に楽をしていく姿勢で進んでいきます。
とりあえず日付を表示します。

***
@echo off

:: PowerShell を使って今日の日付を取得
for /F %%D in (‘powershell -NoProfile -Command “(Get-Date).ToString(\”yyyyMMdd\”)”‘) do(
set todayDate=%%D
)

:: 結果を表示
echo 今日の日付: %todayDate%

pause
***

・powershell
PowerShell をコマンドラインから実行するためのコマンドです。

・-NoProfile
PowerShell のプロファイル(初期設定スクリプト)を読み込まずに実行します。

-Command
次に続くコマンドを PowerShell 上で実行します。

・(Get-Date)
PowerShell のコマンドレットで、「現在の日付と時刻」を取得します。
結果は 日付と時刻のオブジェクト として返されます(例: 2024年1月27日 14:30:00)。

.ToString(\”yyyyMMdd\”)
(Get-Date) で取得した日付オブジェクトを、yyyyMMdd 形式の文字列に変換します。

image.png

今日の日付がいい感じに取得できました!
これを、100日分、テキストファイルとして出力したいです!
前述したfor文を使うと簡単に生成できそうです。

***
@echo off
setlocal enabledelayedexpansion

:: 現在の日付を基準に、100日前から今日までの日付を計算しファイルを作成
for /L %%N in (0,1,99) do (
:: 日付を PowerShell で計算
for /F %%D in (‘powershell -NoProfile -Command “(Get-Date).AddDays(-%%N).ToString(\”yyyyMMdd\”)”‘) do (
set fileDate=%%D
)
:: ファイルを作成
echo これは%%N日前の日付 %fileDate% のファイルです。 > “%USERPROFILE%\Desktop\test\sample_%fileDate%.txt”
)

echo テキストファイルの作成が完了しました。
pause
***

これでどうでしょうか!ポチー
…がっ、駄目っ…なぜかうまく生成されません…。

どうやらPowerShellのコマンドがうまく動作していないようです。
試行錯誤しましたがうまく動かないので、やり方を変えましょう。

「最初にPowerShellで100日前までの数値を用意して、そのリストをfor文で回す」という
やり方に変更してみます。

***
@echo off
setlocal enabledelayedexpansion

:: フォルダを作成
echo フォルダを作成しています…
mkdir “%USERPROFILE%\Desktop\test”
echo フォルダ “%USERPROFILE%\Desktop\test” を作成しました。
pause

:: PowerShell を 1 回実行して、100日前から今日までのすべての日付を取得
for /F %%A in (‘powershell -NoProfile -Command “for ($i=0; $i -lt 1000; $i++) { (Get-Date).AddDays(-$i).ToString(‘yyyyMMdd’) }”‘) do (
set “fileDate=%%A”
setlocal enabledelayedexpansion
echo これは日付 !fileDate! のファイルです。 > “%USERPROFILE%\Desktop\test\sample_!fileDate!.txt”
endlocal
)

echo テキストファイルの作成が完了しました。
pause
***

powershell -NoProfile -Command
“for ($i=0; $i -lt 100; $i++)
{ (Get-Date).AddDays(-$i).ToString(‘yyyyMMdd’) }”‘

このコマンドで
20250124
20250123
20250122…
というデータを作っています。

setlocal enabledelayedexpansion
バッチスクリプトでは、環境変数は1度展開された後に変更されても同じスコープ(ループやブロック)内ではその変更が反映されないという特性があるため、上記コマンドで最新の変数値をリアルタイムで使うことができるようにしています。

image.png
image.png

無事できました!やったー!!

過去10日以上前のシステムログを削除するバッチを作成してみる

はい。ということで長くなりましたが、本題です。
末尾8桁を抽出し、過去10日以上前のシステムログを削除するためのバッチを作成します。

***
@echo off
setlocal enabledelayedexpansion

:: PowerShell を使って本日から10日前の日付を取得
for /F %%D in (‘powershell -NoProfile -Command “(Get-Date).AddDays(-10).ToString(\”yyyyMMdd\”)”‘) do (
set “pastDate=%%D”
)

:: 10日前の日付を確認(デバッグ用)
echo 10日前の日付: %pastDate%
echo.

:: ログディレクトリ内のファイルをチェック
for %%F in (“%USERPROFILE%\Desktop\test*.txt”) do (
:: ファイル名から日付部分(末尾8桁)を抽出
set “fileName=%%~nF”
set “logDate=!fileName:~-8!”

:: 日付が有効かチェック(数字8桁かどうか)
echo 対象ファイル: %%F / 日付部分: !logDate!
if “!logDate!” GEQ “00000000” if “!logDate!” LEQ “99999999” (
:: 日付が10日前より古い場合は削除
if “!logDate!” LSS “%pastDate%” (
echo 削除します: %%F
del “%%F”
) else (
echo 残します: %%F
)
) else (
echo 日付部分が不正なファイルです: %%F
)
)

echo 処理が完了しました。
pause
***

・if “!logDate!” GEQ “00000000”
GEQ: Greater than or Equal(大なりまたは等しい)
意味: 変数 logDate の値が 00000000 以上であるかを確認します。

・if “!logDate!” LEQ “99999999”
LEQ: Less than or Equal(小なりまたは等しい)
意味: 変数 logDate の値が 99999999 以下であるかを確認します。

・if “!logDate!” LSS “%pastDate%”
意味: 「左側の値が右側の値より小さい場合」に処理を実行します。

ではさっそく作った.batファイルを動かしてみます!

動かしてみると……

image.png

この大量のテキストファイルが……

image.png

あっというまに削除されました!!
やったー!!スクロールバーが異様に小さいフォルダを永遠にドラッグしつづける地獄から解放されたぞ!!祭りだー!!

おわりに

というわけで、クリックするだけでログファイルを削除してくれるバッチを作成してみました。
今回、バッチファイルを初めて作成しましたが、これがあれば何でもできるという万能感を感じられました。
今後もいろいろと試していこうと思います!!