バックアップをする時にバックアップ時点毎にデータを保持しておく”世代管理”という方法があります。ちょうど世代管理でバックアップを行いたいデータがあったので、いつも使っているRobocopyとPowershellを組み合わせてバックアップ用のスクリプトを作りました。
#Powershell
#コピー元コピー先の設定
$CopyFrom = [コピー元]
$CopyDest = [コピー先]
#コピー先のフォルダ数確認
#6フォルダ以上ある場合は古いものから削除
$FolderCount = (Get-ChildItem $CopyDest | Where-Object { $_.PsIsContainer }).Count
While($FolderCount -ge 6){
#コピー先内のフォルダ一覧を昇順ソートして変数に格納
$DltPass = Get-ChildItem $CopyDest | Where-Object { $_.PsIsContainer } | Sort-Object
#最も古い日付のフォルダ削除
Remove-Item -Path ($CopyDest +"\"+ $DltPass[0].Name) -Force
$FolderCount = (Get-ChildItem $CopyDest | Where-Object { $_.PsIsContainer }).Count
}
#当日の年月日からコピー先フォルダを生成
New-Item ($CopyDest +"\"+ (Get-Date -Format "yyMMdd")) -ItemType Directory
#データコピー
Robocopy $CopyFrom ($CopyDest +"\"+ (Get-Date -Format "yyMMdd")) /S /R:5 /W:0 /LOG+:$CopyDest\log.txt
実行するとコピー先フォルダの下にyymmdd形式で命名されたフォルダができ、その下にデータがコピーされます。コピー先フォルダの下に6つ以上フォルダがある場合、フォルダ名で昇順ソートして先頭に来たフォルダを削除する仕組みです。
念のため、コピー先フォルダ直下にバックアップのログが残るようにしています。エラー処理等は一切していませんが、自分用ならとりあえずはこれで十分といったところです。
Robocopyは単体でも便利なのですが、Powershellから呼び出して使うこともできるので、アイデア次第では様々なやりたい事に対応できて便利です。