我希望创建一个程序,将(包含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的原因。
答案 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.7z
,archive-2.7z
...
创建存档名称
注意#4:因为测试压缩需要很长时间,所以我没有进行太多测试
注意#5:由于您的特殊需要,脚本的工作速度非常慢
<子> Accepting Answers: How does it work? 子>