Partager via


メッセージ追跡ログを CSV ファイルに出力する方法

こんにちは。Exchange サポート チームの小間です。
今回はメッセージ追跡ログを CSV ファイルに出力する方法をご紹介します。

Exchange 2007 以降、Exchange 管理シェルの Get-MessageTrackingLog コマンドでメッセージ追跡ログを検索して表示することが出来ます。
また、PowerShell には Export-Csv コマンドが用意されており、CSV ファイルへのデータの出力も可能です。

これらを組み合わせることで検索したメッセージ追跡ログを CSV ファイルに保存することが出来ます。
例えば以下のようにコマンドを実行して、変数に保存したメッセージ追跡ログの内容を CSV ファイルに保存したとします。

  $Logs = Get-MessageTrackingLog -MessageSubject "Test Mail"
  $Logs | Export-Csv C:\Logs.csv -Encoding Default -NoTypeInformation

ところが保存した CSV ファイルを開くと、以下のように正しく情報を読むことが出来なくなっています。
以下の例では、P 列の Recipients などが「System.String[]」となってしまっています。

  

これは PowerShell (Exchange 管理シェル) の内部で Recipients のデータ型が配列になっており、配列の内容をそのままでは Export-Csv コマンドで出力することが出来ないためです。
配列の内容を CSV にエクスポートするには、Select コマンドを併用します。例えば Recipients の内容をすべて出力するには以下のようにコマンドを実行します。

  $Logs | Select Sender,{$_.Recipients},MessageSubject | Export-Csv C:\Logs.csv -Encoding Default -NoTypeInformation

今度は Recipients の内容が以下のように正しく出力されました。
ですが、Select コマンドに指定した項目以外は出力されていませんし、Recipients のヘッダーも「$_.Recipients」になってしまいました。

  

Select コマンドに指定した項目以外は出力されない動作となるため、手間ではありますが必要な項目はすべて明示的に指定する必要があります。
「$_.Recipients」になってしまったヘッダーは、明示的に Name を指定することで「Recipients」と出力することが出来ます。
例えば以下のように実行します。

  $Logs | Select Sender,@{Name='Recipients';Expression={$_.Recipients}},MessageSubject | Export-Csv C:\Logs.csv -Encoding Default -NoTypeInformation

 

このように、今度こそ綺麗に出力することが出来ました。

なお、Expression に指定している内容はそれ自体が PowerShell コマンドです。
そのため、「セミコロン区切りで Recipients の内容を出力する」、といったことも可能です。
例えば以下のように実行すると、Recipients のメール アドレスがセミコロン区切りで出力されます。

$Logs | Select Sender,@{Name='Recipients';Expression={[String]::Join(";", $_.Recipients)}},MessageSubject | Export-Csv C:\Logs.csv -Encoding Default –NoTypeInformation

この方法は Export-Csv コマンドを使うとき以外にも、HTML 形式で出力する ConvertTo-Html コマンドを使用するときにも利用できます。
トラブルシューティングなどで検索したメッセージ追跡ログをファイルに保存する時にご活用ください。

今後も当ブログおよびサポート チームをよろしくお願いいたします。