Войти

Показать полную графическую версию : BAT-ник для архивации файлов в нескольких папках


Marker13
28-02-2023, 12:25
Здравствуйте,
прошу помощи форумчан, т.к. я не могу придумать такой батник, опыта совсем минимум в этом.
Итак задача:
есть папка DATA, в ней много папок с названиями в 7 цифр - это серийные номера, они не по порядку, разнобой и в общем всяко разно, но обязательно 7 цифр и только 7 символов.
в каждой папке есть несколько файлов с именем вида серийник-yymmdd.bin
Необходимо, чтобы архиватор создавал архивы отдельно для каждого серийника, на какой-либо год, например за 2020. Нужно за один год конкретный, на следующий год можно будет просто цифру в батнике поменять.
Желательно чтоб результат-архив имел имя серийник-yy.zip (или rar как получиться не знаю, 7z на той машине нету)
Результат может оставаться в этой же папке или складываться в какую-либо одну - не принципиально.

megaloman
28-02-2023, 21:43
обязательно 7 цифр и только 7 символов. » Приведите пример имени папки.
Серийник в имени папки и серийник в имени файла это одно и то же?
Вариант@Echo Off
cls
Set "BoxIn=Z:\Box_In\Data"
Set "BoxOut=Z:\Box_Arc"
Set "Mask=-[0-9][0-9][0-1][0-9][0-3][0-9]\.bin$"

Set Arc="C:\Program Files\WinRar\Rar.exe" u -ep
Set "ArcExt=zip"

FOR /F "usebackq delims=" %%f In (`2^>nul Dir "%BoxIn%" /B /S /A:-D ^|FindStr /I /E /R /C:"%Mask%"`) DO (
Set "Name=%%~nf"
Call Set "yy=%%Name:~-6,2%%"
Call Set "Name=%%Name:~0,-7%%"

>nul Call %Arc% "%BoxOut%\%%Name%%-%%yy%%.%ArcExt%" "%%f"
)
Pause
Exit /BПропишите свои пути

Marker13
01-03-2023, 07:45
Здравствуйте, спасибо вам, попробую ваш вариант.
Да, серийник в имени папки и серийник в имени файла это одно и то же.
Встречаются варианты типа 0035700, 0082444, 0135520, 0156859, 0389132, 0489128, 1285774, 2020567, 9014123
У вас в батнике архивируются все года? я не понял. или где мне можно задать архивировать 19-й год или 20-й?
Объясню: валяются в папках куча файлов например с 19 года по текущее время. Мне нужно заархивировать например отдельно 19-й год, остальные не трогать пока. Потом по обстоятельствам например 20-й, опять же остальные не трогать.

megaloman
01-03-2023, 08:53
Marker13,год указывать не надо. При повторном запуске обновятся только архивы с изменёнными файлами. Если хочется упаковать конкретный год, можно это указать в маске файлов, непример, для 13 года
Set "Mask=-13[0-1][0-9][0-3][0-9]\.bin$"
Еще раз пытаюсь уточнить: в имени папки только серийник или еще имеются символы, в каком месте имени?

Marker13
01-03-2023, 09:25
Ааа теперь понял что это за маска, она берет часть имени после "-"
Да, мне нужно упаковать только конкретный год.

Про уточнение, например: В DATA будет папка 0035700, в ней будут файлы за январь 22года:
0035700-220103.bin
0035700-220110.bin
0035700-220117.bin
или другая папка 0135520, в ней будут соответственно
0135520-220103.bin
0135520-220110.bin
0135520-220117.bin
и т.д. различных папок порядка 1000
понедельно или ежедневно - не важно.
Повторный запуск не требуется для обновления файлов в архивах т.к. по окончании соответствующего периода (дня или недели) файл больше не изменяется никогда. Файлы которые были заархивированы нужно удалить после архивации, где поставить соответствующий ключ?

И еще возник вопрос если архиватору будут попадаться папки с название отличным от серийный номер в 7 цифр (просто сторонняя информация, которая не требует архивации) - как он отреагирует? или лучше убрать ее пока временно?

megaloman
01-03-2023, 11:11
Marker13, после уточнения задачи, гораздо более быстрый вариант@Echo Off
cls
Set "BoxIn=Z:\Box_In\Data"
Set "BoxOut=Z:\Box_Arc"

Set /A YY1=18, YY2=20
Set "Serial=[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"

Set Arc="C:\Program Files\WinRar\WinRar.exe" u -ep -ibck -df
Set "ArcExt=zip"

For /L %%y In (%YY1%,1,%YY2%) Do Set /A ty=%%y+100 & Call :MyArc %%ty:~-2%%
Pause
Exit /B

:MyArc
FOR /F "usebackq delims=" %%d In (`2^>nul Dir "%BoxIn%" /B /A:D ^|FindStr /I /R /C:"^%Serial%$"`) DO (
If Exist "%BoxIn%\%%d\%%d-%1????.bin" >nul %Arc% "%BoxOut%\%%d-%1.%ArcExt%" "%BoxIn%\%%d\%%d-%1????.bin"
)
Exit /B

rem Set "BoxIn=Z:\Box_In\Data" -исходная папка с подпапками с номерами серийников
rem Set "BoxOut=Z:\Box_Arc" -куда помещаются архивы серийников за год (может совпадать с BoxIn

rem Set /A YY1=18, YY2=20 -диапазон архивируемых годов
rem Set "Serial=[0-9][0-9][0-9][0-9][0-9][0-9][0-9]" -маска серийника (=имя подпапки)

rem Set Arc="C:\Program Files\WinRar\Rar.exe" u -ep -df -архиватор. Внимание!!! -df отвечает за УДАЛЕНИЕ исходных файлов
rem Set "ArcExt=zip" -расширение файлов архива (rar или zip)
сли архиватору будут попадаться папки с название отличным от серийный номер в 7 цифр »Архиватору не будут, эти папки будут отсеяны Dir+FindStr, можете иные, с именами не 7 цифр, не удалять.
В подпапках с серийниками не будут архивироваться файлы, которые не начинаются с серийник-yy и не имеют расширение .bin

Marker13
01-03-2023, 14:21
Оооо, работает. Большое спасибо.




© OSzone.net 2001-2012