SOHO Windows Small Business Server 道具箱

SOHO、Microsoft Windows Small Business Server(SBS) 2003 R2

バッチファイルからPowerShellでZIP圧縮

バッチファイルで、ZIPファイルは作れないものか?

と、思って調べていくと、色々な方法があるもんですが、Windows PowerShell 2.0 を利用した方法がありました。

David Aiken - Compress Files with Windows PowerShell then package a Windows Vista Sidebar Gadget

に Windows PowerShell でZIPファイルを作る方法が記載されていました。

しかしながら、不思議な現象に直面。
 

  • Windows PowerShellのプロンプトから実行すると、サブディレクトリ内のファイルまで含めて、問題なくZIP圧縮できるのですが、
  • バッチファイルから当該スクリプトを呼び出すと、サブディレクトリの最初の1個のファイルだけがZIP圧縮されるか、あるいは、空のZIPファイルができる
という現象にぶつかりました。

で、いろいろ試した結果、David Aikenさんのスクリプトの中に、ZIP圧縮を開始した後に、

Start-sleep -milliseconds 500

というコードがあって、

これも調べてみると、Windowsの shell.application を使った方法では、複数のファイルやフォルダを圧縮する際に、圧縮がおわったら、次の圧縮を始める、という”同期的な”動作ができないんだそうです。 CopyHere というメソッドが開始されるとすぐに帰ってきてしまうのだそうです。

なので、500ミリ秒の待ち時間を入れている。

この待ち時間が足りないと、2番目以降に始まった圧縮ファイルをZIPの中に入れることができなくて、意味不明な名前のバイナリファイルができあがる。

で、結局、私が試した環境では、3つのサブディレクトリに、合計2,700個のファイルがあったのですが、上記の待ち時間を、8,000ミリ秒〜10,000ミリ秒、つまり、8秒〜10秒 にしてやると、すべてのファイルが正しくZIP圧縮されました。

でも、圧縮に要する時間なんて、ファイル数はもちろん変化するし、マシン・スペックや、他のプロセスの動作状況によっても変わるから、例え、10秒の待ち時間を入れたとしたって、安全じゃない。

バッチファイルはあきらめて、すべてをPowerShellで書くかなぁ〜。。。 などと思いつつ調べていくと、あるじゃありませんか、もっといい方法が!

吉岡照雄さんの ZIP.PS1 - PowerShellでZIP圧縮/展開する

吉岡さんのアルゴリズムは、待ち時間を入れるのではなく、ZIPファイルの中のファイル数を比較して、次の圧縮処理を始める。 合理的です。 すばらしい! 完璧です。

しかも、このアルゴリズムでは、余分な待ち時間を入れないので、全体の処理時間が速いです。

で、バッチファイルから呼び出す場合は、以下のような感じ。
Powershell -command "& { C:¥Documents` and` Settings¥user01¥デスクトップ¥MakeExZIP.ps1 C:¥Backup¥sample.zip C:¥Backup¥data_dir C:¥Backup¥settings¥mail_settings.ini }"

この例では、user01のデスクトップに、吉岡さんのMakeExZIP.ps1 が保存してあって、C:¥Documents and Settings¥ の空白(スペース)の前に、バッククォート ` を入れることによって、スペースが含まれたパスでも正常動作するようにしています。

C:¥Backup¥sample.zip が、圧縮ファイル。

C:¥Backup¥data_dir 配下のすべてのサブディレクトリ内のファイルと、C:¥Backup¥settings¥mail_settings.ini という1個のファイルをZIPに圧縮しています。


【参考にさせていただいたサイト】


JUGEMテーマ:プログラミング

 
| SBS 2003 管理者 | プログラミング・Script | 09:58 | comments(0) | trackbacks(0) |
1234567
891011121314
15161718192021
22232425262728
2930     
<< April 2018 >>

このページの先頭へ