Powershell Windows11 パソコン関連 バックアップ関連

[Powershell]Thunderbirdの設定をバックアップするスクリプト

 ここ数年個人的に使うメーラーは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
}

-Powershell, Windows11, パソコン関連, バックアップ関連
-, , , ,