2015-12-08更新:備份時添加--revision head 只備份最新的版本,已從腳本中移除。
2013-12-09更新:forfiles命令添加錯誤輸出日志。
2013-12-04更新:添加自動刪除過期備份,修改輸出日志時間的bug。
不會腳本的去科普下吧:點我去科普
最近有個任務,要在windows系統上備份Svn。如果每次都自己去執行麻煩死了。折騰了1周,終於搞定了這個腳本!
說明:這個腳本是全部備份的腳本。如果想增量備份,自己改備份的參數:svnadmin dump --incremental
本腳本實現了自動添加計划任務備份,自動刪除多少天前的備份,保留備份日志。
你需要做的是新建一個bat文件(取什么名字、放在哪兒隨便你,腳本做了通配的\(^o^)/~),然后把下面的內容復制粘貼,然后改改基本變量就可以用了。
下面的是全部的腳本:
@echo off :: 關閉回顯 :: 說明:如有命令不明白,請使用幫助命令:命令/? 。如:for/? :: 設置標題 title SVN備份腳本 by zjl rem 設置變量 :: SVN_HOME svn程序的安裝路徑,指定到bin目錄上一級。(如果路徑有空格,請用""。) set SVN_HOME="D:\Program Files\VisualSVN Server" :: SVN庫的路徑 set SVN_ROOT=D:\Repositories :: 備份SVN父目錄的路徑 set SVN_BACKUP_ROOT=D:\svn_bak :: 獲取當前系統日期和時間用來創建目錄,格式:年月日_時分秒毫秒。如:20131129_16275274 set TIME_DIR=%date:~,4%%date:~5,2%%date:~8,2%_%time:~,2%%time:~3,2%%time:~6,2%%time:~9,2% :: SVN備份子目錄的路徑 set BACKUP_DIRECTORY=%SVN_BACKUP_ROOT%\%TIME_DIR% :: 日志文件路徑(將日志和備份文件放在一個目錄,刪除時一起刪除了) set LOG=%BACKUP_DIRECTORY%\backup.log :: 指定備份文件刪除時間(單位:天)。0 - 32768 范圍內的任何數字。 set NUM=30 rem 開始備份SVN :: 判斷SVN程序是否存在 if not exist %SVN_HOME% goto error goto start :start :: 查詢日志大小(單位:字節),超過1Mb就新建一個 (日志放入備份目錄后,此語句無效。僅備份!) :: for /r %SVN_BACKUP_ROOT% %%I in (backup.log) do if %%~zI GEQ 1048576 ren %LOG% backup_%TIME%.log :: 新建目錄 mkdir %BACKUP_DIRECTORY% :: 建立日志 @echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%建立備份目錄:%BACKUP_DIRECTORY% >>%LOG% :: 備份SVN版本庫並輸出日志到文件 for /d %%i in (%SVN_ROOT%\*) do ( @echo 備份 %%~ni 庫,備份文件名:%%~ni.dmp >>%LOG% :: 完整備份(增量備份在dump后面添加參數 --incremental) %SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%%~ni >%BACKUP_DIRECTORY%\%%~ni.dmp 2>>%LOG% ) :: 輸出備份命令退出碼,用來判斷是否備份成功。成功的退出碼為0. @echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%退出碼為:%errorlevel%>>%LOG% :: 自動設置計划任務:每周六 晚上11點執行本腳本。修改請參考:http://www.doc88.com/p-052298888776.html at 23:00 /next:S %~f0>>%LOG% :: 刪除過期備份 goto delete :delete :: 輸出要刪除的目錄到日志文件 @echo [info]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%刪除%NUM%天前的備份:>>%LOG% forfiles /P %SVN_BACKUP_ROOT% /M *_* /D -%NUM% /C "cmd /c echo 刪除文件夾:@file">>%LOG% :: 使用rd命令刪除超過%NUM%天的備份目錄。如果不存在匹配條件的目錄,將提示:錯誤: 用指定的搜索標准沒有找到文件。如果存在匹配的文件,則提示:目錄名無效 forfiles /P %SVN_BACKUP_ROOT% /M *_* /D -%NUM% /C "cmd /c rd /s/q @path" 2>>%LOG% goto end :error echo [error]%date:~,10% %time:~,2%:%time:~3,2%:%time:~6,2%程序目錄不存在,請檢查:%SVN_HOME%>>%LOG% goto end :end :: 輸出一行空行分割日志 @echo. >>%LOG% exit :: 調試腳本用的命令 :: at 16:06 %~f0 :: PAUSE :: exit
輸出日志如下:
[info]2013-12-04 14:40:51建立備份目錄:D:\svn_bak\20131204_14405196 備份 accounts 庫,備份文件名:accounts.dmp * Dumped revision 2523. 備份 community 庫,備份文件名:community.dmp WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. WARNING 0x0001: Mergeinfo referencing revision(s) prior to the oldest dumped revision (r2767). Loading this dump may result in invalid mergeinfo. * Dumped revision 2767. WARNING 0x0001: The range of revisions dumped contained mergeinfo which reference revisions outside that range. 備份 conf 庫,備份文件名:conf.dmp * Dumped revision 350. [info]2013-12-04 14:49:09退出碼為:0 [info]2013-12-04 14:49:09刪除4天前的備份: 刪除文件夾:"20131129_16441602" 刪除文件夾:"20131130_23000008"