Windows標準機能でZIPファイルの作成
JScriptで複数のテキストファイルを書き出し、それをZIPでまとめたかったので作成。 VBAやVBScript版を参考に作ってみた。
参考サイト : http://kiq-creator.com/blog/?eid=33
複数のファイルをZIP圧縮する際のコツとしては、CopyHereをするたびに待機すること。 CopyHereは非同期なので、すぐにJS側に制御が返ってくるが、 複数のファイルを一気にCopyHereしようとすると、「読み取りできません」とエラーが出る。
使い方
以下のコード中のcreateZipFileを自分のスクリプトにコピー&ペーストして
createZipFile( "zipファイルのパス", ["圧縮対象ファイルのパス1", "圧縮対象ファイルのパス2", ...])
とすればOK。 もしくは以下のコードをメモ帳で拡張子をjsにして保存すれば、ドラッグ&ドロップでzipファイルを作成(右クリック→送る→圧縮フォルダーとほぼ同じ動作)。
注意事項
ディレクトリには対応してません。またWindows標準では暗号化ZIPは作成できません。 また圧縮対象ファイルの存在チェック等もやってないので、必要であればエラーハンドリング処理を追加してください。
/**
Windows 標準機能でZipファイルを作成するWSH(JScript)
Copyright 330k
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
*/
var args = [];
for(var i = 0; i < WScript.Arguments.length; i++){
args.push(WScript.Arguments(i));
}
var zipfile = args[0].replace(/(.+)\.(.+?)$/, "$1.zip");
createZipFile(zipfile, args);
function createZipFile(zipFilePath, sourceFiles){
var shell = WScript.CreateObject("Shell.Application");
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var file = fso.OpenTextFile(zipFilePath, 2, true);
var i = 0;
var zipfile;
file.Write("PK\x05\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
file.Close();
zipfile = shell.NameSpace(zipFilePath);
for(i = 0; i < sourceFiles.length; i++){
zipfile.CopyHere(sourceFiles[i]);
while (zipfile.Items().Count <= i){
WScript.Sleep(100);
}
}
}