Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Сделать скрипт с хитрым алгоритмом упаковки файлов (http://forum.oszone.net/showthread.php?t=325052)

sancher 20-03-2017 17:46 2721411

Сделать скрипт с хитрым алгоритмом упаковки файлов
 
Всем здравствуйте.
Буду крайне признателен если кто-то сможет помочь.
Есть папка, в которой куча разных подпапок, часть из которых называется
имя_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 2721435

Цитата:

Цитата sancher
Надеюсь всё понятно написал. »

Туманно.

megaloman 20-03-2017 20:04 2721451

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

sancher 21-03-2017 08:47 2721588

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

megaloman 21-03-2017 09:43 2721602

Код:

@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 2721608

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

megaloman 21-03-2017 10:21 2721614

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

sancher 21-03-2017 10:35 2721618

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

sancher 22-01-2022 16:32 2978451

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

megaloman 22-01-2022 18:30 2978463

Цитата:

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

@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 2978464

Цитата:

Цитата sancher
в одной папке в отдельные архивы с именем файла »

Код:

@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 2978478

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 2978491

Цитата:

Цитата sancher
Что должно было получиться: »

Не должнО. Задача понималась так: имеем некоторую папку с подпапками с файлами, которые надо архивировать и сохранить в другом месте.
Если заархивированные файлы надо оставить в тех же папках, где находились исходные, то:

- в один архив с именем папки, содержащей эти файлы
Код:

@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 2978495

megaloman
Огромное спасибо!
Всё прекрасно работает.
Надеюсь, что эти скрипты пригодятся многим людям.


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


Время: 07:54.

Время: 07:54.
© OSzone.net 2001-