前回は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; } }
コメント