|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Архивация содержимого папки по размеру |
|
|
CMD/BAT - Архивация содержимого папки по размеру
|
Новый участник Сообщения: 29 |
Доброго времени суток!
Подскажите пожалуйста как при помощи CMD/BAT реализовать следующее: В папке (input) лежат папки и файлы (все время разные по названию и немного отличаются по размеру 5-10КБ), например: images\ files\ rss1.xml robots.txt sitemap.xml sitemap58.php sitemap57.php sitemap56.php sitemap55.php ... art-218011.php Требуется создать архивы по 7,5МБ+-1МБ. Имя архива по названию родительской папки плюс порядковый номер, в итоге должно получиться примерно так: input1.zip (содержит: images\ files\ rss1.xml robots.txt) input2.zip (содержит: sitemap.xml sitemap58.php sitemap57.php) input3.zip (содержит: sitemap56.php sitemap55.php) и т.д. Если реализация по размеру архива 7,5МБ сложна в реализации - вполне подойдет: берем из папки первые (100-200) файлов - пакуем их в input1.zip, следующие (100-200) в input2.zip и так пока не кончатся папки и файлы в папке input. Заранее благодарен! |
|
Отправлено: 15:13, 10-11-2015 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать irvicon, теоретически, то, что Вы просите, сделать в большинстве случаев возможно, но чересчур накладно. Чем Вас не устраивает обычный многотомный архив, который позволяют создавать и 7-Zip, и WinRAR, в том числе и в формате .zip (правда, каждый по-своему)?
|
Отправлено: 14:40, 14-11-2015 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 29
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Iska:
Цитата Iska:
|
||
Отправлено: 21:04, 17-11-2015 | #3 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Вот маразматичное по скорости работы решение
@Echo Off cls Set "DirIn=E:\Games" Set "DirArc=E:\Delete" Set /A SMax=7500000 Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_Input" SetLocal EnableExtensions EnableDelayedExpansion Set /A N=1 FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO ( %ARC% "%DirArc%\%NArc%!N!.rar" "%%i" >nul FOR /F "usebackq delims=" %%j IN (`dir "%DirArc%\%NArc%!N!.rar" /b /A:-D /s`) DO ( Echo %%~zj %NArc%!N!.rar %%i If %%~zj GTR %SMax% Set /A N=!N!+1 ) ) А если реализовывать второй ваш вариант У rar есть ключ -N@<файл-список>, но почему-то мне в файл-списке не удаётся указывать полные (с путями) имена файлов, получается только для файлов в текущей папке. А реально сделать более эффективно - скопировать исходные файлы порциями в промежуточную папку, и уж её архивировать со своим именем с последующим удалением. |
------- Последний раз редактировалось megaloman, 18-11-2015 в 12:59. Отправлено: 12:49, 18-11-2015 | #4 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Я так и вовсе предполагал так же добавлять по одному файлу, а при превышении размера архива выше заданного — ещё и удалять из него последний добавленный файл. |
||
Отправлено: 15:36, 18-11-2015 | #5 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать irvicon, Вы писали: файлы ... немного отличаются по размеру 5-10КБ, при этом размер архивов должны быть по 7,5МБ+-1МБ.
Итак, возмём за основу размер архива, например, 7500 Кб, средний размер файла, например, 10 Кб и, определим опытным путём, процент сжатия файлов архиватором - например, 80%. По видимому, этот процент не сильно меняется для Вашего набора файлов, так как ИМХО, характеристики файлов от случая к случаю не сильно отличаются, скорее всего они создаются одним и тем же софтом для одних и тех же целей. Посчитаем, сколько файлов надо заархивировать, чтобы приблизительно получить архив заданной величины. Куда-нибудь, например, в папку для временных файлов, по очереди будем переписывать исходные файлы вычисленными порциями с сохранением структуры папок, архивировать порцию и затем удалять заархивированную копию. Работает существенно быстрее, чем мой предыдущий вариант, но, естественно, размер архива будет намного сильнее отличаться от заданного. Но, ИМХО, Вам важно не превысить максимально-допустимый размер, что вполне достижимо в приведенном коде.
@Echo Off cls Set /A SMax=7500 Set /A SAve=10 Set /A Perc=80 Set /A NIn=%SMax%*100/SAve/Perc rem Set /A NIn=111 Set "DirIn=E:\Games" Set "DirArc=E:\Delete" Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_Input" SetLocal EnableExtensions EnableDelayedExpansion Call :OutTmp "%DirIn%" cd /d "%Tmp%" xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul Set /A N=1 Set /A M=0 FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO ( Call :OutTmp "%%i" Echo "%%i" Copy "%%i" "!OTmp!" >nul Set /A M=!M!+1 If !M! GEQ %NIn% ( Call :OutTmp "%DirIn%" echo !M! %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\" %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\" >nul rd "%OTmp%" /s /q xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul Set /A N=!N!+1 Set /A M=0 ) ) If NOT !M!==0 ( Call :OutTmp "%DirIn%" echo !M! %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\" %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\" >nul rd "!OTmp!" /s /q ) GoTo :Eof :OutTmp Set "DTmp=%~pnx1" Set "DTmp=%DTmp:~1,999%" Set "OTmp=%Tmp%%~pnx1" GoTo :Eof |
------- Последний раз редактировалось megaloman, 19-11-2015 в 22:15. Отправлено: 19:55, 18-11-2015 | #6 |
Новый участник Сообщения: 29
|
Профиль | Сайт | Отправить PM | Цитировать Цитата megaloman:
![]() ![]() ...но:
|
|
Отправлено: 00:44, 19-11-2015 | #7 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать В соответствии с Вашим техзаданием
@Echo Off CLS Set "P0=%~dp0" Set /A SMax=7500 Set /A SAve=10 Set /A Perc=80 Set /A NIn=%SMax%*100/%SAve%/%Perc% rem Set /A NIn=111 Set "DirIn=E:\Games\Сокровища Монтесумы\Data" Set "DirArc=E:\Delete" Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r FOR /F "usebackq tokens=2,3,* delims=\" %%i IN ('%DirIn%') DO ( Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_%%i" Set "NDir=%%i" Set "PDir=%%j\%%k" Set "PTmp=%Tmp%\%%i" ) SetLocal EnableExtensions EnableDelayedExpansion Call :OutTmp "%DirIn%" xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul cd /d "%PTmp%" Set /A N=1 Set /A M=0 FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO ( Call :OutTmp "%%i" Copy "%%i" "!OTmp!" >nul Set /A M=!M!+1 If !M! GEQ %NIn% ( Call :OutTmp "%DirIn%" echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\" %ARC% "%DirArc%\%NArc%!N!.rar" "%PDir%\*.*" >nul rd "%OTmp%" /s /q xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul Set /A N=!N!+1 Set /A M=0 ) ) If NOT !M!==0 ( echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\" %ARC% "%DirArc%\%NArc%!N!.rar" "%PDir%\*.*" >nul ) cd /d "%P0%" rd "%Tmp%\%NDir%" /s /q GoTo :Eof :OutTmp Set "DTmp=%~nx1" Set "OTmp=%Tmp%%~pnx1" GoTo :Eof Здесь вариант с максимальным приближением к архиву заданного размера
@Echo Off cls Set "DirIn=E:\Games\Сокровища Монтесумы\Data" Set "DirArc=E:\Delete" Set /A SMax=7500000 Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r FOR /F "usebackq tokens=2,3,* delims=\" %%i IN ('%DirIn%') DO ( Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_%%i" ) SetLocal EnableExtensions EnableDelayedExpansion Set /A N=1 FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO ( %ARC% "%DirArc%\%NArc%!N!.rar" "%%i" >nul FOR /F "usebackq delims=" %%j IN (`dir "%DirArc%\%NArc%!N!.rar" /b /A:-D /s`) DO ( Echo %%~zj %NArc%!N!.rar %%i If %%~zj GTR %SMax% Set /A N=!N!+1 ) ) |
------- Последний раз редактировалось megaloman, 20-11-2015 в 15:22. Причина: Закомментировал отладочное данное rem Set /A NIn=111 Отправлено: 08:35, 20-11-2015 | #8 |
Новый участник Сообщения: 29
|
Профиль | Сайт | Отправить PM | Цитировать Цитата megaloman:
те в архиве лишняя вложенность http://c2n.me/3qGOwkC нужно чтобы при распаковке корень последней папки (обведено оранжевой рамкой) |
|
Отправлено: 23:10, 22-11-2015 | #9 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать irvicon, В Вашей постановке задачи
Цитата:
Цитата:
Именно это и делается в моём скрипте: Архив с именем Дата_Games1,2,3 ... содержит папку Сокровища Монтесумы\Data\ с сохранением пути. При этом никакие иные подпапки или файлы в папке Games не затрагиваются. При распаковке, естественно, получится папка с сохранёнными путями Сокровища Монтесумы\Data, при этом никакие иные посторонние подпапки нигде не фигурируют. Что не так? Или Вы хотите, чтобы путь терялся и распаковывалась только самая нижняя из указанных папок Data\ ? |
||
------- Отправлено: 11:05, 23-11-2015 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - Архивация папки в vbs | and331 | Скриптовые языки администрирования Windows | 0 | 17-08-2013 15:15 | |
Любой язык - Скрипт для распределения файлов по папкам кучками по n-ому размеру | DmitryAnatolich | Скриптовые языки администрирования Windows | 9 | 06-05-2013 15:20 | |
Доступ - Запрет на печать содержимого папки | SanCho | Microsoft Windows 7 | 3 | 15-05-2012 17:32 | |
[решено] запрет просмотра содержимого папки | dimds | Microsoft Windows NT/2000/2003 | 4 | 25-03-2011 09:43 | |
Ограничить размер содержимого папки | clin | Microsoft Windows NT/2000/2003 | 6 | 12-12-2008 13:55 |
|