批量生成100MB存档最大包含文件夹中的所有文件(递归)

时间:2013-08-12 18:00:19

标签: windows batch-file cmd directory 7zip

我希望创建一个程序,将(包含7zip)包含在文件夹中的所有文件(Recursivly)压缩到一个存档中,直到存档达到100MB。无论何时,它都会加入与文件关联的.csv文件,删除它,创建一个带有下一个数字的新文件,并创建一个新的存档。它应该这样做,直到所有文件都归档到一个存档(只要所有文件都添加到一个存档中,数字无关紧要)

我的例子还没有考虑子文件夹中的文件。 (是的,必须从某处开始)

该示例做了一些有点反逻辑的事情,一旦它看到它大于100MB,它确实从存档中删除了最后添加的文件。问题是,我不认为批处理可以在创建之前评估存档的输出,因此它有点解决方法。通过这种方式,它可以设法找到存档的大小,然后确定是否可以使用此存档或是否已完成存档。

我这样做是因为我们需要将zip文件最大化为100MB。如果我获得10或20个.zip文件并不重要,只重要的是没有100MB。之后,我们将使用输出存档并上传它们以将其存档。

正如您所看到的,它还将ECHO名称,类型,文件,事件放入较新的文件中,因为标题是.csv文件中所必需的。需要将.csv文件放入每个存档中,这就是为什么一旦它发现100MB上限就删除最后添加的文件,然后放入.csv然后将其删除。

我已经处理了独特的文件大小,它们都不会超过40MB,只考虑那些小于40MB的文件。

无论如何这是我到目前为止所做的,但它不想工作,因为某些原因它在我双击我的.bat之后尽快关闭

SET /a modif=1
SET "file=importationinfo"
SET "reqext=.csv"
ECHO Name,Type,File,Event> %file%%modif%%reqext%
FOR %%a IN (*.*) DO (
IF NOT %%~zi GTR 40999999 (
    IF /i NOT "%%~nxa"=="%~nx0" (
        IF /i NOT "%%~nxa"=="%file%%modif%%reqext%" (
            FOR /f "delims=" %%b IN ("%%~dpa\.") DO (
                >>"%file%%modif%%reqext%" ECHO "%%~nxa","4","\%%~nxa","%ID%"
                "C:\Program Files\7-Zip\7z.exe" a -tzip Import%modif%.zip "%%~nxa"
                FOR /F %%i IN ("Import%modif%.zip") DO SET "size=%%~zi"
                    ECHO %size%
                    IF %size% GTR 104857599 (
                    ECHO Bigger than 104857599 
                            REM This Echo is only for debugging
                    "C:\Program Files\7-Zip\7z.exe" d -tzip Import%modif%.zip "%%~nxa"
                    PAUSE
                    "C:\Program Files\7-Zip\7z.exe" a -tzip Import%modif%.zip "%file%%modif%%reqext%"
                    DEL %file%%modif%%reqext%
                    SET /a modif+=1
                    ECHO Name,Type,File,Event> %file%%modif%%reqext%
                ) ELSE (
                    ECHO NOT 100MB YET
                    >>"%file%%modif%%reqext%" ECHO "%%~nxa","4","\%%~nxa","%ID%" )
                )
            )
        )
    )
)

就是这样。我真的希望你们能帮助我解决这个问题。 谢谢。 J-P上。

编辑:我知道可以要求最大文件大小为7z并将它们全部压缩,然后它会自动创建多个档案,其中包含.001 .002 ...文件名。但在这种特定情况下,此选项不正常,因为归档不会用于重新创建这些文件,而是用于归档它们(使用.zip格式上载)。因此,如果任何文件被拆分为两个不同的存档,这将导致问题。这也是我想在每个档案中加入新的.csv的原因。

1 个答案:

答案 0 :(得分:1)

你可以测试一下:

@ECHO OFF &SETLOCAL
SET "archive=test\archive"
SET "startfolder=%userprofile%"
SET /a maxsize=104857600

for /f "tokens=1*delims=:" %%a in ('dir /s /b /a-d "%startfolder%" ^| findstr /n $') DO (
    IF %%~za gtr %maxsize% (ECHO "%%a" too large (%%~za Bytes^) &GOTO :EOF)
    SET "$%%a=%%~fb"
    SET "filecount=%%a"
)
SET /a ptr=1
SET /a anr=1
:loop
CALL SET "file=%%$%ptr%%%"
ECHO adding "%file%" TO %archive%-%anr%.7z
START /b /w "7zip" "7za" a "%archive%-%anr%" "%file%" >NUL||(ECHO Error!&GOTO :EOF)
FOR  %%a IN ("%archive%-%anr%.7z") DO SET "asize=%%~za"
IF %asize% gtr %maxsize% (
    ECHO deleting "%file%" FROM %archive%-%anr%.7z
    START /b /w "7zip" "7za" d "%archive%-%anr%" "%file%" >NUL||(ECHO Error!&GOTO :EOF)
    SET /a anr+=1
) ELSE (
    SET /a ptr+=1
)
IF %ptr% leq %filecount% GOTO :loop
ECHO %filecount% file(s) added IN %anr% archive(s).

注意#1:脚本不适用于文件或路径名中的= 注意#2:如果脚本找到大小大于存档大小的文件,则脚本将终止 注意#3:将从archive-1.7zarchive-2.7z ...
创建存档名称 注意#4:因为测试压缩需要很长时间,所以我没有进行太多测试 注意#5:由于您的特殊需要,脚本的工作速度非常慢 <子> Accepting Answers: How does it work?