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



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

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

游戏内有文件夹:

c:game folderremote                       »Folder
c:game folderremoteremotecache.vdf        ».vdf file
c:game folderremoteFullProfile            »No extension file
c:game folderremoteProfileSaves          »Folder
c:game folderremoteProfileSaves1054678   »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"

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

@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%System32wbemwmic.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%System32xcopy.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% 在按计划任务执行的批处理文件中产生不同的结果?yyyy-MM-dd的国际日期格式具有良好的可读性。它还具有很大的优势,即在文件夹名称中使用这种格式的日期时,按名称字母顺序排序的文件夹列表也会自动按创建文件夹的日期排序。知道备份文件夹何时创建肯定是件好事,因此最好使用2017-12-222017-12-232017-12-24等,而不仅仅是123等。

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

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

进行备份后,执行命令DIR以列出所有备份文件夹,其中文件夹名称中的备份日期按名称反向排序,这意味着最新的备份文件夹首先由DIR输出,最旧的最后输出。

忽略五个最新的备份,并删除所有其他备份文件夹,这意味着通常从现有备份文件夹列表中删除一个目录。这个非常简单,但非常有效的备份策略在Bat文件的回答中详细解释,仅在存在较年轻的文件时才删除文件。

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

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

另请阅读有关使用命令重定向运算符的Microsoft文章,了解2>nul的说明。当 Windows 命令解释器在执行命令 FOR 之前处理此命令行时,重定向运算符>必须使用插入符号^FOR命令行上进行转义,该命令使用在后台启动的单独命令进程执行嵌入的dir命令行。