DMARCレポートがgzやzipで圧縮されて送られてきます。この圧縮ファイルをPowerShellで展開しようと思ったのですが、gzがうまく展開できませんでした。そこで7zipの力を借りて解凍してみました。
DMARCの設定方法はこちら
展開したXMLファイルをパースしてDBへインサートする方法はこちら
前提
圧縮ファイルを展開するps1ファイルと同階層に Row フォルダを作成します。このフォルダに圧縮ファイルを置きます。圧縮ファイルが展開されたら同階層の Expand フォルダに移動させます。(Expandフォルダも作成しておきます。)
7zipはインストールしないやりかたで使用します。コマンドラインから実行させます。7zipはこちらから取得できます。
「7-Zip Extra: コンソール板, 7z DLL, Plugin for Far Manager」をダウンロードします。拡張子がz7なので解凍するには7zipが必要ですね。必要でしたら「7-Zip Windows版」もダウンロード・インストールしてください。
ダウンロードしたコンソール版を解凍したらフォルダ内の「7za.exe」を適切な場所に配置してください。(ソースコードではps1ファイルと同階層に \7zip\7za.exe として置いています。)
ソース
$expand_path = (Split-Path $myInvocation.MyCommand.Path -Parent) + "\Expand"
$temp_path = (Split-Path $myInvocation.MyCommand.Path -Parent) +"\Row"
$7zip_exe = (Split-Path $myInvocation.MyCommand.Path -Parent) + "\7zip\7za.exe"
# gzやzipファイルすべてを取得する
$items = Get-ChildItem $temp_path -File
foreach ($item in $items) {
# .gzファイルを解凍
$strSrc = " x -y -o" + $expand_path + " " + $item.FullName
Start-Process $7zip_exe -Verb runas -ArgumentList $strSrc -Wait
# 展開終了後、本体ファイルを削除する
Remove-Item $item.FullName
}
解説
PowerShellで7zipを動かすには Start-Process コマンドを使用します。-Verb runas で管理者として実行しています。-AugumentList で7zipコマンド利用するパラメーターを指定できます。-Wait でこのプロセスが終了するまでプログラムを止めておくことができます。
7zipコマンドを利用したファイルの展開方法は以下の通りです。
7za.exe x -y -o展開後に配置するフォルダ名 展開するファイル名
オプションxは「展開する」ことを表します。-yは上書き確認ですべてyes指定します。-oは展開後に配置するフォルダのパスを書きます。そして最後に展開するファイル名のパスを記述します。
まとめ
unzipすることを「展開」と言いますが、昔は「解凍」って言ってましたよね?「展開」と言うか「解凍」と言うかで年齢がバレます。おじさんたちは「展開」と言うようにいたしましょう。
コメント