AutoHotkey通用备份还原脚本

以前一直使用SyncbackPro备份还原Everything,Listary等软件的配置文件。
存在以下缺点,就考虑自己写一个脚本来进行备份还原。

  1. SyncbackPro作为专业软件功能强大,但是随之而来的就是配置麻烦,打开运行缓慢;
  2. SyncbackPro会比较文件的修改日期,修改日期较新的不会覆盖旧的,这个设计在备份还原很多文件的时候都是正确的。但是Listary等程序对配置文件的修改是实时的,在还原的时候就不会将你想要还原的配置文件还原。

脚本分享如下:

#Requires AutoHotkey v2.0 
/*
脚本会自动判断路径是文件还是文件夹,
文件夹会复制覆盖目录下的所有文件,
文件则直接复制覆盖。
脚本没有进行文件比较,不适用于大规模、大文件的备份还原,
如果有需要推荐使用SyncbackPro等专业软件进行,
仅适合软件的配置及数据文件进行备份。
脚本支持备份还原双模式,
需要使用备份模式,运行时需要加入命令行参数 "backup"
需要使用还原模式,运行时需要加入命令行参数 "restore"
*/

source := "C:\Program Files\Everything" ;源文件路径
target := "D:\Settings\EveryThing设置" ;备份目标路径
porcessPath := "" ;目标程序的路径,如果该配置不为空,则在备份还原以前会关闭目标进程,完成后再运行
list :=["\Everything.ico", ;需要备份还原的文件列表,相当于备份软件中的过滤器/筛选列表。PS:不要忘记前面的\
"\Everything.ini",
"\Filters.csv",
"\IbEverythingExt",
"\WindowsCodecs.dll"
]

/*
以下为脚本的主要逻辑,一般情况下不需要修改
*/
; 备份模式
if(A_Args[1] = "backup"){
    backMode()
}
else if(A_Args[1] = "restore"){
    restoreMode()
}
else{
    MsgBox("输入的命令行参数错误,请检查。")
}

; 备份模式
backMode(){
    ; 关闭指定进程
    if(porcessPath != ""){
        pathArray := SubStr(porcessPath,"\")
        ProcessClose(pathArray[-1])
        Sleep(3000)
    }

    for index,element in list {
        sourcePath := source . element
        targetPath := target . element
        if( isFileOrFolder(sourcePath) = "folder"){
            DirCopy(sourcePath,targetPath,1)
        }
        else{
            FileCopy(sourcePath,targetPath,1)
        }
        Sleep(100)
    }

    ; 运行指定程序
    if(porcessPath != ""){
        Run(porcessPath)
    }
}

; 还原模式
restoreMode(){
    ; 关闭指定进程
    if(porcessPath != ""){
        pathArray := SubStr(porcessPath,"\")
        ProcessClose(pathArray[-1])
        Sleep(3000)
    }

    for index,element in list {
        sourcePath := source . element
        targetPath := target . element
        if( isFileOrFolder(sourcePath) = "folder"){
            DirCopy(targetPath,sourcePath,1)
        }
        else{
            FileCopy(targetPath,sourcePath,1)
        }
        Sleep(100)
    }

    ; 运行指定程序
    if(porcessPath != ""){
        Run(porcessPath)
    }
}

; 判断路径是目录还是文件
isFileOrFolder(path){
  pathAttr := FileExist(path)
  if(pathAttr == ""){
    MsgBox(path . "路径不存在")
  }
  else if(InStr(pathAttr,"D")){
    return "folder"
  }
  else {
    return "file"
  }
}