このサイトでは珍しく win な話題.
バージョン管理されていないファイルを更新するときバックアップファイルを作ろうとしてコピーすると,ファイル名に"コピー 〜"とかいう文字列が入ってウザかったり日付を入れるのが面倒くさかったりするので,perl で更新日時付きのファイル名にコピーするスクリプトを書いて悦に入っていたら,上司に「それ WSH で書いた方が良くね?」という会心の一撃をくらい,「元々アンチだから WSH という発想すらなかったのよ」と言い訳するテストをしつつ,やっぱり悔しかったのでとりあえず書いてみた.
hoge.js とかのファイル名で SendTo に入れておくと幸せになれるかもしれない.
- 【追記】
- 2007/9/14 コードを少し整理しました.
/*
* 更新日時つきファイル名へのコピースクリプト
*/
// ディレクトリ名を指定すると、そのディレクトリに作成する
var backup_dir = false;
//var backup_dir = "Backup";
var WshShell = new ActiveXObject("WScript.Shell");
var FSO = new ActiveXObject("Scripting.FileSystemObject");
var vbCritical = 16;
var DateFormat = {
format: function (ts) {
return (
this._zeroPadding(ts.getYear(), 4)
+ this._zeroPadding(ts.getMonth()+1, 2)
+ this._zeroPadding(ts.getDate(), 2)
+ "_"
+ this._zeroPadding(ts.getHours(), 2)
+ this._zeroPadding(ts.getMinutes(), 2)
+ this._zeroPadding(ts.getSeconds(), 2)
);
},
_zeroPadding: function (val, len) {
return Array(len - (""+val).length + 1).join('0') + val;
}
};
var CloneCreator = {
target_dir : false,
fail_source_list : [],
fail_target_list : [],
create_clone : function (argv) {
for (var i=0; i<argv.length; i++) {
var item = argv.item(i);
if (FSO.FileExists(item))
this.create_clone_item(FSO.GetFile(item));
else if (FSO.FolderExists(item))
this.create_clone_item(FSO.GetFolder(item));
else
this.fail_source_list.push(FSO.GetFileName(item));
}
},
create_clone_item : function (src) {
var name = FSO.GetBaseName(src);
var ext = FSO.GetExtensionName(src);
var ts = new Date(src.DateLastModified);
var target = ( this.target_dir + "\\"
+ name + "_" + DateFormat.format(ts) );
if (ext) target += "." + ext;
try {
src.Copy(target, false);
}
catch (e) {
this.fail_target_list.push(FSO.GetFileName(target));
}
return true;
},
set_parent_dir : function (argv) {
var target_dir = FSO.GetParentFolderName(argv.item(0));
// 念のため同一ディレクトリであることをチェック
for (var i=1; i<argv.length; i++) {
if (FSO.GetParentFolderName(argv.item(i)) != target_dir)
return false;
}
this.target_dir = target_dir;
return true;
},
create_backup_dir : function () {
if ( !FSO.FolderExists(this.target_dir) ) {
try {
FSO.CreateFolder(this.target_dir);
}
catch (e) {
return false;
}
}
return true;
}
};
/*
* Main
*/
var argv = WScript.arguments;
// 引数チェック
if ( argv.length < 1 ) {
WshShell.Popup("ファイル名が必要です。", 0, "引数エラー", vbCritical);
WScript.quit();
}
// コピー先ディレクトリセット
if (!CloneCreator.set_parent_dir(argv)) {
WshShell.Popup("ファイルのディレクトリが一致しません。",
0, "エラー", vbCritical );
WScript.quit();
}
// バックアップフォルダ作成
if ( backup_dir != false ) {
CloneCreator.target_dir += "\\" + backup_dir;
if (!CloneCreator.create_backup_dir()) {
WshShell.Popup("バックアップディレクトリの作成に失敗しました.\n\n "
+ CloneCreator.target_dir, 0, "エラー", vbCritical );
WScript.quit();
}
}
// 処理
CloneCreator.create_clone(argv);
// エラー表示
if ( CloneCreator.fail_source_list.length ) {
WshShell.Popup("以下のコピーに失敗しました。\n\n "
+ CloneCreator.fail_source_list.join("\n ")
, 0, "エラー", vbCritical);
}
if ( CloneCreator.fail_target_list.length ) {
WshShell.Popup("以下のファイル作成に失敗しました。\n\n "
+ CloneCreator.fail_target_list.join("\n ")
, 0, "エラー", vbCritical);
}

コメントする