Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Архивирование каталога

Ответить
Настройки темы
CMD/BAT - Архивирование каталога

Пользователь


Сообщения: 58
Благодарности: 11

Профиль | Отправить PM | Цитировать


Изменения
Автор: UserX
Дата: 01-11-2018
Здравствуйте!

Помогите, пожалуйста, со следующими вопросами.

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

 

Пользователь


Сообщения: 58
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата:
Это сообщение посчитали полезным следующие участники:
megaloman
Ну, слава Богу! Мне удалось не обмануть Ваших ожиданий.

Спасибо Вам за всю проделанную Вами работу и за Ваше долготерпение, которое Вы проявили к оппоненту, несмотря ни на что.
Удачи Вам!

Последний раз редактировалось UserX, 07-11-2018 в 22:11.


Отправлено: 21:14, 07-11-2018 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 1430
Благодарности: 831

Профиль | Отправить PM | Цитировать


UserX,
Цитата UserX:
чтобы при наличии в каталоге Dst архивов (*.rar, *.zip, *.7z и пр.) »
Хаос в данных == непредсказуемому результату.
При анализе наличия архива по маске Файл.* получим соответствие с Файл.jpg.*=Файл.* с ключом /O:-N
Гарантировать, что при ключе /O:N не получится еще какой-нибудь непредсказуемый пропуск, не берусь.
Чтобы результат был предсказуем (работа батника надежнее),то:

Либо считаем, что все архивы имеют расширение %Ext% (в нашем случае Rar), тогда исправление:
Код: Выделить весь код
:OutArc
	If Not Exist "%Dst%\%~1.%Ext%" (
Либо надо перечислить все возможные расширения архивов
Код: Выделить весь код
@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


Пользователь


Сообщения: 58
Благодарности: 11

Профиль | Отправить 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


Ветеран


Contributor


Сообщения: 1430
Благодарности: 831

Профиль | Отправить PM | Цитировать


UserX, Лог-файл создаётся? Путь к нему указан правильно? Я получил аналогичный результат, когда указал кривой путь к лог-файлу

Цитата UserX:
правильно написааня программка справляется со всеми вариантами »
Один из столпов программирования утверждал: всегда можно подобрать данные, способные одурачить программу

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 08-11-2018 в 00:25.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:10, 08-11-2018 | #34


Пользователь


Сообщения: 58
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Лог-файл создаётся? »
Чёрт подери, я же у себя поменял Ваш параметр Log на LogFile, да во втором варианте позабыл его везде поправить.
Сейчас поправил, и всё прекрасно заработало.
Извините меня, пожалуйста, за невнимательность и ложную тревогу.

Собственно, почему я переименовал Log в LogFile. Хотел ещё ввести у себя параметр Log, типа:
Set "Log=Yes"
для того, чтобы вставить проверку - создавать или нет log-файл. Да что-то в моих неумелых руках не задалось...

Отправлено: 01:00, 08-11-2018 | #35


Ветеран


Contributor


Сообщения: 23265
Благодарности: 6775

Профиль | Отправить PM | Цитировать


Цитата megaloman:
по умолчанию Dir выдаёт прямую алфавитную сортировку »
Неа. Что возвращает функция WinAPI FindFirstFile/FindNextFile, то и выдаёт. Просто на NTFS записи каталога уже упорядочены по именам-расширениям. А для FATx это не так:
Скрытый текст

— там имена возвращаются в порядке создания записей каталога.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:32, 08-11-2018 | #36


Пользователь


Сообщения: 58
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата Iska:
— там имена возвращаются в порядке создания записей каталога. »
Ёпрст! Получается, что ключ сортировки по имени (/o:n) у команды Dir просто не работает?
Как же так? Ведь это же хаос какой-то! Ну, по умолчанию - ладно. Что там Dir выдаёт по умолчанию известно только ей, хотя, да, я ещё помню, что в fat32 командой Dir по умолчанию выдаются имена в порядке их создания.
Но ведь если явно указан ключ сортировки, то почему он не работает??
Я не понимаю...

Отправлено: 02:59, 08-11-2018 | #37


Ветеран


Contributor


Сообщения: 23265
Благодарности: 6775

Профиль | Отправить PM | Цитировать


Цитата UserX:
Ёпрст! Получается, что ключ сортировки по имени (/o:n) у команды Dir просто не работает? »
Работает.

Цитата UserX:
хотя, да, я помню,ещё что в fat32 командой Dir по умолчанию выдаются имена в порядке их создания. »
Именно так. Об этом я и написал.

Цитата UserX:
Но ведь если явно указан ключ сортировки, то почему он не работает?? »
Работает.

Неверным является только одно предположение — что по умолчанию (в случае отсутствия параметра /o, отсутствия переменной окружения DIRCMD, отсутствия в содержимом переменной окружения DIRCMD параметра /o) команда dir возвращает имена-расширения файлов и каталогов из оглавления каталога в лексикографическом порядке. Это не так.

Отправлено: 03:06, 08-11-2018 | #38


Пользователь


Сообщения: 58
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата Iska:
Работает. »
Действительно работает. Я просто был невнимателен. Извините, пожалуйста.

Отправлено: 17:38, 08-11-2018 | #39



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Архивирование каталога

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход