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

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

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

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


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

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

 

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


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

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


Цитата megaloman:
А так, Если не использовать ключ -ep1? »
Всё чётко сработало как мне было и нужно! Теперь в имени архива находится и имя папки, совпадающее с именем архива, но это я вижу дополнительным преимуществом, поскольку в случае переименования архива, внутри него останется правильное исходное имя папки.

Огромное Вам спасибо! В батниках Вы не просто мегаломэн, а настоящий мегалодон!

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



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

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


Ветеран


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

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


Цитата UserX:
а настоящий мегалодон! »
Ещё никогда Штирлиц не был так близок к провалу :).

Отправлено: 22:06, 02-11-2018 | #12


Ветеран


Contributor


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

Профиль | Отправить 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
Благодарности: 19

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


megaloman, это работает!! Вы - просто супер.

Отправлено: 01:36, 03-11-2018 | #14


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


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

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


Ветеран


Contributor


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

Профиль | Отправить 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
Благодарности: 19

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


megaloman, да, с каталогами в папке Src это теперь прекрасно работает!

А можно ли сделать так, чтобы в каталоге Src могли быть не только вложенные папки, к которым будет применима такая маска, но и просто файлы, к которым будет применяться та же самая маска?
То есть, различия между папкой или файлом в каталоге Src для архивирования быть не должно, а маска должна одинаково относиться и к файлам, и к папкам.
Таким образом архивироваться в каталог Dst будут или файл, или папка из Src, в зависимости от того, чьё имя старше с точки зрения даты, являющейся частью имени.

Или такое возможно только либо-либо, то есть, либо в каталоге Src будут папки и тогда файлы будут игнорироваться, либо файлы, но тогда будут игнорироваться каталоги?

Я ещё раз извиняюсь за наглость.

Отправлено: 03:00, 05-11-2018 | #17


Ветеран


Contributor


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

Профиль | Отправить 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
Благодарности: 19

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


megaloman, Вы это сделали, и это работает!!
Огромное Вам спасибо! Вы - лучший.

Поделюсь с Вами мыслями.
Конечно, делать мешанину из файлов и папок в каталоге не совсем здОрово, но раз даже это проходит, значит, для Src, состоящего только из каталогов или только из файлов это будет работать точно, поскольку задача решена Вами в самом общем виде.
Потому просторы для этого решения открываются просто безграничные. Я пока не могу их даже полностью осмыслить до самого конца.
Практически, Вы сделали гипотезу батеньки Пуанкаре реальностью!

PS
Вот осмыслю до конца и поглядим, какие новые проблемы создаст это решение.

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


Отправлено: 19:15, 05-11-2018 | #19


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


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

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


megaloman, произошло некоторое осмысление.

Проверил работу скрипта при очень разной маске и с весьма разнообразным содержимым каталога Src.
Даже при пустой маске, т.е.:
Set "Mask="

на мой взгляд работает правильно. Пустая маска полностью соответствсует маске *.*
Т.е.
Set "Mask=" полностью эквивалентна Set "Mask=*.*"
И это, на мой взгляд, вполне логично.

Однако, коль скоро эти два варианта работают идентично, можно ли попросить Вас о модификации Вашего последнего скрипта таким образом, чтобы при задании пустой маски, т.е. при указании:
Set "Mask=", как исключение, скрипт работал несколько иначе.
А именно, если маска пустая, чтобы архивировались из каталога Src в каталог Dst не самый последний, а ВСЕ папки и ВСЕ файлы, архивов которых ещё нет в Dst.

Тогда этот один скрипт станет универсальным и заменит собой (и даже расширит) скрипт из первой задачи.
Спасибо!

Отправлено: 22:31, 05-11-2018 | #20



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




 
Переход