none
使用脚本自动备份活动目录(原创) RRS feed

  • 常规讨论

  • '该脚本利用Windows自带的NTBackup备份系统状态,并建立日志文件,备份文件路径和保存备份的天数在命令行参数中获得,备份将以当前时间命名。把主机的脚本宿主改为CScript,在命令行运行,给与参数。可以使用计划任务执行该命令,用以自动备份系统状态

    On Error Resume Next
    '从命令行获得参数,参数1:备份放置的目录、2:备份保留的时间
    strFloder = Wscript.Arguments(0)
    HowOld=Cint(Wscript.Arguments(1))
    '定义备份日志文件名
    StrBackupLogName="SystemBackup.txt"
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    '如果已有备份日志文件存在,检测文件大小,如果大于10M则备份该文件,将名字改为“-1”后缀,并删重新建一个新文件。如果文件不存在则建立一个。
    If objFSO.FileExists(strFloder&StrBackupLogName) Then
    set objFilePro=objFSO.GetFile(strFloder&StrBackupLogName)
     if objFilePro.Size/1024/1024>10 then
      objFSO.CopyFile strFloder&StrBackupLogName,strFloder&StrBackupLogName&"-1",True
      objFSO.DeleteFile strFloder&StrBackupLogName,True
      objFSO.CreateTextFile(strFloder&StrBackupLogName)
     end if
    else
     objFSO.CreateTextFile(strFloder&StrBackupLogName)
    end if
    On Error Resume Next
    Set objFile=objFSO.OpenTextFile(strFloder&StrBackupLogName,8)
    Dim oShell
    objFile.writeLine ("=============================")
    objFile.writeLine ("NtBackup(SystemState) start at "&now)
    set oShell= Wscript.CreateObject("WScript.Shell")
    '在命令行运行NTBackup程序,备份系统状态,备份的文件名为当前的日期,在备份完成后,扫描当前目录BKF后缀文件,根据文件名判断备份的日期,如果该日期和当前日期相差超过第二个参数定义的天数,那么删除该备份文件。
    oShell.Run "ntbackup.exe backup systemState /m normal /j 'Command Line Backup' /f "&strFloder&Date&".bkf",,True
    objFile.writeLine ("NtBackup(SystemState) stop at "&now)
    Set Folder = objFSO.GetFolder(strFloder)
    Set FileList = Folder.Files
    For Each File in FileList
    '用“.”隔开文件名,取得文件名前缀
    FileName_Arr=split(File.Name,".")
     if FileName_Arr(1)="bkf" then
    '判断两个日期的天数差,如果大于参数2定义的天数,将被删除。
      DiffDay=datediff("d",FileName_Arr(0),date)
      if DiffDay>HowOld then
      DelFileName=File.Name
      objFSO.deletefile(strFloder&File.Name)
      objFile.writeLine ("Delete BackupFile "&DelFileName&" at "&now&" bacuse the file is "&DiffDay&" days old >"&HowOld&"days")
      end if
     end if
    Next
    '------------------------------结束
    将文件保存为backup.vbs,放于C盘
    在计划任务中执行如下任务:C:\backup.vbs E:\SystemBackup\ 30
    表示将系统状态备份到E:\SystemBackup,备份保留30天


    Script Guy 学任何一样东西,先了解原理(How do),这样可以少走很多弯路。
    2009年4月1日 14:48

