PCが予期せぬシャットダウンをした時など、Excelは自動保存ファイルから回復してくれる機能があり便利ですよね。
でもたまにやってしまうのですが、「自動回復しますか?」ウインドウをうっかり閉じてしまって、「回復できない!ぴえん!」というシーンです(私だけでしたらすみません)。
今回はその自動回復ファイルを自動バックアップしようという件になります(ややこしい)。
スクリプト
1分おきにC:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Excelの中にあるファイルを、Dドライブに保存します。
$sourceFolder = "$env:USERPROFILE\AppData\Roaming\Microsoft\Excel"
$destinationFolder = "D:\Excel Auto Backup"
$excelFiles = Get-ChildItem -Path $sourceFolder -Filter "*.xlsx"
$logFilePath = Join-Path -Path $destinationFolder -ChildPath "backuplog.txt"
foreach ($file in $excelFiles) {
$timestamp = Get-Date -Format "yyyyMMdd HH:mm:ss"
$backupActivity = @()
$sourceFilePath = $file.FullName
$destinationFilePath = Join-Path -Path $destinationFolder -ChildPath $file.Name
if (Test-Path -Path $destinationFilePath) {
if ((Get-FileHash -Path $sourceFilePath).Hash -ne (Get-FileHash -Path $destinationFilePath).Hash) {
Copy-Item -Path $sourceFilePath -Destination $destinationFilePath -Force
$activity = " '$($file.Name)' は上書きバックアップされました。"
$backupActivity += $timestamp + $activity
}
else {
$activity = " '$($file.Name)' は変更がなかったのでバックアップされませんでした。"
$backupActivity += $timestamp + $activity
}
}
else {
Copy-Item -Path $sourceFilePath -Destination $destinationFilePath
$activity = " '$($file.Name)' 新しいバックアップが作られました。"
$backupActivity += $timestamp + $activity
}
$backupActivity | Out-File -FilePath $logFilePath -Append
}
手順
-
上のPS1スクリプトをドキュメントフォルダなどに保存します。
-
タスクスケジューラに登録します。以下のコピペでOKです。
$scriptPath = "$env:USERPROFILE\Documents\ExcelBackup.ps1"
$taskName = "ExcelBackupTask"
$taskDescription = "3分おきにExcelをバックアップ"
Register-ScheduledTask -TaskName $taskName -Action (New-ScheduledTaskAction -Execute 'PowerShell.exe' -Argument "-File `"$scriptPath`"") -Trigger (New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 3) ) -Description $taskDescription -User "SYSTEM"
結果のイメージ
ログも同じフォルダに出力されています。
注意点
・自動回復ファイルは、Excelを開きなおしたときに初めて生成されるようで、すぐに消してしまうと1分もないのでバックアップが間に合わないかもしれません。
・PCのパフォーマンスに影響がなければタスクを5秒おきとかにすればよいと思います。(New-TimeSpan -Seconds 5)
・5秒のタスクを24時間回すのが気になる場合は、「Get-ProcessでExcelプロセスが存在した場合に初めて実行する」スクリプトにしても良さそうです。