【cmd】毎日決まった時間にバックアップし、一定期間経つと削除する方法

毎日自動でバックアップする方法

目次

作るきっかけ

前の記事でローカルにGiteaを立ち上げてたのですが、さすがにバックアップはしておこうということで自動でバックアップする方法調べました。
ただ、無尽蔵のバックアップしてもストレージを圧迫するだけなので、一定のバックアップ個数になると古いものを消すような細工をしたいと思います。

なおこの記事はGiteaのバックアップを前提に書いていますが、普通のバックアップにももちろん使用できます。

windowsはタスクスケジューラで自動化できる

あまり使っている方は少ないかもしれませんが、windowsにはタスクスケジューラという便利ツールが最初からインストールされています。
これを使用することで特定のタイミングでbatを走らせたりできます。
今回の場合は

  • Giteaのサーバーをシャットダウンする
  • Giteaのデータをバックアップする
  • 古いバックアップを削除する
  • Giteaのサーバーを再起動する

これを毎日自動的にやらせます。

bat作成

では実際に自動化するためのbatを作成してみます。
なお通常のバックアップの場合は、サーバーのシャットダウン、再起動の部分は飛ばして問題ありません

Giteaのサーバーをシャットダウンする

Giteaを立ち上げたままだとコピーできないので、最初はサーバーを落とす必要があります。
そのbatファイルはこのように書きます。
「Gitea」の部分はサービスに登録されている名前です。

ServerShutdown.bat

1sc stop Gitea

Giteaのデータをバックアップする

次に実際にバックアップを取ります。 今日の日付を取得して、20210620のようなフォルダを作成しそこにコピーしてきます。

※バックアップするフォルダとバックアップ先のパスを設定してください
Backup.bat

1echo off
2set now=%date:/=%
3rem コピー元
4Set SourcePath=C:\foo
5rem コピー先
6Set CopyToPath=D:\bar\GiteaBackup\%now%
7robocopy /e /xo "%SourcePath%"  "%CopyToPath%"

古いバックアップを削除する

今度は古いバックアップを削除するbatです。
バックアップしている親ディレクトリを設定して、countで残して置く個数を設定しておきます。

DelOldBackup.bat

1echo off
2rem バックアップしているディレクトリ
3set BackupDir=D:\bar\GiteaBackup
4rem 保存するファイル世代の数
5set count=10
6cd %BackupDir%
7for /f "skip=%count%" %%f in ('dir "%BackupDir%" /b /ad /o-n') do (
8    rmdir rd /s /q "%BackupDir%\%%f"
9)

これについて少し解説しておくと
dir "%BackupDir%" /b /ad /o-nはBackupDirにあるフォルダを降順で列挙します。
つまり202106020, 202106021, 202106022のフォルダがあれば

1202106022
2202106021
3202106020

のように列挙されす。 それをcountで設定した分だけスキップして、for文内にあるrmdirのディレクトリ削除を行うので
countで設定したバックアップ数より多い場合、古いフォルダが削除されるということになります。

Giteaのサーバーを再起動する

最後にGiteaを再起動します。

ServerBoot.bat

1sc start Gitea

スケジュールを登録する

タスクスケジューラはスタートからでもできますが、GUIだと面倒なのでこれもcmdでやってしまいましょう。 先ほど作成したbatファイルをバックアップしているディレクトリに置きます。
イメージとしてはこんな感じ

1GiteaBackup
2    ├20210620 ─ バックアップデータ
3    ...
4    ├Backup.bat
5    ├DelOldBackup.bat
6    ├ServerBoot.bat
7    └ServerShutdown.bat

そして新たに以下のようなbatファイルを作成し、バックアップ頻度や時間を指定(後述)を修正、完成したら管理者として実行で実行します。
TaskAdd.bat

1echo off
2set batDir=D:\bar\GiteaBackup\
3schtasks /create /tn "Giteaシャットダウン" /tr "%batDir%ServerShutdown.bat" /sc DAILY /st 12:05 /rl highest /F
4schtasks /create /tn "Giteaバックアップ" /tr "%batDir%Backup.bat" /sc DAILY /st 12:06 /rl highest /F
5schtasks /create /tn "Gitea旧バックアップ削除" /tr "%batDir%DelOldBackup.bat" /sc DAILY /st 12:09 /rl highest /F
6schtasks /create /tn "Gitea再起動" /tr "%batDir%ServerBoot.bat" /sc DAILY /st 12:10 /rl highest /F
7pause

なにも問題なければタスクスケジューラに登録されています。

意味を解説すると

schtasks /createでタスクスケジューラに新規登録
/tn "Giteaシャットダウン"でタスク名を設定
/tr "%batDir%ServerShutdown.bat"で実行するものを設定
/sc DAILY(1日ごと)で実行頻度を設定
これには他にも、HOURLY(1時間ごと),WEEKLY(一週間ごと),MONTHLY(1か月ごと)などがあります

/st 12:05で実行する時間を指定
自分は12:00から昼休みなので、 12:05にサーバーをシャットダウン->12:06にバックアップ->12:09に重複削除、12:10にサーバー再起動としています。
これはお好みで弄ってください。

/rl highestで管理者として実行します。サービスの停止/実行には管理者実行が必要です。
/F同名のタスクがある場合は上書きします。

指定した時間に実行されれば成功です。

これで万が一メインPCがぶっ壊れてもGiteaのリポジトリは生存できる状態になりました。