【PowerShell】定期的にフォルダをバックアップする

OS強制断時に特定アプリのAppDataが吹っ飛ぶ事象に遭遇したため、定期的にフォルダのバックアップを取得するためのShellを作成したのでメモ。タスクスケジューラに仕込んで自動実行させる。簡単な世代管理機能(期間ベース)も実装。

### FolderBackup
# 指定したフォルダ内の全ファイルをバックアップします。
# バックアップは実行日時を名称とするフォルダ内へ格納されます。
# バックアップの事後処理として古いフォルダを削除します。
###

### Execution Example
# .\FolderBackup.ps1 -src_dir C:\Users\xxx\AppData\Roaming\AppName -dst_base_dir D:\BACKUP\AppName\
###

### Param
# src_dir: コピー対象フォルダ
# dst_base_dir: コピー先フォルダ(基点)
# save_days: 保管日数(省略可)
###
Param (
	[Parameter(mandatory=$true)][String]$src_dir,
	[Parameter(mandatory=$true)][String]$dst_base_dir,
	[int]$save_days = 30
)

# 記録開始
Start-Transcript -Append -Path "FolderBackup.log"

### バックアップ処理

# コピー元のパスをコンソール出力
Write-Host "### Source Path ###`r`n" $src_dir
 
# コピー先の基点フォルダが存在しない場合
if (!(Test-Path $dst_base_dir))
{
	# 基点フォルダを作成する
	New-Item -ItemType Directory -Force -Path $dst_base_dir
}

# コピー先のパスを生成する(年月日_時分秒)
$dst_date = Get-Date -Format("yyyyMMdd_HHmmss")
$dst_dir = $dst_base_dir + "\" + $dst_date
 
# コピー先のパスをコンソール出力
Write-Host "### Destination Path ###`r`n" $dst_dir
 
# コピー先に既にフォルダが存在する場合
if (Test-Path $dst_dir)
{
	# 該当のフォルダを削除する
	Remove-Item $dst_dir -Recurse
}
 
# バックアップの実行(フォルダごとコピー)
Copy-Item $src_dir $dst_dir -Recurse -Force

### 世代管理処理(古いフォルダを削除)

# 削除基準日(システム日付から保管期間分過去の日付)を取得
$del_base_date = (Get-Date).AddDays(-$save_days).ToString("yyyyMMdd")

# 削除基準日をコンソール出力
Write-Host "### Delete Base Date ###`r`n" $del_base_date

# 全フォルダについてループ
$srch_path = $dst_base_dir + "\*"
$folders = Get-Item $srch_path
foreach($f in $folders) {

	# 対象フォルダの最終更新日を取得
	$LastWrite = (Get-ItemProperty $f).LastWriteTime.ToString("yyyyMMdd")

	# 基準日より古い場合
	if ($LastWrite -lt $del_base_date) {

		# フォルダ名がyyyyMMdd_HHmmss形式(誤削除防止)
		if ($f.Name -match "^[0-9]{8}_[0-9]{6}") {

			# 削除対象のフォルダ名をコンソール出力
			Write-Host "### Delete Folder ###`r`n" $f.Name

			# フォルダを削除
			Remove-Item $f -Recurse
		}
	}
}

# 記録終了
Stop-Transcript

コメント

タイトルとURLをコピーしました