限制 7-Zip 存档拆分以设置备份的修订数

Limit 7-Zip archive splitting to set number of revisions for backup

我正在尝试创建一个批处理脚本以获取 Windows 中的一个目录,并使用批处理脚本使用 7-zip 压缩它,但将每个压缩部分的最大文件大小限制为每个最大 4GB ,将修订压缩集的总数限制为 7(对于每周备份,周一至周日)。最早的将在下一次备份作业中删除。

我试过使用 REM CHECK FOR REVISIONS 代码,但我的知识还不足以理解如何进行此操作。

@ECHO OFF

REM Script created for AVIMark Backup
REM Install 7-zip and make sure to create an environment variable to     allow for shortcuts
REM https://www.7-zip.org/download.html
REM set PATH=%PATH%;C:\Program Files-Zip\
REM echo %PATH%
REM 7z

REM 7ZIP ENVIRONMENT VARIABLE PATH
set PATH=%PATH%;C:\Program Files-Zip\
7z
cls

REM SET SOURCE, DESTINATION AND REVISION AMOUNT VARIABLES
SET source="C:\AVImark"
SET destination="C:\AVImarkBackup"
SET revisions=7

REM Change Directory to the source data folder
cd "%source%"

REM Run the command to compress the directory, gather the date stamp and insert compressed file into destination folder
7z a -r -v4g "%destination%\%DATE:~7,2%.%DATE:~4,2%.%DATE:~-4% Backup".7z

REM CHECK FOR REVISIONS
cd "%destination%"
for /f "skip=%revisions% eol=: delims=" %%F in ('dir /b /o-d /a-d *.7z') do @del "%%F"

预期结果

我希望每个备份集(以其日期格式)总共限制为 7 个修订版。

即:https://imgur.com/a/Q50n0bD

实际结果

最旧的作业没有进行修订检查和清理,它不断添加更多集。

@echo off
setlocal

rem Script created for AVIMark Backup
rem Install 7-zip and make sure to create an environment variable to allow for shortcuts
rem https://www.7-zip.org/download.html
rem set PATH=%PATH%;C:\Program Files-Zip\
rem echo %PATH%
rem 7z

rem 7ZIP ENVIRONMENT VARIABLE PATH
set "PATH=%PATH%;C:\Program Files-Zip"

rem SET SOURCE, DESTINATION AND REVISION AMOUNT VARIABLES
set "source=C:\AVImark"
set "destination=C:\AVImarkBackup"
set "revisions=7"
set "datestamp=%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%"

rem Change Directory to the source data folder
pushd "%source%" && (
    rem Run the command to compress the directory, gather the date stamp and insert compressed file into destination folder
    7z a -r -v4g "%destination%\%datestamp% Backup.7z"
    popd
)

rem CHECK FOR REVISIONS
pushd "%destination%" && (
    rem Option 1
    rem Delete by last modified filedate
    forfiles /d -7 /m "*Backup.7z.*" /c "cmd /c echo del @path"

    rem Or use:

    rem Option 2
    rem Delete by logged date. Requires datestamp yyyy-MM-dd for correct sorting
    if exist Backup.log (
        findstr /c:"%datestamp%" Backup.log || >> Backup.log echo %datestamp%
    ) else (
        > Backup.log echo %datestamp%
    )

    for /f "skip=%revisions% delims=" %%A in ('type Backup.log ^| sort /r') do (
        echo del "%%~A Backup.7z.*"
    )

    popd
)

将日期戳更改为 yyyy-MM-dd 而不是 dd.MM.yyyy。 前一个日期戳更适合排序。 如果您想要独立于语言环境的日期戳,请搜索 wmic os get localdatetime 此站点上的命令。

使用 pushdpopd 而不是 cd。 如果最后一个命令成功,&& 的用途是 运行 后面的命令。 如果最后一个命令失败,|| 是 运行 后面的命令。

提供了 2 个选项用于删除修订:

  1. 第一种是forfiles的使用。 目前已设置,它将删除较早的修订 从当前日期算起超过 7 天。 这可能是合适的,除非没有备份 完成 7 天,这可能导致没有备份。

  2. 第二种是Backup.log的使用。 日期附加到日志文件,然后 for 循环读取带有 typesort 的日志文件 反转排序以使最旧的第一个和最新的 最后的。 skip 避免处理第一个 7 次修订。其余的将用于删除 按文件模式归档。

删除不需要的选项代码。

del 命令被回显用于测试。如果满意, 删除回声以使删除真正起作用。