PDA

Показать полную графическую версию : [решено] Сделать скрипт с хитрым алгоритмом упаковки файлов


sancher
20-03-2017, 17:46
Всем здравствуйте.
Буду крайне признателен если кто-то сможет помочь.
Есть папка, в которой куча разных подпапок, часть из которых называется
имя_logs.
Задача: нужно зайти скриптом в каждую из этих подпапок имя_logs, в которой
лежат файлы с расширениями log, zip, файлы zip (старые) не трогать, а файлы log
необходимо упаковать в один файл, точнее не в один а в несколько.
Нужно собрать файлы по году (взять год времени создания файла), имя результирующего
архива: год.zip
то есть если есть файлы log, созданные в 2015, 2016 годах, то
все log файлы за 2015 год собрать в один архив 2015.zip, а за
2016 в 2016.zip.
Да, самое главное. Нужно не брать последний лог файл (за текущий день),
а брать начиная со вчерашнего и ранее. И будет здорово, если можно реализовать
дозапись новых файлов в 2017 году.
То есть пакуем все файлы за 2017 год кроме сегодняшнего в файл 2017.zip,
если запустим скрипт на следующий день, то добавляем оставшийся файл log
в архив 2017.zip.
Да, идеально будет, если использовать 7zip.
Надеюсь всё понятно написал.

Iska
20-03-2017, 19:03
Надеюсь всё понятно написал. »
Туманно.

megaloman
20-03-2017, 20:04
sancher, Экий Вы путаник :)
1. Нужно собрать файлы по году (взять год времени создания файла), имя результирующего архива: год.zip. Куда поместить этот архив.
2. Не кажется ли Вам, что заархивированные файлы надо удалить?
3. А файлы в архиве хранить с путями?
4. имя результирующего архива: год.zip - а формат архива тоже zip?. Не уверен, но, похоже, 7zip не умеет форматировать в формате Zip.
И вообще, с RARом было бы проще.

sancher
21-03-2017, 08:47
Iska, megaloman, прошу прощения, словесность - не мой конёк )
megaloman, все вопросы по делу, спасибо.
1. Архив оставить в исходной папке имяпапки_log
2. Заархивированные файлы log действительно нужно удалить после успешного сжатия.
3. Нет, файлы нужно хранить без путей. Открыл архив, а внутри просто файлы.
4. Формат архива zip, который можно просмотреть встроенными средствами Windows. Если правильно помню, у 7zip это опция -tzip.
C rar-ом проще, но он денег стоит )

megaloman
21-03-2017, 09:43
@Echo Off
cls

Set "BoxIn=Z:\Data"

Set "MDir=*_logs"
Set "MFil=*.log"

Set Arc="C:\Program Files\7-Zip\7z.exe" a -tzip -sdel

FOR /F "usebackq delims=" %%d IN (`Dir "%BoxIn%\%MDir%" /S /B /A:D 2^>nul`) DO (
FOR /F "usebackq delims=" %%f IN (`Dir "%%d\%MFil%" /B /A:-D /O-D /T:C 2^>nul`) DO Call :ArcOut "%%d\%%f"
)

pause
GoTo :Eof

:ArcOut
FOR /F "tokens=1 delims= " %%i IN ("%~t1") DO Set TFile=%%i
If "%TFile%"=="%Date%" GoTo :Eof
%Arc% "%~dp1%TFile:~-4%" %1
В формате отображения даты, прописанном в системе, год должен быть в формате ГГГГ и быть последним

sancher
21-03-2017, 09:58
megaloman, большое спасибо
есть вопрос
Set "BoxIn=Z:\Data" - Z:\Data - это корневая папка, в которой мы работаем?
если так, то почему BoxIn нигде дальше не используется?
я запустил ваш скрипт в таком виде, но он ничего не делает

megaloman
21-03-2017, 10:21
sancher, Виноват, был невнимателен. Код исправил в двух местах. Пропишите вместо Z:\Data "папку, в которой куча разных подпапок, часть из которых называется имя_logs".

sancher
21-03-2017, 10:35
megaloman, супер!
мегабольшое человеческое спасибо за вашу помощь!
я бы такой скрипт рожал минимум день-два, а может и больше
а может вообще бы не осилил
так что очень сильно выручили
ещё раз благодарю!

sancher
22-01-2022, 16:32
Уважаемый megaloman, помогите, пожалуйста, с другой версией скрипта.
У меня есть папка, в которой большое число других папок, содержащих папки и файлы.
Папки имеют названия на русском и на английском языке.
Задача: нужно скриптом зайти в каждую папку-подпапку (во все папки в дереве) и архиватором 7zip
с уровнем сжатия 1-Скоростной сжать файлы *.log и log*.txt в один архив с именем папки, содержащей эти файлы. После чего исходные файлы удалить.
И было бы здорово иметь 2 версию этого же скрипта: архивировать файлы *.log и log*.txt
в одной папке в отдельные архивы с именем файла, после чего исходные файлы удалить.

megaloman
22-01-2022, 18:30
в один архив с именем папки, содержащей эти файлы@Echo Off
Set "BoxIn=Z:\Box_Arc"
Set "Mask1=*.log"
Set "Mask2=log*.txt"

Set "BoxOut=Z:\Box_Out"

Set ARC="C:\Program Files\7-Zip\7z.exe" a -mx1 -sdel

Call :MyArc "%BoxIn%"

