前回は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;
}
}


コメント