Robocopyコマンドのログ情報をPowerShellで解析してオブジェクト化するモジュール
Robocopyコマンドの/LOGオプションを利用すると、下記のようにログファイルが出力されます。
しかしながらこのログ情報はテキスト形式で視認性はいいものの”何件のファイルがコピーされたのか”、”失敗があったかどうか”を別のプログラムで処理したいときは面倒です。
そこでRobocopyの末尾に記録されているログファイルから情報を抜き出してオブジェクト化するPowerShellモジュールを作成しました。
このモジュールのコマンドを利用すると下記画像のように、Robocopyのログデータをオブジェクトのプロパティとして参照して他のプログラムで利用することができます。
利用方法
モジュールのインポート
GitHubリポジトリからRobocopyLog.psm1ファイルをダウンロードしてください。readme.txtの確認もお願いします。
ダウンロードしたらPowerShellの冒頭で下記のコマンドを実行します。
Import-Module <RobocopyLog.psm1へのパス>
または$env:PSModulePathに保存されているディレクトリにRobocopyLog.psm1を保存すると、Import-Moduleコマンド不要でPowerShell起動時に自動でモジュールファイルを読み込んでくれます。
コマンドのフォーマット
Get-RobocopyLogSummaryコマンドの<path>にRobocopyコマンドで保存したログファイルのパスを指定してください。
Get-RobocopyLogSummary -path <path>
するとPowerShellカスタムオブジェクトでログファイルの末尾に記録されている情報を抜き出します。
オブジェクトのプロパティ
コマンドの出力オブジェクトは次のようなプロパティを持っています。
合計 | コピー済み | スキップ | 不一致 | 失敗 | Extras | |
ディレクトリ(double型) | .DirsTotal | .DirsCopied | .DirsSkipped | .DirsMismatch | .DirsFAILED | .DirsExtras |
ファイル(double型) | .FilesTotal | .FilesCopied | .FilesSkipped | .FilesMismatch | .FilesFAILED | .FilesExtras |
バイト(double型) | .BytesTotal | .BytesCopied | .BytesSkipped | .BytesMismatch | .BytesFAILED | .BytesExtras |
時刻(TimeSpan型) | .TimesTotal | .TimesCopied | なし | なし | .TimesFAILED | .TimesExtras |
また、上の表以外に次のようなプロパティがあります。
.IsSkipped
1つでもスキップしたディレクトリやファイルがある場合に$true、1つもなければ$falseになるBool型です。
.IsMismatch
1つでも不一致になったディレクトリやファイルがある場合に$true、1つもなければ$falseになるBool型です。
.IsFailed
1つでも失敗になったディレクトリやファイルがある場合に$true、1つもなければ$falseになるBool型です。
.IsExtras
1つでもExtras(保存先から削除された)ディレクトリやファイルがある場合に$true、1つもなければ$falseになるBool型です。
.Speed
平均転送速度のバイト/秒、long型です。
また、ディレクトリ、ファイル、バイトにはそれぞれDirsArray、FilesArray、BytesArrayプロパティがあり、表の各要素を配列で格納しています。
たとえば.DirsArray[0]は.DirsTotal、.DirsArray[1]は.DirsCopied・・・と同じ値が格納されています。forループなどでご利用ください。
コマンドの利用例
総コピーファイル数を表示する
$RCLog = Get-RobocopyLogSummary .\robocopy.log
write-host '総コピーファイル数は'$RCLog.FilesCopied
失敗件数が1件でも存在すればエラーを表示する
$RCLog = Get-RobocopyLogSummary .\robocopy.log
if($RCLog.IsFailed){write-host '処理に失敗したデータがあります'}
転送時間を分で表示する
$RCLog = Get-RobocopyLogSummary .\robocopy.log
write-host '総転送時間は'([int]$RCLog.TimesCopied.TotalMinutes)'分です'
また、PowerShell標準のConvertTo-Jsonコマンドで簡単にJSON化も可能です。
まとめ
Robocopyの処理結果次第で他の処理を行いたい場合にご活用ください。