FOR /F "usebackq delims=" %%d In (`2^>nul Dir /B /A:D /S "%BoxIn%\"`) DO (
Call :MyArc "%%d"
)
Exit /B

:MyArc
If Not Exist "%~1\%Mask1%" If Not Exist "%~1\%Mask2%" Exit /B
%ARC% "%BoxOut%\%~nx1.zip" "%~1\%Mask1%" "%~1\%Mask2%"
Exit /B
Пропишите свои пути, сохраните в 866 кодировке.

megaloman
22-01-2022, 18:54
в одной папке в отдельные архивы с именем файла »@Echo Off
Set "BoxIn=Z:\Box_Arc"
Set "Mask1=*.log"
Set "Mask2=log*.txt"

Set "BoxOut=Z:\Box_Out"

Set ARC="C:\Program Files\7-Zip\7z.exe" a -mx1 -sdel

Call :MyArc "%BoxIn%"

FOR /F "usebackq delims=" %%d In (`2^>nul Dir /B /A:D /S "%BoxIn%\"`) DO (
Call :MyArc "%%d"
)
Exit /B

:MyArc
FOR /F "usebackq delims=" %%f In (`2^>nul Dir "%~1\%Mask1%" "%~1\%Mask2%" /B /A:-D`) DO (
%ARC% "%BoxOut%\%%f.zip" "%~1\%%f"
)
Exit /B
То же, но короче@Echo Off
Set "BoxIn=Z:\Box_Arc"
Set "Mask1=*.log"
Set "Mask2=log*.txt"

Set "BoxOut=Z:\Box_Out"

Set ARC="C:\Program Files\7-Zip\7z.exe" a -mx1 -sdel

FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /S "%BoxIn%\%Mask1%" "%BoxIn%\%Mask2%"`) DO (
>nul %ARC% "%BoxOut%\%%~nxf.zip" "%%f"
)
Exit /B

sancher
22-01-2022, 23:40
megaloman, большое спасибо, но видимо я немного неправильно сформулировал задачу.

1. " в один архив с именем папки, содержащей эти файлы "

Я указал папку BoxIn, в качестве BoxOut указал ту же папку.
Что получилось:
1. В папке BoxIn есть папка 1, в которой лежали файлы *.log
В итоге после работы скрипта папка 1 стала пустой (хотя там должен был оказаться файл 1.7z)
2. В папке BoxIn есть папка 2, в которой лежали файлы *.log и папка 1 с файлами log*_.txt
В итоге после работы скрипта папка 2 стала содержать только пустую папку 1.

То есть в итоге у меня в корне BoxIn оказалось 2 архива 1.zip и 2.zip и 2 пустые папки 1 и 2 (папка 2 с пустой папкой 1).

Что должно было получиться:
в папке BoxIn должны были остаться папки 1 и 2,
в папке 1 должен был быть архив 1.zip с файлами *.log.
В папке 2 должен был быть архив 2.zip c фалйами *.log, которые лежали в этой папке,
и папка 1 с архивом 1.zip внутри, содержащим файлы log*.txt

2. " в одной папке в отдельные архивы с именем файла "

Сразу взял короткий вариант и получлось примерно то же самое, что и в пункте 1

То есть в итоге у меня в корне BoxIn оказалось 2 пустые папки 1 и 2 (папка 2 с пустой папкой 1)
и 18 файлов zip с файлами, которые лежали в исходной BoxIn и подпапках.

megaloman
23-01-2022, 10:01
Что должно было получиться: »Не должнО. Задача понималась так: имеем некоторую папку с подпапками с файлами, которые надо архивировать и сохранить в другом месте.
Если заархивированные файлы надо оставить в тех же папках, где находились исходные, то:

- в один архив с именем папки, содержащей эти файлы@Echo Off
Set "BoxIn=Z:\Box_Arc"
Set "Mask1=*.log"
Set "Mask2=log*.txt"

Set ARC="C:\Program Files\7-Zip\7z.exe" a -mx1 -sdel

Call :MyArc "%BoxIn%"
FOR /F "usebackq delims=" %%d In (`2^>nul Dir /B /A:D /S "%BoxIn%\"`) DO (
Call :MyArc "%%d"
)
Exit /B

:MyArc
If Not Exist "%~1\%Mask1%" If Not Exist "%~1\%Mask2%" Exit /B
Echo %1
>nul %ARC% "%~1\%~nx1.zip" "%~1\%Mask1%" "%~1\%Mask2%"
Exit /B



- в одной папке в отдельные архивы с именем файла@Echo Off
Set "BoxIn=Z:\Box_Arc"
Set "Mask1=*.log"
Set "Mask2=log*.txt"

Set ARC="C:\Program Files\7-Zip\7z.exe" a -mx1 -sdel

FOR /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /S "%BoxIn%\%Mask1%" "%BoxIn%\%Mask2%"`) DO (
Echo "%%f"
>nul %ARC% "%%f.zip" "%%f"
)
Exit /B

sancher
23-01-2022, 11:28
megaloman
Огромное спасибо!
Всё прекрасно работает.
Надеюсь, что эти скрипты пригодятся многим людям.


p.s. отмечу лишь один момент
хотя опция -tzip не используется, по факту получаются архивы zip
поменял расширение на .7z, и архивы уменьшились в размере
поэтому если кто-то решит использовать эти скрипты, то замените .zip на .7z




© OSzone.net 2001-2012