[WSH JScript] JScriptでzipに圧縮してみる

JavaScript

ログファイルの量が多く、カオスな感じになってきたので整理することになった。

ただzipに圧縮するのもあれなので、更新日毎で圧縮することに決めた。

var fs = new ActiveXObject("Scripting.FileSystemObject");
var wshell = new ActiveXObject("Shell.Application");
var shell = new ActiveXObject("WScript.Shell");

var saveTo = "保存先のパス";
var targetFiles = ["圧縮するファイルがあるフォルダのパス"];
var pref = "SAMPLE";

/// <summary>
/// 対象フォルダのファイルをzipに圧縮します
function execute() {
    var successFiles = [];
    for (var c = 0; c< targetFiles.length; c++) {
        var file = fs.GetFolder (targetFiles[c]).Files;
        var files = [];
        var enumFile = new Enumerator (file);
        
        for ( ; !enumFile.atEnd(); enumFile.moveNext()) {
            files.push (enumFile.item ());
        }
        // フォルダの中のファイルを纏めて渡して
        // 成功したファイルを受け取る
        successFiles.push (createZip (files));
    }
    for (var i = 0; i < successFiles.length; i++) {
        for ( var t = 0; t < successFiles[i].length; t++) {
            fs.DeleteFile (fs.GetAbsolutePathName (successFiles[i][t]));
        }
    }
    shell = null;
    fs = null;
    WScript.Quit();
}

/// zip圧縮を実行します(WSHshell使用)
/// 最初からファイルの読み込みから始まるならこのメソッドだけでもokかも
function compressArchive (files) {
    var compFiles = [];
    for ( var i = 0 ; i > files.length; i++ ) {
        var fileDate = new Date (files[i].DateLastModified);
        var fileName = fileDate.getFullYear().toString() + ('0' + (fileDate.getMonth() + 1)).slice(-2) + ('0' + fileDate.getDate()).slice(-2);
        var zipFile = pref + '_' + fileName + ".zip";
        var zipPath = saveTo + "\\" + zipFile;

        // zipにするときのヘッダ
        if (!fs.FileExists (zipPath)){
            var targetZip = fs.CreateTextFile (zipPath, false);
            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();
        }
        var zipAsFolder = wshell.NameSpace (fs.GetAbsolutePathName (zipPath));

        if (dateCompare (fileDate)) {
            //直前のファイルの保存が完了しているの確認
            var count = zipAsFolder.item().count;
            zipAsFolder.CopyHere (fs.GetAbsolutePathName (files[i], 16));
            while ( zipAsFolder.item().count === count) {
                WScript.Sleep(300);
                try {
                    fs.OpenTextFile (zipPath, 8, false).Close();
                    break;
                } catch(e){
                    /* */
                }
            }
            compFiles.push (fs.GetAbsolutePathName (files[i]));
        }
    }
    return compFiles;
}

/// 引数のDateと当日を比較して前日以前ならtrueを返す
function dateCompare (date) {
    var today = new Date();
    if ( date < today) return true;
    else return false;
}

/// フォルダ選択のダイアログを表示します
function selectDir () {
    var shell = new ActiveXObject("Shell.Application");
    var folder = shell.BrowseForFolder (0, "フォルダ選択", 0);
    if (folder == null) return;
    var path = folder.Self.Path;
    return path;
}

ざっくりだけどこんな感じで作ってみました。
ただ、このshellというか、GUI操作(エクスプローラー)以外でのzip圧縮は
Microsoft非推奨なので注意が必要です。

このコードも5回に3回くらい失敗します。。。
このコードを使うときは注意してください。

コメント

タイトルとURLをコピーしました