0

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

我的示例尚未考虑子文件夹中的文件。(是的,必须从某个地方开始)

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

我这样做是因为我们需要最大 100MB 的 zip 文件。如果我得到 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 的原因。

4

1 回答 1

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.7z, archive-2.7z. ..
注意#4:因为测试压缩需要很长时间,所以我没有进行太多测试
注意#5:由于您的特殊需要,脚本运行非常缓慢
接受答案:它是如何工作的?.

于 2013-08-12T21:05:22.380 回答