極力、”追加コンポーネントをインストールせずに。”という条件で探してみたのですが
最終的には、Com経由で shell.application の機能を呼び出すという結論に至ってしまいました。
#C# 標準だとUnzipの機能ないんやね・・・。
サンプルコードは以下になります。
$sh = new-object -com shell.application
$targetfolder = $sh.namespace("I:\meke\dest\")
$zipFile = $sh.namespace("I:\meke\hoge.zip")
$zipFile.Items() | ForEach-Object {
$targetfolder.copyhere($_.Path)
}
1行目で、ExplorerのComオブジェクトを生成しています。
2行目は、Zipの中身を解凍する解凍先フォルダを指定しています。
ここでは何故か、I:\meke\dest フォルダを指定しています。
3行目は、解凍元のZipファイルを指定しています。
とりあえず、フルパスべた書きにしています。
5行目は、Zipファイルの中に含まれているファイル一覧を取得して、ループの中で一つずつ取り出しています。
ExplorerのZip解凍をPoerShellから呼び出しているイメージです。
そのため、解凍先に同名のファイルがあった場合、上書きするかどうか確認のダイアログが出ます。
これ、オプションとかで何とかならないかな、、、
あと、処理としてもちょっと遅いようです。(一般に公開されているUnZipライブラリと比べると)
でもまぁ、何もインストールしなくても使えるということで、何かの際には使えるかも。
#続きに、試行錯誤の結果をメモとして残しています。