ここ数年個人的に使うメーラーはThunderbirdを使っているのですが、自宅のメインパソコンは自作のデスクトップ、外でもガッツリ作業する用の15インチノートパソコン、ちょっとしたお出かけの時に持っていく13インチノートパソコンと複数台のパソコンを使っている。
メールデータ自体はIMAPに対応しており、メールサーバ側に保存されていて良いのですがThunderbirdの設定情報やメッセージフィルタの設定情報も定期的に統一したいと思い立って作成。
(リストア用のスクリプトは別記事にする予定)
設定内容やプログラムの内容は、用途・環境に応じて適切なものが変わります。
各種設定値や環境情報についてよく理解を深め、壊れても良い環境でくまなく検証してください。
なるべく正確に書くように心掛けていますが、本投稿内容を実施される際には自己責任の下でお願い致します。
今回の環境
利用しているOS:Windows11
使っているメーラ:Thunderbird 102.11.2
利用しているPowershellの情報
PS C:\Windows\system32> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.22621.1778
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.22621.1778
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
今回作るスクリプトの仕様(と前提となる条件)
バックアップ作成時にはThunderbirdを念のため止めているので、タスクスケジューラで定期実行はしない感じにします。
設定変更やフィルタの調整などの実施都度、バックアップしたい時に手動で実行する方式。
また、各PCにはNextcloudがセットアップしてあるのでNextcloud経由でバックアップデータを逐次すべての端末に同期しとく感じです。
(これで急にどれか1台の端末が故障しても、どこかにデータは保存される)
上記、踏まえてか箇条書きにすると。
- Windows11のThunderbird
- ThunderbirdのプロファイルをZIP化して指定フォルダに格納
- 古いバックアップファイルをついでにサクア所
- Thunderbirdが起動している状態でバックアップスクリプトを実行した場合は、プロセス停止後にバックアップ
→バックアップファイル作成完了後は再度Thunderbirdを起動する。 - Powershellの機能だけで完結させる
バックアップスクリプト
# 用途に応じて適時変更
$backupFromPath = $env:APPDATA + '\Thunderbird\*'
$backupToFolder = $env:USERPROFILE + '\Desktop\Nextcloud\98_雑多\BackupDir'
$savePeriod = 7
# 基本的に触らなくて良さそうな箇所
$targetProgramName = 'Thunderbird'
$targetExe = "C:\Program Files\Mozilla Thunderbird\thunderbird.exe"
# 内部で使う変数
$thunderbirdExecFlag = $false
# 圧縮後のファイル名はプロセス名+タイムスタンプ
$fileTimestampString = (Get-Date).ToString("yyyyMMddhhmmss")
$backupZipPath = $backupToFolder + '\'+$targetProgramName+$fileTimestampString+'.zip'
# ThunderBirdを停止(Thunderbirdのプロセスが無くなるまで無限ループ)
while($null -ne (Get-Process | Where-Object{$_.ProcessName -like $targetProgramName})){
Get-Process | Where-Object{$_.ProcessName -like $targetProgramName} | Stop-Process
$thunderbirdExecFlag = $true
}
# 古いバックアップ等を削除
$deleteThreshold = (Get-date).AddDays($savePeriod * -1).ToString("yyyyMMddhhmmss")
$delCandidateList = Get-ChildItem -Path $backupToFolder | Where-Object{$_.Name -match $targetProgramName+'...............zip'}
foreach($deleteCandidate in $delCandidateList){
Write-Host $deleteCandidate
if([int64]($deleteThreshold) -ge [int64]($deleteCandidate.ToString().Substring(11,14))){
# ファイルの削除処理
Remove-item $deleteCandidate.FullName
}
}
# 圧縮
Compress-Archive -Path $backupFromPath -DestinationPath $backupZipPath
# バックアップ前に起動していた場合にのみ起動
if($thunderbirdExecFlag){
Start-Process -FilePath $targetExe
}