全部回复


  • 谢谢

    如果要备份Exchange 邮箱存储和公共文件夹存储,

    在备份的时候

    oShell.Run "ntbackup.exe backup systemState /m normal /j 'Command Line Backup' /f "&strFloder&Date&".bkf",,True

    这里的参数应该怎么写??
    2009年4月14日 2:57
  • 要备份Exchange的话,请使用Exchange中自带的备份工具,因为要做日志截断等处理。


    学任何一样东西,先了解原理(How do),这样可以少走很多弯路。
    2009年4月15日 8:27
  • 请问我复制了你的方法,包存为VBS,可一运行就结束。  事件检视器中报错说:操作错误!  请协助!

    2009年4月16日 2:22
  • 首先要确认粘帖过去的代码是否有多余的回车,特别是注解的中文,其次该脚本是要输入执行参数的。

    这个是我公司所在服务上执行代码的部分日志。
    =============================
    NtBackup(SystemState) start at 2009-4-25 0:00:01
    NtBackup(SystemState) stop at 2009-4-25 0:02:56
    Delete BackupFile 2009-3-21.bkf at 2009-4-25 0:02:56 bacuse the file is 35 days old >30days
    =============================
    NtBackup(SystemState) start at 2009-5-2 0:00:01
    NtBackup(SystemState) stop at 2009-5-2 0:03:23
    Delete BackupFile 2009-3-28.bkf at 2009-5-2 0:03:24 bacuse the file is 35 days old >30days
    =============================
    NtBackup(SystemState) start at 2009-5-9 0:00:01
    NtBackup(SystemState) stop at 2009-5-9 0:03:12
    Delete BackupFile 2009-4-4.bkf at 2009-5-9 0:03:12 bacuse the file is 35 days old >30days
    =============================
    NtBackup(SystemState) start at 2009-5-16
    NtBackup(SystemState) stop at 2009-5-16 0:03:19
    Delete BackupFile 2009-4-11.bkf at 2009-5-16 0:03:19 bacuse the file is 35 days old >30days
    =============================
    NtBackup(SystemState) start at 2009-5-23
    NtBackup(SystemState) stop at 2009-5-23 0:03:06
    Delete BackupFile 2009-4-18.bkf at 2009-5-23 0:03:06 bacuse the file is 35 days old >30days
    =============================
    NtBackup(SystemState) start at 2009-5-30
    NtBackup(SystemState) stop at 2009-5-30 0:02:54
    Delete BackupFile 2009-4-25.bkf at 2009-5-30 0:02:54 bacuse the file is 35 days old >30days



    学任何一样东西,先了解原理(How do),这样可以少走很多弯路。
    2009年6月4日 9:21
  • 提示:备份档案名称无法使用   格式是2009/6/9.bkf   看来是命名有问题
    搞定了!是地区选项造成的格式不对!

    上面OK的动作是我在执行中,直接应用的。可我放到计划任务中,又是 一运行就结束。 事件检视器中报错说:操作错误!
    權限是域管理員!
    • 已编辑 smauner 2009年6月10日 1:58
    2009年6月9日 8:02
  • 代码是可以用的,你上面没看清楚啊,要输入参数啊,比如该代码保存为c:\backup.vbs,那么你要调用的话就要用如下格式,c:\backup d:\ 30 ,意思为将备份保存在D:\盘下,保存时间为30天,我将代码在我的XP上有运行了一遍,是可以的。(在域控制器上一直可用,唯一区别是我在域控制器上把该脚本封装成exe的了,这个应该没有影响的啊)
    日志如下:
    =============================
    NtBackup(SystemState) start at 2009-6-10 9:57:39
    NtBackup(SystemState) stop at 2009-6-10 9:59:26
    备份文件500多M。

    • 已编辑 x86 plus 2009年6月10日 2:05
    2009年6月10日 2:00
  • 经测试,转成exe确实没有问题!

    2009年6月10日 6:07
  • 对脚本(IT技术,Widnow/Linux/Network...等)感兴趣,并有钻研精神的可以加我QQ:769308501,大家一起探讨学习,加人请说明出处。


    学任何一样东西,先了解原理(How do),这样可以少走很多弯路。qq:769308501

    • 已编辑 x86 plus 2009年6月11日 8:19
    2009年6月11日 8:15
  • 我怎么测试不成功呢  能不能讲一下原理

    2009年10月9日 1:54
  • 1、首先将该文件从开始到
    '------------结束
    为止保存到txt,假设文件所在c:,名称为sysBackup.txt。
    2、将该文件改名为.vbs,即为sysBackup.vbs
    3、在命令行(cmd)中执行c:\sysBackup.vbs d:\ 30
    程序是绝对可以执行的。
    '++++++++++++++一些注解
    strFloder = Wscript.Arguments(0)
    HowOld=Cint(Wscript.Arguments(1))
    strFloder 变量是接受命令行传入参数1
    HowOld变量是接受命令行传入参数2
    例如:该脚本在C盘的名字是backup.vbs ,那么该命令可写成c:\sysBackup.vbs d:\ 30
    "d:\"表示参数1,说明备份文件存放的路径
    "30"是参数2,说明备份要保持的天数
    其他的注解已经写的比较明白了。
    象"set oShell= Wscript.CreateObject("WScript.Shell")”这种语句是创建对象,这个是创建Shell对象,该对象用来执行命令行程序例如cmd下面的命令,ntbackup就是用该对象来执行的。还有一般性的问题请查看wscript手册,如有人需要CHM版本可发邮件给我(不是天天看邮件,相应会比较慢)
    学任何一样东西,先了解原理(How do),这样可以少走很多弯路。qq:769308501
    2009年10月13日 5:51