|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Архивирование каталога |
|
CMD/BAT - Архивирование каталога
|
Пользователь Сообщения: 61 |
Профиль | Отправить PM | Цитировать
Здравствуйте!
Помогите, пожалуйста, со следующими вопросами. 1. Есть каталог Src и каталог Dst. Требуется создать батник, который будет запускаться периодически, т.е. от случая к случаю, и который будет добавлять архивы ВСЕХ каталогов, включая их подкаталоги, из Src в Dst с именами архивов, совпадающими с именами каталогов первого уровня из Src. То есть, после отработки такого батника, в Dst должны создаться все несуществующие там архивы с именами, совпадающими с именами каталогов первого уровня из Src. Архивы в Dst могут быть как *.rar, *.zip, *.7z и пр. одновременно. Важны лишь сами имена без их архивного расширения. В целях ускорения работы такого батника при его повторных запусках, хотелось бы, чтобы при наличии в каталоге Dst архивов (*.rar, *.zip, *.7z и пр.) с именами каталогов из Src, эти каталоги из Src повторно в Dst не переархивировались. То есть, если запустить такой батник в случае, когда в Dst уже имеются все имена архивов, совпадающие (без учёта архивного расширения типа .rar, .zip, .7z и пр.) c именами каталогов первого уровня из Src, то такой батник ничего не должен создавать или перепаковывать. При этом должно быть допустимым наличие в Dst прочего содержимого - как файлов, так и папок, которые вообще не имеют отношения к именам из Src. 2. Если предположить частный случай по первому вопросу - имена каталогов первого уровня в Src находятся в формате даты YYYYMMDD, хотелось бы отдельным батником установить реальные даты создания/изменения этих каталогов в соответствии с их именами. Время не важно. Буду признателен за помощь. |
|
Отправлено: 22:08, 01-11-2018 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Огромное Вам спасибо! В батниках Вы не просто мегаломэн, а настоящий мегалодон! |
|
Отправлено: 21:07, 02-11-2018 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата UserX:
Ещё никогда Штирлиц не был так близок к провалу :).
|
|
Отправлено: 22:06, 02-11-2018 | #12 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать Iska,
Придумал достаточно идиотский способ, на вложенные файлы/папки он не действует
@Echo Off cls Set "BoxIn=Z:\Box_In" Set "Mask=20??????." Set "TD=%Date%" FOR /D %%d IN ("%BoxIn%\%Mask%") DO Set "DD=%%~nd" &Call :ReData %%DD:~6,2%%.%%DD:~4,2%%.%%DD:~0,4%% "%%d" Date %TD% pause GoTo :Eof :ReData Date %1 Ren %2 "%~nx2.tmp" ||Exit /B 2 Md %2 &&( For /F "usebackq delims=" %%i IN (`2^>nul Dir /B "%~2.tmp"`) DO ( Move "%~2.tmp\%%i" "%~2\" >nul ) Rd "%~2.tmp" ) GoTo :Eof |
------- Отправлено: 23:55, 02-11-2018 | #13 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, это работает!! Вы - просто супер.
|
Отправлено: 01:36, 03-11-2018 | #14 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, мне невероятно понравилась Ваша идея с маской.
С такой идеей мою частную задачу (лабораторку) можно обобщить на более общую задачу. Допустим, есть группа файлов (папок), имена которых связаны с датой их создания. Например: <Info1>2018<delimeter>10<delimeter>??<Info2> где <Info1> и <Info2> (вместе с символами < и >, которые используются лишь для улучшения читабельности) - некоторые тексты, являющиеся необязательной частью имени файла. <Info1> и/или <Info2> - произвольный текст, который может и отсутствовать; <delimiter> - символ-разделитель между годом, месяцем и днём в имени файла. Может быть не один, а может и вовсе отсутствовать; Например, если указывается маска: Set "Mask=File_2018-10-??_Original" то подразумевается, что данная маска будет читаться так: "Группа всех файлов (каталогов), начинающаяся со слова "File_" и заканчивающаяся словом "_Original" за весь октябрь месяц 2018 года. Теперь сама задача. Очень хотелось бы модифицировать Ваш последний скрипт, таким образом, чтобы по указанной маске из каталога Src выбирался ТОЛЬКО ОДИН самый последний по сортирумому имени файл и, если архива с таким именем нет в каталоге Dst, то он туда архивировался. То есть из приведённой маски: File_2018-10-??_Original из Src должен выбраться только один файл с именем "File_2018-10-31_Original" (или другой последний, если за 31.10.2018 ничего нет) и архивироваться в Dst при отсутствии в нём архва с таким именем. Оно, конечно, в приведённой маске указание направления сортировки с Ascending на Discending могло бы вместо последнего октябрьского файла 2018 года выбрать первый октябрьский файл 2018 года, но это уже может оказаться перебором с моей стороны. Я извиняюсь, если вдруг подкидываемые мною "лабораторки" стали выглядеть как некоторая наглость со стороны человека, который сам только теоретизирует, а делать за него должен кто-то другой. Ничего такого в мыслях не было. Просто подкинутая в Вашем скрипте идея маски меня совершенно свела с ума своим великолепием и очень захотелось её практически применить с максимальной эффективностью. |
Последний раз редактировалось UserX, 04-11-2018 в 22:00. Отправлено: 21:48, 04-11-2018 | #15 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать @Echo Off cls Set "Src=Z:\Box_In\Мой контент\Книги" Set "Mask=File_2018-10-??_Original." Set "Dst=Z:\Книги.arc" Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y Set "Ext=rar" Set "LastDir=" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /A:D /B /O:N`) DO Set "LastDir=%%d" If "%LastDir%"=="" (Echo Folder not Found "%Src%\%Mask%\" &Pause &Exit /B 1) If Not Exist "%Dst%" Md "%Dst%" Pushd "%Src%" &&( If Not Exist "%Dst%\%LastDir%.*" (Echo "%Src%\%LastDir%\" &%Arc% "%Dst%\%LastDir%.%Ext%" "%LastDir%\") Popd ) pause GoTo :Eof |
------- Последний раз редактировалось megaloman, 04-11-2018 в 23:00. Отправлено: 22:48, 04-11-2018 | #16 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, да, с каталогами в папке Src это теперь прекрасно работает!
А можно ли сделать так, чтобы в каталоге Src могли быть не только вложенные папки, к которым будет применима такая маска, но и просто файлы, к которым будет применяться та же самая маска? То есть, различия между папкой или файлом в каталоге Src для архивирования быть не должно, а маска должна одинаково относиться и к файлам, и к папкам. Таким образом архивироваться в каталог Dst будут или файл, или папка из Src, в зависимости от того, чьё имя старше с точки зрения даты, являющейся частью имени. Или такое возможно только либо-либо, то есть, либо в каталоге Src будут папки и тогда файлы будут игнорироваться, либо файлы, но тогда будут игнорироваться каталоги? Я ещё раз извиняюсь за наглость. |
Отправлено: 03:00, 05-11-2018 | #17 |
Ветеран Сообщения: 2703
|
Профиль | Отправить PM | Цитировать можно сделать так, чтобы в каталоге Src могли быть не только вложенные папки, к которым будет применима такая маска, но и просто файлы, к которым будет применяться та же самая маска
@Echo Off cls Set "Src=Z:\Box_In\Мой контент\Книги" Set "Mask=File_2018-10-??_Original." Set "Dst=Z:\Книги.arc" Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y Set "Ext=rar" Pushd "%Src%" || (Echo Folder not Found "%Src%" &Pause &Exit /B 2) Set "Name=" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO Set "Name=%%d" If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Pause &Exit /B 1) If Not Exist "%Dst%" Md "%Dst%" If Not Exist "%Dst%\%Name%.*" (Echo "%Src%\%Name%" &%Arc% "%Dst%\%Name%.%Ext%" "%Name%") Popd pause GoTo :Eof |
------- Отправлено: 09:22, 05-11-2018 | #18 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, Вы это сделали, и это работает!!
Огромное Вам спасибо! Вы - лучший. Поделюсь с Вами мыслями. Конечно, делать мешанину из файлов и папок в каталоге не совсем здОрово, но раз даже это проходит, значит, для Src, состоящего только из каталогов или только из файлов это будет работать точно, поскольку задача решена Вами в самом общем виде. Потому просторы для этого решения открываются просто безграничные. Я пока не могу их даже полностью осмыслить до самого конца. Практически, Вы сделали гипотезу батеньки Пуанкаре реальностью! PS Вот осмыслю до конца и поглядим, какие новые проблемы создаст это решение. |
Последний раз редактировалось UserX, 05-11-2018 в 19:29. Отправлено: 19:15, 05-11-2018 | #19 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, произошло некоторое осмысление.
Проверил работу скрипта при очень разной маске и с весьма разнообразным содержимым каталога Src. Даже при пустой маске, т.е.: Set "Mask=" на мой взгляд работает правильно. Пустая маска полностью соответствсует маске *.* Т.е. Set "Mask=" полностью эквивалентна Set "Mask=*.*" И это, на мой взгляд, вполне логично. Однако, коль скоро эти два варианта работают идентично, можно ли попросить Вас о модификации Вашего последнего скрипта таким образом, чтобы при задании пустой маски, т.е. при указании: Set "Mask=", как исключение, скрипт работал несколько иначе. А именно, если маска пустая, чтобы архивировались из каталога Src в каталог Dst не самый последний, а ВСЕ папки и ВСЕ файлы, архивов которых ещё нет в Dst. Тогда этот один скрипт станет универсальным и заменит собой (и даже расширит) скрипт из первой задачи. Спасибо! |
Отправлено: 22:31, 05-11-2018 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - архивирование и шифрование каталога | Jalo | Скриптовые языки администрирования Windows | 10 | 24-12-2013 01:33 | |
Любой язык - Сравнение списка файлов и каталога с файлами с копированием файлов из каталога | jastreb83 | Скриптовые языки администрирования Windows | 0 | 10-04-2013 09:56 | |
CMD/BAT - Архивирование с удалением каталога при помощи запуска батника из того же каталога | HAMMER7 | Скриптовые языки администрирования Windows | 0 | 09-04-2012 20:29 | |
CMD/BAT - Архивирование | stolyar | Скриптовые языки администрирования Windows | 8 | 28-03-2010 13:33 | |
Архивирование | Maniacosaur | Программирование и базы данных | 6 | 27-08-2002 21:34 |
|