[WSH JScript] JScriptでZip圧縮してみる2

JavaScript

前回はWSHの機能のみで実装してみたもののMS非推奨なだけあって不安定でした。
(システムとしてはアウト)

なので外部アプリの7-zipを使用します。

今回使ったのはインストールしないで使うポータブル版です。

WSHファイルと一緒に持ち運んであげれば汎用的に使えると思います。

今回のはしっかり安定しているので使えると思います。(使ってる)

すごく簡単に説明すると、

フォルダ読み込む→日付確認→コマンドプロンプトで7zip実行

以上。

shell.Run(文字列)でコマンドプロンプトを実行します。

うん。シンプル。

// 共通オブジェクトを定義
var fs = new ActiveXObject("Scripting.FileSystemObject");
var shell = new ActiveXObject("WScript.Shell");

// 7-zipのパス
var _7zip = "C:\\Users\\Visual Studio 2015\\Projects\\Zip\\7z.exe";

// zip保存パス
var saveTo = "C:\\Users\\Visual Studio 2015\\Projects\\Zip\\result";

// 圧縮するファオルダ
var targetFiles = ["C:\\Users\\Visual Studio 2015\\Projects\\Zip\\Logs"];

// zipファイル名のプレフィックス(XXXX_日付.zip)
var pref = "PROJECT";

/// <summary>
/// 対象フォルダのファイルをを圧縮します
/// 対象となるのは30日前以前のファイルです
/// </summary>
function execute()
{
    var completeFiles = [];
    try{
        for (var c = 0; c < targetFiles.length; c++) {
            var file = fs.GetFolder (targetFiles[c]).Files;
            var files = [];
            var enuFile = new Enumerator (file);
            for (; !enuFile.atEnd() ; enuFile.moveNext()) {
                files.push (enuFile.item ());
            }
            // フォルダの中のファイルを纏めて返す
            completeFiles.push (compression7zip (files));
        }
    } catch (e) {
        shell = null;
        fs = null;
        WScript.Quit();
    }
    // 処理が成功したら元のファイルは削除
    try{
        for (var i = 0; i < completeFiles.length; i++) {
            for (var t = 0; t < completeFiles[i].length; t++) {
                fs.DeleteFile (fs.GetAbsolutePathName(completeFiles[i][t]));
            }
        }
    } catch (e) {
        shell = null;
        fs = null;
        WScript.Quit();
    }
    shell = null;
    fs = null;  
    WScript.Quit();
    
}

/// <summary>
/// 対象ファイルをzip圧縮します(7-zip使用)
/// </summary>
/// <param name="files">対象ファイルの配列</param>
/// <returns>
/// 正常に処理が終了した場合は圧縮したファイルの配列を返します。
/// 失敗した場合は例外をだして処理を終了します。
/// </returns>
function compression7zip(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;
        try {
            // 対象ファイルが30日以前のものかチェック
            if (dateCompare(fileDate)) {
                // 7-zip実行 a:既存zipに追加 0:ウインドウ非表示 true:zipされるのを待つ
                shell.Run("\"" + _7zip + "\"" + " a \"" + zipPath + "\" \"" + files[i] + "\"", 0, true);
                compFiles.push (fs.GetAbsolutePathName (files[i]));
            }
        } catch (e) {
            shell = null;
            fs = null;
            WScript.Quit();
        }
    }
    return compFiles;
}


/// <summary>
/// 対象ファイルが30日以前か判定します
/// </summary>
/// <param name="date">比較日時(Date型)</param>
/// <returns>
/// 30日以前ならばtrueを返します
/// 29日以降ならばfalseを返します
/// </returns>
function dateCompare(date)
{
    var baseDate = new Date();
    baseDate.setDate(baseDate.getDate() - 30);
    if ( date < baseDate) {
        return true;
    } else {
        return false;
    }

}

コメント

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