|
Компьютерный форум 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 | Цитировать Цитата:
Спасибо Вам за всю проделанную Вами работу и за Ваше долготерпение, которое Вы проявили к оппоненту, несмотря ни на что. Удачи Вам! |
|
Последний раз редактировалось UserX, 07-11-2018 в 22:11. Отправлено: 21:14, 07-11-2018 | #31 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать UserX,
Цитата UserX:
При анализе наличия архива по маске Файл.* получим соответствие с Файл.jpg.*=Файл.* с ключом /O:-N Гарантировать, что при ключе /O:N не получится еще какой-нибудь непредсказуемый пропуск, не берусь. Чтобы результат был предсказуем (работа батника надежнее),то: Либо считаем, что все архивы имеют расширение %Ext% (в нашем случае Rar), тогда исправление: Либо надо перечислить все возможные расширения архивов
@Echo Off cls Set "Src=Z:\Box_In" Set "Mask=??10??.*" Set /A Mode=0 &Rem 1= 1 файл/папка, 0=все файлы/папки по маске Set "DirKey=/O:-N" &Rem /O:-N если выбирается один файл/папка, то выберется самый последний по алфавиту Set "Dst=Z:\Книги.arc" Set "Log=%Dst%\%~nx0.log" &Rem Путь к лог-файлу. Можно указать в любом доступном месте с любым именем. Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y Set "Ext=rar" Set "AllExt=rar zip 7z arc" Pushd "%Src%" || (Set MSG=Folder not Found "%Src%" &Set /A Err=2 &GoTo :End) If Not Exist "%Dst%" Md "%Dst%" || (Set MSG=Folder not Created "%Dst%" &Set /A Err=3 &GoTo :End) Set /A Err=1 If %Mode%==0 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d") If %Mode%==1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d" &GoTo :End) :End Popd If "%Err%"=="1" (Set MSG=File or Folder not Found "%Src%\%Mask%" %DirKey%) If Not "%Err%"=="0" >>"%Log%" Echo %Date% %Time% %Msg% pause Exit /B %Err% :OutArc FOR %%e IN (%AllExt%) DO If Exist "%Dst%\%~1.%%~e" Exit /B 0 >>"%Log%" Echo %Date% %Time% "%Src%\%~1" %Arc% "%Dst%\%~1.%Ext%" "%~1" Exit /B 0 И вааще, смесь файлов/папок с одинаковыми именами и разными расширениями может дать неожиданный результат при любых алфавитных сортировках даже при отборе 1 файла с маской с расширением .* Удалите в Вашем наборе папку 181027 и, в зависимости от ключа сортировки, будете иметь или 181028.rar или 181030.jpg.rar Так что при смеси кони/люди (файлы/папки c одинаковыми именами, но разными расширениями) откажитесь от маски с расширением .* и используйте только жестко определённое расширение. |
|
------- Последний раз редактировалось megaloman, 07-11-2018 в 23:19. Отправлено: 22:35, 07-11-2018 | #32 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
То есть, Ваш батник с честью выдержал все мои корявые тесты и ни разу не подвёл и не обманул моих ожиданий. Единственное, я ещё раз хочу настоятельно уточнить, что в строке, касающейся прохождения проверки, что установлен режим Mode==0, я явно задаю прямое направление сортировки команды Dir ключом /O:N, т.е. я изменил одну Вашу строку в исходнике так (выделено жирным): If %Mode%==0 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO (Set /A Err=0 &Call :OutArc И это принципиально для получения правильного результата работы батника при хаосе в каталоге Src. Что же касается мешанины в каталоге Src, так она специально и создавалась таковой для тестирования. В реалии у меня такого бардака в Src, конечно же, нет. Но ведь проверить-то было нужно! Считаю, что правильно написанная програма справляется со всеми вариантами, что, собственно, и продемонстрировал написанный Вами батник. |
|
Последний раз редактировалось UserX, 08-11-2018 в 00:48. Отправлено: 23:59, 07-11-2018 | #33 |
Ветеран Сообщения: 2710
|
Профиль | Отправить PM | Цитировать UserX, Лог-файл создаётся? Путь к нему указан правильно? Я получил аналогичный результат, когда указал кривой путь к лог-файлу
Цитата UserX:
|
|
------- Последний раз редактировалось megaloman, 08-11-2018 в 00:25. Отправлено: 00:10, 08-11-2018 | #34 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Сейчас поправил, и всё прекрасно заработало. Извините меня, пожалуйста, за невнимательность и ложную тревогу. Собственно, почему я переименовал Log в LogFile. Хотел ещё ввести у себя параметр Log, типа: Set "Log=Yes" для того, чтобы вставить проверку - создавать или нет log-файл. Да что-то в моих неумелых руках не задалось... |
|
Отправлено: 01:00, 08-11-2018 | #35 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Скрытый текст
— там имена возвращаются в порядке создания записей каталога. |
|
Отправлено: 02:32, 08-11-2018 | #36 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Как же так? Ведь это же хаос какой-то! Ну, по умолчанию - ладно. Что там Dir выдаёт по умолчанию известно только ей, хотя, да, я ещё помню, что в fat32 командой Dir по умолчанию выдаются имена в порядке их создания. Но ведь если явно указан ключ сортировки, то почему он не работает?? Я не понимаю... |
|
Отправлено: 02:59, 08-11-2018 | #37 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата UserX:
Цитата UserX:
Цитата UserX:
Неверным является только одно предположение — что по умолчанию (в случае отсутствия параметра /o, отсутствия переменной окружения DIRCMD, отсутствия в содержимом переменной окружения DIRCMD параметра /o) команда dir возвращает имена-расширения файлов и каталогов из оглавления каталога в лексикографическом порядке. Это не так. |
|||
Отправлено: 03:06, 08-11-2018 | #38 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 17:38, 08-11-2018 | #39 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|