如何在不使用 7-Zip 拆分功能的情况下将数千个文件存档到多个 7-Zip 存档中?

如何在不使用 7-Zip 拆分功能的情况下将数千个文件存档到多个 7-Zip 存档中?

我需要将文件归档到 7-zip 档案中,每个档案的大小都低于用户定义的大小(以 GB 为单位)。我无法使用 7-Zip 中的拆分功能,因为这会阻止另一端的用户接收我的文件、提取文件并处理它们,直到他们拥有拆分卷中的所有文件。我正在处理的文件被组织到年度文件夹内的月度文件夹中。

我需要维护文件夹结构,因此我希望每个月度文件夹仅包含该文件夹的 7-Zip 档案。我还希望它在创建档案后清理源文件。该脚本应在“父文件夹”上运行并存档其下的所有文件,同时维护文件夹结构。

答案1

最终回答了我自己的问题......

@echo off
setlocal EnableExtensions EnableDelayedExpansion
::set max 7z archive -- 200MB = 209,715,200
set MaxBag=210000000
echo ******************************************************************************************
echo 'PruneNBag.cmd' uses the current path it is placed in as the cleanup point, called 'TreeTop'
echo All files in all subfolder(s) below the TreeTop will be condensed into 7z archives.
echo ******************************************************************************************
:Ask
::Confirm current working directory is the intended 'TreeTop'
echo Current Directory is:  "%CD%"  Use as 'TreeTop'?  (Y/N/exit)
set INPUT=
set /P INPUT=Type input: %=%
If /I "%INPUT%"=="y" goto yes 
If /I "%INPUT%"=="n" goto no
If /I "%INPUT%"=="exit" goto exit
echo Incorrect Input & goto Ask
:yes
set treetop=%CD%
echo Pruning current directory, %treetop%
"%PROGRAMFILES%\7-Zip\7z.exe" h * "!Bag!" "%treetop%\%%a\%%b"
ping 1.1.1.1 -n 1 -w 3000>nul
    FOR /f %%a in ('dir /b /ad %treetop%') DO (
        set BagCounter=1
        FOR /f %%b in ('dir /b %treetop%\%%a') DO (
            set Bag=%treetop%\%%a\%%a-!BagCounter!.7z
            "%PROGRAMFILES%\7-Zip\7z.exe" a -mx0 "!Bag!" "%treetop%\%%a\%%b" -sdel
            FOR /F "usebackq" %%A IN ('!Bag!') DO (
                set BagSize=%%~zA
                echo bagsize is !BagSize!
                echo maxbag is !MaxBag!
                if !BagSize! GEQ !MaxBag! set /a BagCounter += 1
                echo BagCount is !BagCounter!
            )
        )
    )
echo Pruning operations complete...
ping 1.1.1.1 -n 1 -w 2000>nul
goto end
:no
echo Place PruneNBag.cmd in 'TreeTop' folder root and run again.
pause
echo closing...
ping 1.1.1.1 -n 1 -w 2000>nul
exit
:end
echo closing...
ping 1.1.1.1 -n 2 -w 2000>nul
exit

相关内容