我想每天使用批处理文件定期进行备份。请考虑以下文件夹:
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-22
、2017-12-23
、2017-12-24
等,而不仅仅是1
、2
、3
等。
批处理文件接下来检查今天是否已经创建了备份文件夹,这很简单,因为备份日期以国际日期格式包含在文件夹名称中。如果在同一天已经创建了备份,则批处理文件不执行任何其他操作。
否则,将在配置前缀的已配置父目录中备份要备份的文件夹。 必须在批处理文件中指定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
命令行。