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);
    }
  }
}