Windows备份可以生成备份脚本(.bks文件),按计划(通过计划任务)定期(如每天一次)执行。但要按规则生成不同备份文件(.bkf文件)名称,甚至要改变备份路径,则要依靠批处理、脚本或编程了。批处理的参考资料太少了,不熟悉它的高级用法;编写程序又似乎有点小题大做了。所以,选择VBScript,它的语法与VB相似,挺懂的^_^。
假设在服务器上连接两个(再多就复杂了-_-!)移动硬盘,用来存储备份文件。需要实现以下基本功能:
1) 按日期串生成备份文件名称,如:Data2012302.bkf;
2) 检测给出的两个路径是否有足够的可用空间;
3) 没有足够的可用空间时,搜索最旧的文件并删除,以腾出空间。
具体的实现请看源码,并不复杂,注释还不少吧^_^
' ====================执行数据库文件备份===================== '从两个磁盘上查找最旧文件并删除,再在相同位置生成新备份, '备份文件以日期串结束。 '============================================================ Wsh.Echo "-----------------------数据库文件备份开始-----------------------" '定义变量 Dim FS Dim TargetPath, TargetFile, NewFile, Path1, Path2, File1, File2, _ FreeGB1, FreeGB2, DoDelete Dim Key, Space, BksFile '备份源定义文件 Dim FreeGB '剩余空间 Set FS = CreateObject("Scripting.FileSystemObject") '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!一般只需修改些处参数即可!!!!!!!!!!!!!!!!!!!!!!!!! '设置参数 BksFile = "D:config每日_数据库备份.bks" '备份定义文件 Key = "Data" '存放目录及文件名关键词 Space = 7.0 '所需备份存储空间 '两个可选存储路径 Path1 = "G:" & Key & "" Path2 = "H:" & Key & "" '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DoDelete = False '默认无需删除旧文件 '查找最旧文件 File1 = "" FreeGB1 = 0 If FS.FolderExists(Path1) Then File1 = GetOldestFileName(Path1, "bkf") End If wsh.echo "File1" & vbTab & vbTab & vbTab & File1 File2 = "" FreeGB2 = 0 If FS.FolderExists(Path2) Then File2 = GetOldestFileName(Path2, "bkf") End If wsh.echo "File2" & vbTab & vbTab & vbTab & File2 If File1 = "" Then If File2 = "" Then Wsh.Echo "错误" & vbTab & vbTab & vbTab &"两个路径均不存在!" WScript.Quit Else TargetPath = Path2 TargetFile = File2 FreeGB2 = GetDiskFreeGB(Path2) End If ElseIf File2 = "" Then If File1 = "" Then Wsh.Echo "错误" & vbTab & vbTab & vbTab &"两个路径均不存在!" WScript.Quit Else TargetPath = Path1 TargetFile = File1 FreeGB1 = GetDiskFreeGB(Path1) End If Else '比较两个可选路径的可用空间 FreeGB1 = GetDiskFreeGB(Path1) FreeGB2 = GetDiskFreeGB(Path2) If FreeGB1 > Space Or FreeGB2 > Space Then '有足够的空间 DoDelete = False TargetPath = Path1 TargetFile = File1 Else DoDelete = True If CompareFileName(File1, File2) < 0 Then TargetPath = Path1 TargetFile = File1 Else TargetPath = Path2 TargetFile = File2 End If End If End If Wsh.Echo "TargetPath" & vbTab & vbTab & TargetPath Wsh.Echo "TargetFile" & vbTab & vbTab & TargetFile Wsh.Echo "FreeGB1" & vbTab & vbTab & vbTab & FreeGB1 & "GB" Wsh.Echo "FreeGB2" & vbTab & vbTab & vbTab & FreeGB2 & "GB" '删除最旧文件 wsh.echo "按需删除旧文件" & vbTab & vbTab & TargetFile & "..." If DoDelete = True Then '没有足够空间时删除旧文件 If FS.FileExists(TargetFile) Then Call FS.DeleteFile(TargetFile, True) Else Wsh.Echo "提示" & vbTab & vbTab & vbTab &"旧文件不存在!" End If Else Wsh.Echo "提示" & vbTab & vbTab & vbTab & "空间足够,无需删除旧文件!" End If '生成当日日期串 wsh.echo "提示" & vbTab & vbTab & vbTab & "生成日期格式..." Dim DateStr, y, m, d y = DatePart("yyyy", date) m = DateStr & DatePart("m", date) d = DateStr & DatePart("d", date) if m < 10 then : m = "0" & m end if if d < 10 then : d = "0" & d end if DateStr = y & m & d wsh.echo "日期串" & vbTab & vbTab & vbTab & DateStr '生成新备份文件名 NewFile = TargetPath & Key & DateStr & ".bkf" wsh.echo "新备份文件" & vbTab & vbTab & NewFile '执行备份 Wsh.Echo "提示" & vbTab & vbTab & vbTab & "开始备份数据库文件..." dim objShell Set objShell = CreateObject("Wscript.Shell") dim backCmd backCmd = "C:WINDOWSsystem32ntbackup.exe backup @" & BksFile & " /a /d ""[" _ & DateStr & "]数据库文件备份"" /v:no /r:no /rs:no /hc:off /m copy /j """ & Key _ & "备份"" /l:s /f " & NewFile 'wsh.echo backCmd objShell.Run(backCmd), 1, TRUE '函数定义 '----------------------------------------------------------------- '通过文件后6位日期串比较获取指定目录(不含子目录)下最旧文件名。 Function GetOldestFileName(path, mask) Dim S S = "" Set Folder = FS.GetFolder(path) Set Files = Folder.Files for each f in Files 'Wsh.Echo FS.GetExtensionName(f.Path) if LCase(Right(FS.GetExtensionName(f.path), Len(mask))) _ = LCase(mask) then If S = "" Or CompareFileName(f.Path, S) < 0 Then S = f.Path End If End If Next GetOldestFileName = S End Function '比较两个文件名后6位日期串。 Function CompareFileName(FileName1, FileName2) If Right(FileName1, 12) < Right(FileName2, 12) Then CompareFileName = -1 ElseIf Right(FileName1, 12) > Right(FileName2, 12) Then CompareFileName = 1 Else CompareFileName = 0 End If End Function '获取指定路径所在磁盘的可用空间(GB)。 Function GetDiskFreeGB(Path) Set Drv = FS.GetDrive(FS.GetDriveName(Path)) GetDiskFreeGB = Int(Drv.FreeSpace / 1024 / 1024 / 1024) 'GB End Function Wsh.Echo "-----------------------数据库文件备份结束-----------------------"