2013-08-12 2 views
0

Я ищу, чтобы создать программу, которая будет zip (используя 7zip) все файлы, содержащиеся в этой папке (Recursivly), в архив до тех пор, пока архив не достигнет 100 МБ. Всякий раз, когда это происходит, он присоединяется к CSV-файлу, связанному с файлом, удаляет его, создает новый со следующим номером, а также создает новый архив. Он должен делать это до тех пор, пока все файлы не будут заархивированы в архив (число не имеет значения до тех пор, пока все файлы, добавленные в архив)Batch Make 100MB Archive max со всеми файлами, содержащимися в папке (Рекурсивный)

Мой пример не рассматривает файлы внутри подпапок. (да, нужно что-то начинать)

Пример делает что-то немного контр-логическое, он удаляет последний добавленный файл из архива, как только он видит, что он больше 100 МБ. Проблема в том, что я не думаю, что пакет может оценить вывод архива перед его созданием, поэтому это немного обходное решение. Таким образом, ему удается найти размер архива, а затем определить, нормально ли идти, или если это было сделано с этим.

Я делаю это, потому что нам нужны файлы ZIP, максимальные 100 МБ. Не имеет значения, если я получаю 10 или 20 .zip-файлов, это имеет значение только для того, чтобы ни один бюст 100 МБ. После этого мы будем использовать выходные архивы и загружать их, чтобы архивировать все это.

Как вы можете видеть это также ECHO Name, Type, File, Event в новый файл, потому что заголовки требуются в CSV-файле. Необходимо вставить файл .csv в каждый архив, и именно поэтому, когда он видит колпачок в 100 МБ, он удаляет последний добавленный файл, а затем помещает его в .csv, а затем удаляет его.

Я уже позаботился о уникальном размере файла, ни один из них не будет больше 40 МБ, и будут рассмотрены только те, которые меньше 40 МБ.

Во всяком случае, это то, что я до сих пор, но он не хочет работать, по какой-то причине он закрывает как можно скорее после того, как я дважды щелкните мой .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.

EDIT: Я знаю, что можно запросить максимальный размер файла до 7z и закрепить их все вместе, и он автоматически создаст несколько архивов с именами .001 .002 ... filenames. Но в этом конкретном случае эта опция не в порядке, поскольку архивы не будут использоваться для воссоздания этих файлов, но для их архивирования (загрузка с использованием формата .zip). Поэтому, если любые файлы разбиты на два разных архива, это вызовет проблемы. Вот почему я хочу присоединиться к новому CSV в каждом архиве.

+0

Если вы используете 'Winrar', вы можете установить размер файла в командной строке. – Endoro

+0

В настоящее время я не могу использовать Winrar для этого конкретного случая. И я также могу указать максимальный размер с 7z, но он может нарезать файл пополам. Я не хочу этого. – Quardah

+0

Вы можете использовать '7za a -v100m" архив "" filemask "'! В противном случае удачи! – Endoro

ответ

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: сценарий завершится, если он найдет файл с размера больше, чем размер архива
Note # 3: архив имена будут созданы из archive-1.7z, archive-2.7z ...
примечания # 4: потому что сжатие тестирования занимает много времени, я havn't испытание очень многих
примечания # 5 : из-за ваши особые потребности сценарий работает очень медленно
Accepting Answers: How does it work?.

+0

Endoro, Прежде всего, спасибо за быстрый ответ. Я буду тестировать это в следующие моменты и расскажу вам, как он себя чувствует. Глядя на него, он выглядит довольно аккуратно. Не беспокойтесь о скорости; любая пакетная программа работает быстрее, чем мои пользователи. Они умны, но медленны с компьютерами: p – Quardah

+0

Назад после нескольких испытаний; первый блок «Сбой при поиске файла размером более 100 МБ» не работает, но мне все равно, так как я удалил все это. Тем не менее, все работает после нескольких изменений. Я покажу вам, как только я закончу, чтобы у следующих пользователей был ответ. – Quardah