Skip to content

Instantly share code, notes, and snippets.

@fornext1119
Created April 23, 2013 01:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fornext1119/5440158 to your computer and use it in GitHub Desktop.
Save fornext1119/5440158 to your computer and use it in GitHub Desktop.
フォルダをまるごと退避 同じ名前のファイルが既にあればバックアップを取ったうえで上書き 退避先のファイルの方が新しければ、そのファイルの方を正にする
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var search_folder = WScript.Arguments(0);
var copy_folder = WScript.Arguments(1);
var mode = "";
if (WScript.Arguments.length > 2)
mode = WScript.Arguments(2);
if (mode == "")
WScript.Echo("confirm mode");
else if (mode == "c")
WScript.Echo("copy mode");
else if (mode == "m")
WScript.Echo("merge mode");
else
mode = "";
mergeFolder(fs, search_folder);
function mergeFolder(fs, path)
{
var folder = fs.GetFolder(path);
var files = folder.Files;
var enmFile = new Enumerator(files)
for (; !enmFile.atEnd(); enmFile.moveNext())
{
var date_cmp = "";
var f_copy = 0;
var file_modified = getDateLastModified(enmFile.item());
var file_name = enmFile.item().Path;
file_name = file_name.replace(fs.GetFolder(search_folder), "");
copy_file = fs.BuildPath(copy_folder, file_name)
var copy_file_modified = "";
if (fs.FileExists(copy_file))
{
//ファイルが存在する
//ファイルの更新日付を文字列で取得
copy_file_modified = getDateLastModified(fs.GetFile(copy_file));
if (file_modified == copy_file_modified)
{
//ファイルの更新日付が同じ
date_cmp = "=";
}
else if (file_modified > copy_file_modified)
{
//コピー元ファイルが新しい
date_cmp = ">";
if ((mode == "c") || (mode == "m")) f_copy = 1;
}
else
{
//コピー元ファイルが古い
date_cmp = "<";
if (mode == "m") f_copy = -1;
}
WScript.Echo(file_modified + date_cmp + " " + copy_file_modified + file_name);
var save_file;
if (f_copy == 1)
{
//コピー先ファイルを退避
save_file = copy_file + ".bak_" + copy_file_modified.replace(/\//g,"").replace(/:/g,"").replace(" ","_").replace(" ","");
WScript.Echo(" save " + save_file);
fs.GetFile(copy_file).Copy(save_file);
}
if (f_copy == -1)
{
//コピー元ファイルを退避
save_file = enmFile.item().Path + ".bak_" + file_modified.replace(/\//g,"").replace(/:/g,"").replace(" ","_").replace(" ","");
WScript.Echo(" save " + save_file);
enmFile.item().Copy(save_file);
}
}
else
{
//ファイルが存在しない
WScript.Echo(file_modified + "> " + file_name);
// "> yyyy.mm.dd hh:mm:ss "
//copy mode, merge mode のみ処理
if ((mode == "c") || (mode == "m"))
{
//フォルダが存在しなければ作成
if (!fs.FolderExists(fs.GetParentFolderName(copy_file)))
fs.CreateFolder(fs.GetParentFolderName(copy_file));
f_copy = 1;
}
}
//ファイルをCOPY
if (f_copy == 1)
enmFile.item().Copy(copy_file);
if (f_copy == -1)
fs.GetFile(copy_file).Copy(enmFile.item().Path);
if (f_copy != 0)
WScript.Echo(" copy");
}
delete enmFile;
// サブフォルダを検索
var subFolders = folder.SubFolders;
var enmFolder = new Enumerator(subFolders)
for (; !enmFolder.atEnd(); enmFolder.moveNext())
{
mergeFolder(fs, enmFolder.item().Path);
}
delete enmFolder;
}
// ファイルの更新日付を文字列で取得
function getDateLastModified(file)
{
var date = new Date(file.DateLastModified);
var y = date.getFullYear();
var m = date.getMonth() + 1;
var d = date.getDate();
var h = date.getHours();
var n = date.getMinutes();
var s = date.getSeconds();
y = leftPad(y,"0000") + "\/";
m = leftPad(m,"00") + "\/";
d = leftPad(d,"00") + " ";
h = leftPad(h,"00") + ":";
n = leftPad(n,"00") + ":";
s = leftPad(s,"00") + " ";
return y + m + d + h + n + s;
}
// 文字列が指定の長さになるよう、指定文字をつめる
function leftPad(source, pad)
{
source = pad + source;
source = source.substr(source.length - pad.length, pad.length);
return source;
}
// 文字列が指定文字列ではじまっているか?
function startsWith(source, search)
{
return (source.indexOf(search, 0) == 0)
}
// 文字列が指定文字列でおわっているか?
function endsWith(source, search)
{
return (source.lastIndexOf(search, source.length) == (source.length - search.length))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment