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の処理結果次第で他の処理を行いたい場合にご活用ください。

広告