treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

robocopyを使って.pstファイルバックアップをやってみる

とても簡単でいいのでOutlookの.pstファイルをバックアップするバッチが必要になり、サンプルバッチファイルを作成してみたのでご報告です。
robocopyの練習も兼ねているので簡素すぎますが、最低限のコピーは可能です。

メールバックアップとして.pstファイルを取得したい

Outlookの.pstファイルを簡単に取得するバッチファイルが必要になったので作成しました。

  • 対象はドキュメントフォルダの中にある「Outlook ファイル」フォルダ内の.pstファイル
  • 対象のWindowsで動作するOutlookが参照しているメールデータのバックアップを取得し、蓄積していく(今回は世代は考慮せず、古いバックアップ手動で削除する)
  • バックアップは同じ「Outlook ファイル」フォルダ内に別フォルダを作成してコピーする

概ね考えたのはこの三点。

基本形のサンプルバッチファイル

早速、サンプルバッチファイルです。シンプルにしています。

--------------------------------------------------------------
PstBAK.bat
--------------------------------------------------------------
@echo off
set todayis=%date:/=-%
set FldDT=%date:~2,2%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%
set BKpstDir=%USERPROFILE%\Documents\Outlook ファイル
set BKdir=%BKpstDir%\Backup%FldDT%

mkdir "%BKdir%"

robocopy "%BKpstDir%" "%BKdir%" *.pst /log:"%BKdir%\log.txt" /v

set todayis=
set FldDT=
set BKpstDir=
set BKdir=
--------------------------------------------------------------

フォルダ名を生成するために日付のデータを「todayis=%date:/=-%」と用意したのですが、"一日に二回実行された場合でもバックアップが保管されるように"と考えて、
「FldDT=%date:~2,2%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%」
をフォルダ名に付加する日付データにしました。例えば2024年8月19日18:00にバッチが実行された場合、

2408191800

が日付情報としてフォルダ名に追加されます。

変数%BKpstDir%には、ドキュメントフォルダの中にある「Outlook ファイル」フォルダを指定しています。(システム変数%USERPROFILE%を使って、ログインユーザのドキュメントフォルダを取得)

バックアップ先として変数%BKdir%で指定しています。パスは<%USERPROFILE%\Documents\Outlook ファイル>配下にBackup+日付データ(例:Backup2408191800)というフォルダ名で.pstファイルの格納先を用意することにしました。

バッチファイル実行時に毎回mkdirコマンドでフォルダを生成し、次のrobocopyコマンドで生成したフォルダ内に.pstファイルをコピーし、その様子をログに記録する、ということにしました。

実際の実行

実際に実行し、.pstファイルのバックアップを取得してみました。

このように、バックアップフォルダが作成され、そのバックアップフォルダ内に、

このように.pstファイルの複製が取得、コピー時のログと一緒に保管されるようになります。

実際にログファイルを確認してみます。

ログファイルのサンプル

ログファイルは以下のようになります。(サンプルです。)

--------------------------------------------------------------
--------------------------------------------------------------

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: 2024年8月13日 2:42:22
   コピー元 : C:\Users\testuser\Documents\Outlook ファイル\
     コピー先 : C:\Users\testuser\Documents\Outlook ファイル\Backup240813 242\

    ファイル: *.pst
            
  オプション: /V /DCOPY:DA /COPY:DAT /R:1000000 /W:30 

------------------------------------------------------------------------------

                           1        C:\Users\testuser\Documents\Outlook ファイル\
          新しいファイル                       0        test.pst
100%  

------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:         1         1         0         0         0         0
      バイト:         0         0         0         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00
   終了: 2024年8月13日 2:42:22

--------------------------------------------------------------
--------------------------------------------------------------

ちなみに、Outlook起動中でも、robocopyの能力で、上手くファイルロックされたタイミングを外してコピー操作を実行してくれます。

ロックファイルでは、

--------------------------------------------------------------

          新しいファイル                  94.2 m        testuser@hoge.com.pst
2024/08/19 18:35:15 エラー 33 (0x00000021) ファイルをコピーしています C:\Users\testuser\Documents\Outlook ファイル\testuser@hoge.com.pst
プロセスはファイルにアクセスできません。別のプロセスがファイルの一部をロックしています。

30 秒間待機しています... 再試行しています...

--------------------------------------------------------------

このログエントリがいくつか記録されたあとで、Outlookプロセスがファイルロックを解除したあとで

--------------------------------------------------------------

30 秒間待機しています... 再試行しています...
          新しいファイル                  94.2 m        testuser@hoge.com.pst
  1.0%
  2.1%
  3.1%

 98.6%
 99.7%
100%  

--------------------------------------------------------------

こういう感じでファイルコピーが完了します。このファイルロックに対するリトライの機能が従来のコピーコマンドであるcopy/xcopyにはないrobocopyの優位点で、今回の.pstのバックアップ用バッチにrobocopyを選んだ理由となります。

さらに進化

単純に.pstファイルをコピーするだけのバッチファイルですが、バックアップという考え方をしたときに、Outlook環境のレジストリキーも同時にバックアップするというのも良いかもしれません。

以前の<OutlookのバックアップをWindows標準機能だけで簡単に自動実行する - treedown’s Report>(対象環境はOutlook2016ベース)を組み込んでみます。

--------------------------------------------------------------
PstBAK_reg-Sig.bat
--------------------------------------------------------------
@echo off
set todayis=%date:/=-%
set FldDT=%date:~2,2%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%
set BKpstDir=%USERPROFILE%\Documents\Outlook ファイル
set BKdir=%BKpstDir%\Backup%FldDT%
set regKey=HKCU\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook
set BKFNAME=OutlookProfile.reg

mkdir "%BKdir%"

robocopy "%BKpstDir%" "%BKdir%" *.pst /log:"%BKdir%\log.txt" /v
reg export "%regKey%" "%BKdir%\%BKFNAME%" /y
xcopy /Y C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Signatures "%BKdir%\Signetures\" /D /I

set todayis=
set FldDT=
set BKpstDir=
set BKdir=
set regKey=
set BKFNAME=
--------------------------------------------------------------

単純にエクスポート対象のレジストリキーを変数%regKey%に用意し、.pstファイルを保存するのと同じディレクトリに「OutlookProfile.reg」ファイルを保管するようにしました。ついでにSigneturesフォルダ(メールの署名データ)も保存しておきます。

これを実行すると、

このように、Outlookの環境を示すレジストリキーと、設定済の署名ファイルと同時に、.pstファイルのバックアップを取得することができるので、あとはこのファイルを外付けHDDなりNASの共有フォルダなりに保存すればバックアップとしては有用なデータが取れていると言えます。

なお、NASなどの共有フォルダに保存する場合には

set BKdir=%BKpstDir%\Backup%FldDT%

の行でローカルのOutlook ファイルフォルダを指定している変数"%BKpstDir%"の部分を、サーバの共有フォルダ"\\ServerNAME\ShareFolder"とすれば、直接サーバの共有フォルダに「Backup2408191800」フォルダを生成してバックアップを保存するようになります。

ここの指定を変更するだけでバックアップ保存先を変更できるのもシンプルなバッチの利点ですね。