Компьютерный форум 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=335943)

Skylear 30-07-2018 21:06 2824072

Архивация по маске
 
привет всем.
имеем
1) 7Zip
2) Структуру папок - год/месяц/дата/заказ(ы)

задача:
1) необходимо запаковать с помощью скрипта все каталоги поотдельности, лежащие внутри папки "дата", - заказ001 (далее заказ002, 003....) в архив с сохранением имени "заказ001.7z" (002,003....)
2) удалить заархивированные папки, чтобы остались только архивы

должны получить структуру типа -
год1/месяц1/дата1/заказ001.7z
год2/месяц2/дата2/заказ001.7z

ну и так далее, собственно превратить в архивы все что ниже папки "дата"


в общем то вот этот скрипт

Код:

for /D %%i in (*.*) do "C:\Program Files\7-zip\7z.exe" a "%%i.7z" -mx9 "%%i"
pause

архивирует папки внутри одной папки, типа "дата1\заказ001" (002, 003), но только если его руками класть в папку "дата1", а папки с названием дат лежат в папке с названием "месяц1", можно указать маску хотя бы папки с названием дат, чтобы руками не класть скрипт

Busla 30-07-2018 22:20 2824096

Код:

forfiles /S /P c:\temp /C "cmd /c if @isdir==TRUE (echo @relpath | findstr /R \"\.\\.*\\.*\\.*\\.*\"> nul && 7z a -sdel @path.zip @path\* && rmdir @path)"
регулярку лучше подогнать под используемый формат даты

Skylear 30-07-2018 22:25 2824098

формат даты одинаков везде, типа "01.02.16"

Busla 30-07-2018 22:47 2824105

Цитата:

Цитата Skylear
2) Структуру папок - год/месяц/дата/заказ(ы) »

Цитата:

Цитата Skylear
формат даты одинаков везде, типа "01.02.16" »

что-то не сходится и я не про точку или дробь вместо обратного слэша
или это 16 февраля 2001 года?

Skylear 30-07-2018 22:58 2824108

1 февраля 2016 года.

формат структуры таков:
2015\февраль\01.02.15\заказ001
2015\февраль\01.02.15\заказ002
2016\апрель\01.04.16\заказ001

типа такого.
формат названия папки в виде даты такой)
в общем подкорректировал скрипт следущющим образом, работает

Код:

forfiles /S /P H:\SHARE2\test /C "cmd /c if @isdir==TRUE (echo @relpath | findstr /R \"\.\\.*\\.*\\.*\\.*\"> nul && c:\Progra~1\7-zip\7z.exe a -sdel @path.7z -mx9 @path\* && rmdir @path)"

pause

ругался на 7z, пришлось дописать путь, и изменил сжатие и формат архива, сейчас тестирую, вроде правильно все....


еще один момент, кроме папок с именами "заказов" рядом лежат еще просто файлы, типа *.jpg и др..
как в этот скрипт добавить команды, чтобы все эти файлы архивировались поотдельности в каждый архив?
типа файл:
"2015\февраль\01.02.15\картинка001.jpg" стал отдельным архивом.

и хорошо бы перед удалением исходной папки архиватор тестировал архив на ошибки, но это необязательно.)

Busla 31-07-2018 10:22 2824166

Skylear, извиняюсь, решил, что подразумевается день месяца, а не дата полностью, а рекомендация моя касалась всего пути

Цитата:

Цитата Skylear
как в этот скрипт добавить команды, чтобы все эти файлы архивировались поотдельности в каждый архив? »

почти никак - скорее, подобным образом сделать второй этап обработки, да и толку от сжатия jpeg очень мало - это уже очень эффективно сжатые данные

Цитата:

Цитата Skylear
и хорошо бы перед удалением исходной папки архиватор тестировал архив на ошибки, но это необязательно.) »

уберите ключ -sdel, добавьте через && проверку архива, а к rmdir ключи /S и /Q
только надо понимать, что в таком случае процессы архивации и удаления будут разнесены во времени и совершенно независимы друг от друга

Skylear 31-07-2018 10:36 2824170

вот накалякал типа такого скрипта, выполняется вроде.

Код:

Set BoxIn="H:\SHARE2\Архивы проектов дизайнеров\2016\Январь"


FOR /D /r %%F in ("*") DO (

pushd %CD%
cd %%F
FOR %%X in (*.rar, *.zip, *.7z) DO (
"C:\Program Files\7-zip\7z.exe" x "%%X" -y
)
popd

)

del /s %BoxIn%\*.zip
del /s %BoxIn%\*.rar
del /s %BoxIn%\*.7z


forfiles /S /P %BoxIn% /C "cmd /c if @isdir==TRUE (echo @relpath | findstr /R \"\.*\\.*\\.*\"> nul && c:\Progra~1\7-zip\7z.exe a -sdel @path.7z -mx9 @path\* && rmdir @path)"

Set "BoxIn1=H:\SHARE2\Архивы проектов дизайнеров\2016\Январь"
Set "Maska=*.tif"

Set "Arc="C:\Program Files\7-zip\7z.exe" a -mx9"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn1%\%Maska%" /b /s /a:-d`) DO (
        Echo %%f
        %Arc% "%%~f.7z" "%%f"
)

del /s "%BoxIn1%\"*.tif



Set "BoxIn2=H:\SHARE2\Архивы проектов дизайнеров\2016\Январь"
Set "Maska2=*.psd"

Set "Arc="C:\Program Files\7-zip\7z.exe" a -mx9"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn2%\%Maska2%" /b /s /a:-d`) DO (
        Echo %%f
        %Arc% "%%~f.7z" "%%f"
)

del /s "%BoxIn2%\"*.psd

Pause


1) разархивирует все архивы, которые есть в данной папке и ее подпапках
2) удаляет эти архивы, оставляя только файлы
3) делает архивацию папок, лежащих в "датах" (но одного месяца, в котором лежит скрипт)
4) удаляет исходники, оставляя архивы
5) архивирует оставшиеся файлы форматов psd и tif, которые найдет в папке и подпапках
6) удаляет файлы psd и tif


подправьте, если что-то коряво написано.
хотелось бы еще скрипт запускать из любого места, лишь с указанием пути в переменной сверху, (никак не разберусь как это сделать), а так - его надо обязательно класть в папку "месяц" ("декабрь", например), чтобы работал (если положить выше в папку "год", то начнет шерстить в других папках "месяц" (типа "январь" и "март" и все еще оставшиеся, если они есть) - а это неудобно)


Время: 18:43.

Время: 18:43.
© OSzone.net 2001-