ちょっと、とあるWebサーバ上にあるZipファイルを定期的にダウンロードして解凍する必要が出てきたんで、適当な言語でスクリプト作ることにしました。ただ、要件としてWindows上で動作する必要があって、せっかくなんで、前から気になってたPowerShellでやってみることにしました。
# Zipファイル操作用のライブラリをロード
[System.Reflection.Assembly]::LoadFile('C:\temp\ICSharpCode.SharpZipLib.dll')
# WebClientクラスのインスタンスを作成
$wc = New-Object System.Net.WebClient
# Zipファイルをダウンロード
$wc.DownloadFile("http://www.hoge.com/fuga.zip","C:\temp\temp.zip")
# Zipファイルを解凍
$zip = New-Object ICSharpCode.SharpZipLib.Zip.FastZip
$zip.ExtractZip("C:\temp\temp.zip", "C:\temp\" + [DateTime]::Now.ToString("yyyyMMdd"), "")
Zipファイルを解凍する方法は、COMを通してエクスプローラの機能を使うとか、コマンドラインで解凍ソフトを呼び出すとか色々あるみたいだけど、今回は、ICSharpCode.SharpZipLib.dllを使ってみました。PowerShell上で、外部アセンブリのクラスを使用したい場合は、リフレクションを使ってアセンブリをロードしておく必要があるみたいなので最初にロードしてます。[System.Reflection.Assembly]::LoadFileみたいな呼び方してるけど、静的なメンバを呼び出す時はこうしないといけないらしいです。
次にWebClientのインスタンス化、New-Objectコマンドでインスタンス作成です。そのインスタンスのDownloadFileメソッドを使用して、ファイルを同期的に取得しています。
最後に、ICSharpCode.SharpZipLib.dllのFastZipクラスを使用して解凍。解凍したファイルは、日付ごとのフォルダに格納してます。
とまあ、こんな感じで結構簡単にできました( ̄∇ ̄)でも、いざ実行してみるとエラーが・・・( ̄□  ̄ || どうやら、PowerShellではデフォルトの実行ポリシーが「Restricted」になっていて全てのスクリプトの実行が禁止されているとのこと。実行ポリシーは他に「AllSigned、RemoteSigned、Unrestricted」があるそうですが、今回はインターネット上のスクリプトのみ署名を求める「RemoteSigned」にポリシー変更してみました。
Set-ExecutionPolicy RemoteSigned
これをPowerShellのプロンプト上で実行してやれば動くようになりました(^^)