【问题标题】:Batch script to delete older backup files in a folder created by date with the exception of the newest 5 files用于删除按日期创建的文件夹中的旧备份文件的批处理脚本,最新的 5 个文件除外
【发布时间】:2014-06-21 18:07:02
【问题描述】:

我有一个程序每 30 分钟创建一次备份,但不会删除旧文件。我正在寻找一个将在任务调度程序上运行的脚本,该脚本将在程序创建的文件夹中查找。它按日期创建文件夹,如下所示/年/月/日/*file.zip 的名称。我做了一些研究并提出了

@ECHO OFF
for /f "usebackq delims== tokens= 2" %%i in ( WMIC OS GET localdatetime /format:value ) do set localTime=%%i
set "YYYY=%localTime:~0,4%"
set "M=%localTime:~4,1%"
set "MM=%localTime:~5,1%"
set "D=%localTime:~6,1%"
set "DD=%localTime:~7,1%"
if %M%==0 set M=
if %D%==0 set D=
cd /d "~%~dp0"
FOR /F "tokens=*" %%X IN ('dir .\%YYYY%\%M%%MM%\%D%%DD%\Backup-serversave-%YYYY%-%M%%MM%-%D%%DD%--*.zip /b /o:-d') DO set FILENAME=%%~X
rem FILENAME now contains the last element
if "%FILENAME%" neq "" DEL "%FILENAME%"
pause

此脚本在今天的日期前查看文件夹,然后应该删除文件夹中最旧的文件。但是每次我运行它时,我得到的只是一个“找不到文件”,它告诉我它说它找不到的确切文件。所以我需要一点帮助才能让它工作。如果有任何方法可以使其仅在文件夹中有五个文件后才删除,那也很棒。如果有人可以帮助我,那就太棒了。

更新。得到了一个很好的答案,但需要更多的帮助。如果那里的任何人都可以找到一种方法让它在更改日期时删除昨天的文件夹,那将是惊人的,我正在寻找所有东西,到目前为止还没有发现任何东西。

【问题讨论】:

    标签: file batch-file delete-file


    【解决方案1】:

    你在编写批处理文件方面已经做得很好了,但是犯了一些小错误。

    在第一行使用ECHO ON 有助于发现这些错误。

    以下行对批处理文件的工作进行了一些更正。

    @ECHO OFF
    for /f "usebackq delims== tokens=2" %%i in ( `WMIC OS GET localdatetime /format:value` ) do set localTime=%%i
    set "YYYY=%localTime:~0,4%"
    set "M=%localTime:~4,1%"
    set "MM=%localTime:~5,1%"
    set "D=%localTime:~6,1%"
    set "DD=%localTime:~7,1%"
    if %M%==0 set M=
    if %D%==0 set D=
    cd /d "%~dp0"
    for /F "usebackq tokens=* skip=5" %%X in ( `dir .\%YYYY%\%M%%MM%\%D%%DD%\Backup-serversave-%YYYY%-%M%%MM%-%D%%DD%--*.zip /b /o:-d` ) do del .\%YYYY%\%M%%MM%\%D%%DD%\%%X
    pause
    

    没有文件未被删除,因为您使用命令dir 在子目录中查找 ZIP 文件。找到的文件的名称用%%X 引用,但没有此文件的路径。由于批处理文件没有进入dir搜索ZIP文件的目录,命令DEL在当前工作目录中找不到要删除的文件。

    使用skip=5 忽略命令dir 返回的前5 行,其中包含根据上次修改日期的5 个最新文件。因此,仅删除名称中包含今天日期且早于目录列表中前 5 个文件的文件,并保留最新的 5 个文件。

    命令cd也有一个错误,其他一些小错误都是在第一行使用ECHO ON发现的。

    【讨论】:

    • 我还想知道其他一些事情,因为这会改变新一天发生的日子有没有办法在新的一天开始时删除前几天的文件夹
    【解决方案2】:

    如果批处理文件应该自动找出应该删除哪些文件夹以及应该保留哪些文件夹,那么删除前一天的文件夹是很困难的。

    这是一个使这项任务变得简单的解决方案,并且可以附加到我的其他答案中的其他行以删除旧备份文件。

    if exist .\%YYYY%\%M%%MM%\%D%%DD%\Backup-serversave-%YYYY%-%M%%MM%-%D%%DD%--*.zip (
       md TempBackup
       copy /V .\%YYYY%\%M%%MM%\%D%%DD%\*.zip TempBackup >nul
       for /F "usebackq" %%D in ( `dir /AD /B 20*` ) do rd /S /Q %%D
       md %YYYY%\%M%%MM%\%D%%DD%
       copy /V TempBackup\*.zip %YYYY%\%M%%MM%\%D%%DD% >nul
       rd /S /Q TempBackup
    )
    

    首先,检查今天是否已经存储了 ZIP 文件,以防止在今天没有创建至少一个备份时删除较旧的备份。

    接下来会创建一个名为 TempBackup 的目录,将今天创建的当前现有备份文件复制到该目录中。

    然后执行dir 命令,该命令仅列出以20 开头的目录名称。目前这只是目录2014,但在 2015 年 1 月 1 日它将另外是2015。所有这些目录都会被递归地静默删除。

    接下来重新创建今天的目录树并将 ZIP 文件复制回该目录。

    最后,ZIP 文件的临时备份目录也被删除了。

    我现在想知道,如果 ZIP 文件本身还包含名称中的年、月和日,为什么要使用以当前年份为名称的目录,其中包含以当前月份为名称的目录,其中包含以当前月份为名称的目录,并且除了今天保存的最后 5 个 ZIP 文件之外的所有 ZIP 文件都应该删除吗?

    管理在同一目录中创建所有 ZIP 文件并根据上次修改日期删除除最后 5 个以外的所有 ZIP 文件可能会更容易。

    另一方面,目录管理可以保留几天(如一个月)的备份,并且不时手动或自动删除上个月的备份,例如每月 15 日。

    【讨论】:

    • 它只是我正在使用的程序它自己创建它我无法改变它的方式因为我没有创建它但我必须使用它我自己正在尝试这样的事情混合结果试图解决您向我展示的文件并将其调整为 /f "usebackq tokens=* skip=1" %%A in ('dir C:\Users\kain184\AppData\Roaming\ .technic\modpacks\kainspack\backups\serversave\%YYYY%\%M%%MM% /ad /b /o-d' ) 执行 rmdir /s /q C:\Users\kain184\AppData\Roaming\.technic\modpacks \kainspack\backups\serversave\%YYYY%\%M%%MM%\%%A