如何只保留五个最新的备份文件夹并删除旧的?

时间:2017-12-23 20:59:22

标签: windows batch-file cmd backup

我想每天定期使用批处理文件进行备份。考虑这些文件夹:

C:\game folder
D:\backup1
D:\backup2
D:\backup3
D:\backup4
D:\backup5

里面有游戏文件夹:

c:\game folder\remote\                       »Folder
c:\game folder\remote\remotecache.vdf        ».vdf file
c:\game folder\remote\FullProfile            »No extension file
c:\game folder\remote\ProfileSaves\          »Folder
c:\game folder\remote\ProfileSaves\1054678   »No extension file

我需要一个

的批处理文件
  • 验证backup1上是否有时间戳(文件夹或其中的任何文件) 超过1天,如果是,则继续,否则停止;
  • 删除backup5文件夹或其内容;将backup4的文件夹/文件复制到backup5文件夹;
  • 删除backup4文件夹或其内容;将backup3的文件夹/文件复制到backup4文件夹;
  • 等。最多backup1个文件夹。
  • 最后将游戏文件夹复制到backup1文件夹。

有可能吗?

我的想法是运行计划任务(Windows),.bat文件通过使用backup1的时间戳或其中的任何文件,与实际日期进行比较并检查是否需要备份来验证是否需要备份backup1超过一天。

考虑到下面的代码,我应该放置什么才能让它像我之前描述的那样工作?

@echo off

echo  
echo ------------------------------------------------------------------
echo Daily script that backs-up game folder
echo ------------------------------------------------------------------

echo ------------------------------------------------------------------
echo Calculation of date
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set "dt=%%a"
set "YY=%dt:~2,2%"
set "YYYY=%dt:~0,4%"
set "MM=%dt:~4,2%"
set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%"
set "Min=%dt:~10,2%"
set "Sec=%dt:~12,2%"

set datestamp=%YYYY%%MM%%DD%
set timestamp=%HH%%Min%%Sec%
set fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%

如何在这里制作某种 IF 来检查backup1文件夹的时间戳,如果它超过1天,请运行下面的代码?以及如何设置@path

echo ------------------------------------------------------------------
echo Delete old backup folder
FORFILES -p "" /D -1 /C "cmd /c IF @isdir == TRUE rd /S /Q @path"

echo ------------------------------------------------------------------
echo Make new Backup folder
md D:\Backup1 

echo ------------------------------------------------------------------
echo Copy files into backup folder
xcopy /s /y "C:\game folder" "D:\Backup1"

1 个答案:

答案 0 :(得分:0)

这个日常备份操作任务的简单批处理文件怎么样?

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set "FolderToBackup=C:\game folder"
set "BackupParentFolder=D:"
set "BackupNamePrefix=Backup_"

if not exist "%FolderToBackup%\" goto EndBackup

rem Get region independent current date in format YYYY-MM-DD.
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "FolderNameDate=%%I"
set "TodayBackupFolder=%BackupParentFolder%\%BackupNamePrefix%%FolderNameDate:~0,4%-%FolderNameDate:~4,2%-%FolderNameDate:~6,2%"

rem Was a backup folder created already today?
if exist "%TodayBackupFolder%\" goto EndBackup

rem Create a backup of the folder to backup by doing a simple folder copy.
%SystemRoot%\System32\xcopy.exe "%FolderToBackup%" "%TodayBackupFolder%\" /C /H /I /K /Q /R /S /Y >nul

rem Keep only the newest 5 backup folders and delete all others.
for /F "skip=5 delims=" %%I in ('dir "%BackupParentFolder%\%BackupNamePrefix%????-??-??" /AD /B /O-N 2^>nul') do rd /Q /S "%BackupParentFolder%\%%I"

:EndBackup
endlocal

它使用命令 WMIC 以格式YYYY-MM-DD获取当前日期,详见%date% produces different result in batch file when run from Scheduled Tasks in Server 2016的答案。国际日期格式YYYY-MM-DD具有良好的可读性。另外一个很大的优点是,在文件夹名称中使用此格式的日期时,按名称按字母顺序排序的文件夹列表也会自动按创建文件夹的日期排序。了解备份文件夹的创建时间肯定是好的,因此最好使用2017-12-222017-12-232017-12-24,...而不仅仅是1,{ {1}},2,...

批处理文件接下来检查是否已创建备份文件夹,这很简单,因为备份日期包含在国际日期格式的文件夹名称中。如果在同一天之前已经创建了备份,则批处理文件不会执行任何其他操作。

否则,将在配置的父目录中使用已配置的前缀备份要备份的文件夹。必须在批处理文件中指定3,但根本无法定义BackupParentFolder

执行备份后,执行命令 DIR 以列出所有备份文件夹,文件夹名称中的备份日期按名称排序,这意味着最新的备份文件夹由 DIR输出第一个也是最后一个。

将忽略五个最新备份,并删除所有其他备份文件夹,这通常意味着从现有备份文件夹列表中删除一个目录。这个非常简单但非常有效的备份策略在Bat file to delete files only when younger files are present的答案中有详细解释。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • BackupNamePrefix
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?
  • wmic /?
  • wmic os /?
  • wmic os get /?
  • wmic os get localdatetime /?

另请阅读有关Using Command Redirection Operators的Microsoft文章,了解xcopy /?的说明。重定向运算符2>nul必须使用 FOR 命令行上的插入符>进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式^命令行。