fc2ブログ

t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
PowerShell でZipを回答する。(エクスプローラーの機能で)
というわけで(?) 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.application

unzip-file.ps1


■他のツールを入れてもオーケーな状況の場合

大量のZIPをPowerShellで解凍

Unzip.exeというのを使われているそうです。
実は、これが一番簡単だったのでは。という説も・・・(ダメ)


■もしかして、VistaのSUAを使うという選択肢も?(PowerShellじゃなくなってるけど、、、)

【OS-1グランプリ】SUAって何だ!?
第1回:それはVista Ultimateに隠れていた


Bashが無かったので、今回は見送ってしまいましたがVistaでUnixシェル環境というのは、ちょっと面白そうかも。
SSHは、標準では無いですが、OpenSSHをいれて使う方法とか誰か調べてそうだなぁ。


記事が参考になりました。ありがとうございます。
7年前の記事ですが、Windows 7環境においては今もなお便利なスクリプトでした。
私は、カレントディレクトリにあるすべてのzipファイルに対し、そのzipファイル名でフォルダを作って、その中に展開したかったので、下記のようにしました。

$sh = new-object -com shell.application

foreach ($zipFile in (dir *.zip)){
$zipFileName = $zipFile.FullName
$zipFileBaseName = $zipFile.Directory.FullName + "\" + $zipFile.BaseName
$zipObj = $sh.namespace($zipFileName)
mkdir $zipFileBaseName -force
$targetfolder = $sh.namespace($zipFileBaseName)

$zipObj.Items() | ForEach-Object {
   $targetfolder.copyhere($_.Path)
}
}
2015/10/19(月) 11:56:23 | URL | [ 編集]












管理者にだけ表示を許可する


トラックバックURL: