m2

WSH で ZIP

先人の知恵をお借りして、極力シンプルなものに仕上げました。
圧縮にはエクスプローラーの機能を使用しています。

zip.cmd

@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end

// zip compress command in wsh.
// @see http://scripting.cocolog-nifty.com/blog/2008/06/zip_3cb0.html
// @see http://n-arai.cocolog-nifty.com/blog/2008/04/activeserverpag_d5bc.html

if (WScript.Arguments.Count() < 2) {
    WScript.Echo("Usage: zip zipfile [ file1 file2 ...]");
    WScript.Quit();
}

var zipfile = WScript.Arguments.Item(0);
var fso = new ActiveXObject("Scripting.FileSystemObject");
var shell = new ActiveXObject("Shell.Application");

// check extension.
if (!/\.zip$/i.test(zipfile)) {
    WScript.Echo("Invalid Extension Name - ", zipfile);
    WScript.Quit();
}

// create new zip file. (overwrite)
var targetZip = fso.CreateTextFile(zipfile, true);
targetZip.Write("PK" + String.fromCharCode(5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0));
targetZip.Close();

// add zip entries.
var zipAsFolder = shell.NameSpace(fso.GetAbsolutePathName(zipfile));
for(var _ = 1, X = WScript.Arguments.Count(); _ < X; _++) {
    zipAsFolder.CopyHere(fso.GetAbsolutePathName(WScript.Arguments.Item(_)));
    while (X / _ / X) {
        WScript.Sleep(100);
        try {
            fso.OpenTextFile(zipfile, 8, false).Close();
            break;
        }
        catch (e) { /* writing */ }
    }
}
WScript.Quit();

http://gist.github.com/174010

上記を zip.cmd で保存して zip zipfile file1 file2 ...
zip の新規作成しか対応してません。

  • -

CopyHere の待ち合わせにファイルの数を見るやり方とファイルロックを見るやり方等々を見かけましたが、ファイルの数だとフォルダを圧縮するときにうまくいかないのでファイルロック監視方式をとりました。

それから Shell.Application の CopyHere はワイルドカードを渡せるようなことが書いてあるのですが、不正なファイル名とか何とか言われてうまく動きませんでした。なのでワイルドカードは無しで。


主に参考にしたところ(というかまんま)。

ZIPファイルを作成/追加/置換するバッチファイル(その2)
http://scripting.cocolog-nifty.com/blog/2008/06/zip_3cb0.html

【ActiveServerPages】フォルダをZIP圧縮
http://n-arai.cocolog-nifty.com/blog/2008/04/activeserverpag_d5bc.html

ZIP.VBS
http://www.vector.co.jp/soft/winnt/util/se355605.html
これに含まれる TechNote.TXT に、エクスプローラーから zip を操作する多くのTIPSが記載されています。