というわけで(?) PowerShell でZipを回答するスクリプトを作ってみました。
極力、”追加コンポーネントをインストールせずに。”という条件で探してみたのですが
最終的には、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ライブラリと比べると)
でもまぁ、何もインストールしなくても使えるということで、何かの際には使えるかも。
#続きに、試行錯誤の結果をメモとして残しています。
今回、色々調べるのに参考にさせていただいたサイト。
■実は、.net framework のクラスライブラリで何とかなるんじゃないかと思って調べていた編。
#.net 3.0 で追加された、
ZipPackageクラスで、解凍できるんじゃないかと思っていたのです、、、
# どうもZip作るだで解凍は出来ないっぽい・・・
[C#]ZipPackage (.net framework 3.0, System.IO.Package) - いろいろ備忘録日記
Zip アーカイブを生成する関数 - C#と諸々そもそも、.net framework 3.0 系ライブラリをPowerShellから使う方法が分からなくて、もんどり打ったりもしてました。
.NETアセンブリをロードするには(PowerShell 入門) PowerShellでWindowsサービスは作成できなかった - エンジニアの魂PowerShellのスクリプト中に、C#のコードを書く方法で参考にさせてもらいました。
自分でコマンドレット作っちゃうぞコノヤロー
みたいな時期もありました。
コマンドレットの作成方法 - C#と諸々#標準ライブラリにZip解凍が無かったので、作りませんでしたが、、、
■意を決して外国のフォーラムをのぞいてみた。
A way to zip/unzip zip files in PowerShell?海外の人も同じ質問もってるのねん。
Info-Zip って、お勧めなのだろうか、、、
今回試しませんでしたが、、、
このフォーラムに含まれているリンクから、今回の エクスプローラーを使う方法を教えてもらいました。
ここだったかな?
MSH out-zip Function How to unzip files using Shell.applicationunzip-file.ps1■他のツールを入れてもオーケーな状況の場合
大量のZIPをPowerShellで解凍Unzip.exeというのを使われているそうです。
実は、これが一番簡単だったのでは。という説も・・・(ダメ)
■もしかして、VistaのSUAを使うという選択肢も?(PowerShellじゃなくなってるけど、、、)
【OS-1グランプリ】SUAって何だ!?
第1回:それはVista Ultimateに隠れていたBashが無かったので、今回は見送ってしまいましたがVistaでUnixシェル環境というのは、ちょっと面白そうかも。
SSHは、標準では無いですが、OpenSSHをいれて使う方法とか誰か調べてそうだなぁ。