杂记
 


VBScript实现自动备份

作者:牧童  2011-10-10 00:00:00     分类:Windows     标签:

        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 "-----------------------数据库文件备份结束-----------------------"
更多
阅读(976)     评论(0)