Unityでゲーム作ってたけど、勢いで適当なアセット追加したら事故って後戻りできなくなった。
と言いつつ、何年も前に作っておいた毎日定時で動くバックアップバッチ?に助けられた。
ただ、単純にコピー元からコピー先に上書きコピーをするだけという動きなので、以前削除したオブジェクトやスクリプトがコピー先に残っており、コピー先から復旧させた際にそれらも復活するという欠陥も持っていた。
作った.ps1ファイルだか.batファイルだかがどこにあるのか分からないので、ゴリゴリとPSを書いて新しく自作する。
ざっくりとした仕様についてはこんなイメージ
1.コピー先にあるフォルダで、指定した期間(例えば3日)を過ぎているものは削除する
2.コピー先にバックアップ当日のフォルダを作成する
3.2で作成したフォルダ内に、バックアップ対象のフォルダをコピーする
PC環境変えた時とかにこのps1ファイルの移行を忘れないとは言えなので、備忘として残しておく。
PowerShellの書き方を思い出したりググりながら小1時間程度で書いたやつなので、ログの出力とかはやってない。
# 変数 ----------------------------
[string] $targetFolderPath = "D:\xx"; # コピー元フォルダパス
[string] $copyToFolderPath = "E:\xx"; # コピー先フォルダパス
[int] $retentatePeriod = 3; # 保存期間
[string] $today = "" # 当日の日付文字列
#----------------------------------
# 関数 ----------------------------
# 古いフォルダの削除
function DeleteOldFolder(){
# 保持期間の数値をマイナスにし、更新日時が「本日-保持期間」以前のフォルダを削除する
$retentatePeriod = $retentatePeriod * -1;
Get-ChildItem $copyToFolderPath | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays($retentatePeriod))} | Remove-Item -recurse -force
}
# 今日の日付のフォルダ作成
function CreateTodayFolder(){
New-Item ($copyToFolderPath) -ItemType Directory
}
# コピーによるバックアップ
function CopyFolder(){
Copy-Item -Recurse $targetFolderPath $copyToFolderPath
}
#----------------------------------
# Main ----------------------------
DeleteOldFolder # 古いフォルダの削除
$today = Get-Date -Format yyyyMMdd; # 今日の日付文字列を取得
$copyToFolderPath = $copyToFolderPath + "\" + $today; # 今日の日付までのフォルダパスに更新
CreateTodayFolder # 今日の日付のフォルダ作成
CopyFolder # コピー実施
#----------------------------------
あとはこの.ps1ファイルをタスクスケジューラーで毎日0時に実行とかにしておけば、勝手にバックアップしてくれる。
なお欠陥として、数日PCを起動しないでおくと、次回実行時にバックアップフォルダがその日のフォルダだけになったりすると思う。
その辺どうにかするなら、バックアップ先フォルダの日付名フォルダ数を確認して、古い順に1つずつ削除していく、とかに修正しておくといいかも。(やる気無し)
ぶっちゃけ探せばバックアップ用フリーツールとかいくらでもあるだろうけども、たまにはね…。