Created
April 23, 2013 01:34
-
-
Save fornext1119/5440158 to your computer and use it in GitHub Desktop.
フォルダをまるごと退避
同じ名前のファイルが既にあればバックアップを取ったうえで上書き
退避先のファイルの方が新しければ、そのファイルの方を正にする
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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