|
Компьютерный форум 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 |
Ветеран Сообщения: 2709
|
Профиль | Отправить PM | Цитировать если маска пустая, чтобы архивировались из каталога Src в каталог Dst не самый последний, а ВСЕ папки и ВСЕ файлы, архивов которых ещё нет в Dst
@Echo Off cls Set "Src=Z:\Box_In\Мой контент\Книги" rem Set "Mask=File_2018-10-??_Original." Set "Mask=" 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) If Not Exist "%Dst%" Md "%Dst%" || (Echo Folder not Created "%Dst%" &Pause &Exit /B 3) If Not "%Mask%"=="" GoTo :OneFile Set /A Err=1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO Set /A Err=0 &Call :OutArc "%%d" GoTo :End :OneFile 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) Call :OutArc "%Name%" Set /A Err=%ErrorLevel% :End Popd pause Exit /B %Err% :OutArc If Not Exist "%Dst%\%~1.*" (Echo "%Src%\%~1" &%Arc% "%Dst%\%~1.%Ext%" "%~1") Exit /B |
------- Отправлено: 10:52, 06-11-2018 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, Всё превосходно работает!
Но я, нагло используя плоды Вашего труда, немного переформулировал свою же задачу, дабы уже не было никаких ограничений по маске, и маска оставалась только маской без всяких посторонних смыслов. Для того, чтобы не грузить маску иным, нехарактерным для неё смыслом, я решил ввести в скрипт дополнительный параметр "Mode". Если установить Set "Mode=1", то получим однофайловый режим, а при любых других значениях Mode, например, если установить Set "Mode=0", получим режим архивации всех файлов из Src, архивов которых ещё нет в Dst. Ну, и ещё добавил режим сортировки, дабы в однофайловом режиме архивировался либо первый, либо последний файл или каталог в зависимости от заданного режима сортировки. Set "Ascending=" прямая сортировка - архивируется последний каталог или файл по маске. Set "Ascending=-" обратная сортировка - архивируется первый каталог или файл по маске. Естественно, ничего моего в полученном скрипте нет, всё полностью сделано из Вашего последнего скрипта. Просто он теперь полностью решает вместе и первую и вторую задачи по маске. Прошу Вас, как настоящего профессионала, на всякий случай, посмотреть и проверить - не напорол ли я каких-либо косяков при "модернизации" Вашего превосходного исходника. Ну, или, может можно сделать как-то изящнее, поскольку изначально задача мною озвучивалась совсем иначе. Модернизированный батник
@Echo Off cls ;Rem Mode must be set to 1 for OneFileMode or any value (0) for AllFilesMode Set "Mode=1" ;Rem Set "Mode=0" Set "Src=C:\111\Src" Set "Dst=C:\111\Dst" Set "Mask=??10??" ;Rem Маска всех октябрьских файлов и каталогов. ;Rem Mask - Mask for catalogs or files in Src. ;Rem Set "Ascending=" ;Rem "Ascending=" прямая сортировка - архивируется последний каталог или файл по маске Set "Ascending=-" ;Rem Set "Ascending=-" обратная сортировка - архивируется первый каталог или файл по маске Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -ma4 -m5 -rr5p -ts+ -y Set "Ext=rar" Pushd "%Src%" || (Echo Folder not Found "%Src%" &Pause &Exit /B 2) If Not Exist "%Dst%" Md "%Dst%" || (Echo Folder not Created "%Dst%" &Pause &Exit /B 3) If "%Mode%"=="1" GoTo :OneFile Set /A Err=1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:%Ascending%N`) DO Set /A Err=0 &Call :OutArc "%%d" GoTo :End :OneFile Set "Name=" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:%Ascending%N`) DO Set "Name=%%d" If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Pause &Exit /B 1) Call :OutArc "%Name%" Set /A Err=%ErrorLevel% :End Popd pause Exit /B %Err% :OutArc If Not Exist "%Dst%\%~1.*" (Echo "%Src%\%~1" &%Arc% "%Dst%\%~1.%Ext%" "%~1") Exit /B И ещё пара вопросов: 1) Команда "pause" в скрипте несёт какую-то иную цель, кроме сообщения о том, что батник выполнился и для продолжения нужно нажать любую клавишу? Имеется ввиду, удаление этой команды из скрипта не отразится на чём-либо ещё в его работе? Просто мой опыт говорит, что порой что-то, на первый взгляд, очевидное таковым не всегда является в реалии. Поэтому, лучше лишний раз уточнить. 2) Как правильнее подавить вывод сообщений о результатах работы этого батника, если использовать его в заданиях Шедулера Виндовс? Ставить после каждой команды "> Nul" ? Или это делается как-то однократно в самом начале батника? Вообще, что, на Ваш взгляд, имело бы смысл подправить в синтаксисе батника при его использовании в задании Шедулера? |
Последний раз редактировалось UserX, 06-11-2018 в 20:52. Отправлено: 18:03, 06-11-2018 | #22 |
Ветеран Сообщения: 2709
|
Профиль | Отправить PM | Цитировать Вот оптимизированный вариант ориентированный на планировщик
@Echo Off cls Set "Src=Z:\Box_In\Мой контент\Книги" Set "Mask=File_2018-10-??_Original." rem Set "Mask=" rem Set "DirKey=/O:-N /A:D" Set "DirKey=/O:-N" Set "Dst=Z:\Книги.arc" Set "Log=%Dst%\%~nx0.log" Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y Set "Ext=rar" 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 "%Mask%"=="" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d") If Not "%Mask%"=="" 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% 2. Если использовать батник в заданиях планировщика, то, наверное, надо иметь лог-файл. Если не надо, закомментируйте выделенные строки. 3. Для настройки работы команды Dir лучше использовать явным образом ключи. Делаем команду Dir /? и изучаем ключи и присваиваем нужный список переменной DirKey. В частности, Set "DirKey=/O:-N /A:D" даст алфавитную сортировку в обратном порядке и включит в рассмотрение только папки. 4. Маску оставил как есть. В принципе можно легко ввести специальную переменную. Но не увидел большого смысла. 5. Я использую Winrar.exe, подозреваю, он работает быстрее. Можно, конечно, использовать rar.exe, например: Set Arc="C:\Program Files\WinRar\Rar.exe" a -r -dh -m3 -s -rr5p -ts+ -y и подавить его вывод %Arc% "%Dst%\%~1.%Ext%" "%~1" >nul 6. Цитата UserX:
|
|
------- Последний раз редактировалось megaloman, 06-11-2018 в 21:52. Отправлено: 21:44, 06-11-2018 | #23 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Цитата megaloman:
Решил-таки оставить свою переменную Mode, поскольку без неё не будет работать произвольная маска выбора ВСЕХ файлов по заданной маске при их архивации, а будет иметься ввиду только маска *.* (сам ведь такую заказывал ) Собственно, только ради этого смысла и была введена переменная Mode Огромное Вам спасибо за проделанную работу, представленный мастер-класс, в результате которого мною была получена бесценная информация. Спасибо Вам ещё раз. |
||
Отправлено: 23:24, 06-11-2018 | #24 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, Предложенный Вами последний оптимизированный батник перестал работать так, как он работал ранее и так, как мне было нужно. Изменить его так, чтобы он остался оптимизмрованным и при этом работал так, как он работал до последней оптимизации мне не удалось.
Всё-таки, мне очень нужно ввести переменную Mode, поскольку она позволяет работать с заданной маской в любом из двух режимов: в режиме AllFilesMode (с заданной маской) и в режиме OneFileMode (тоже с заданной маской). То, что приведено ниже, сейчас работает так, как нужно, но оно не оптимизировано и нет вывода логов. Пожалуйста, помогите оптимизировать для планировщика приведённый батник, в котором указываются режимы Mode 0 и Mode 1. Заранее большое спасибо. Рабочий, но неоптимизированный батник
@Echo Off ;Rem Mode must be set to 1 for OneFileMode or any value (0) for AllFilesMode Set "Mode=0" ;Rem Set "Mode=1" Set "Src=C:\111\Src" Set "Dst=C:\111\Dst" Set "Mask=File_2018-10-??_Original." ;Rem Mask - Mask for catalogs or files in Src. Set "DirKey=/O:N" Rem Set "DirKey=/O:-N" Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -ma4 -m5 -rr5p -ts+ -y Set "Ext=rar" Pushd "%Src%" || (Echo Folder not Found "%Src%" &Exit /B 2) If Not Exist "%Dst%" Md "%Dst%" || (Echo Folder not Created "%Dst%" &Exit /B 3) If "%Mode%"=="1" GoTo :OneFileMode :AllFilesMode Set /A Err=1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO Set /A Err=0 &Call :OutArc "%%d" GoTo :End :OneFileMode Set "Name=" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO Set "Name=%%d" If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Exit /B 1) Call :OutArc "%Name%" Set /A Err=%ErrorLevel% :End Popd Exit /B %Err% :OutArc If Not Exist "%Dst%\%~1.*" (Echo "%Src%\%~1" &%Arc% "%Dst%\%~1.%Ext%" "%~1") Exit /B |
Последний раз редактировалось UserX, 07-11-2018 в 04:37. Отправлено: 03:46, 07-11-2018 | #25 |
Ветеран Сообщения: 2709
|
Профиль | Отправить PM | Цитировать Цитата UserX:
Здесь вариант с так любимой Вами переменной Mode
@Echo Off cls Set "Src=Z:\Box_In\Мой контент\Книги" Set "Mask=File_2018-10-??_Original." Set /A Mode=1 &Rem 1= 1 файл/папка, 0=все файлы/папки по маске Set "DirKey=/O:-N" &Rem если выбирается один файл/папка, то выберется самый последний по алфавиту 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" 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 If Not Exist "%Dst%\%~1.*" ( >>"%Log%" Echo %Date% %Time% "%Src%\%~1" %Arc% "%Dst%\%~1.%Ext%" "%~1" ) Exit /B |
|
------- Последний раз редактировалось megaloman, 07-11-2018 в 10:06. Отправлено: 10:01, 07-11-2018 | #26 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать megaloman, опробовал Ваш последний батник.
Что интересно - результат его работы в режиме Mode=0 (AllFilesMode) зависит от значения DirKey То есть, в указанном режиме Mode=0 (AllFilesMode) при DirKey=/O:-N и DirKey=/O:N результаты работы в каталоге Dst существенно между собой различаются, хотя, по логике дел, они должны бы быть одинаковы. Если, конечно, я ничего не упускаю из вида. Правильная, на мой взгляд, работа в режиме Mode=0 (AllFilesMode) достигается только в случае установки в команде Dir ключа прямой сортировки, т.е. при DirKey=/O:N. Это, видимо, значит, что в режиме Mode=0 (AllFilesMode) от DirKey нужно вообще оказаться и явно устанавливать ключ прямой сортировки для Dir, т.е. /O:N. С учётом изложенного, модифицированная версия полностью работающего батника, кажется наконец-то, обретает завершённый вид: Незначительная модификация
@Echo Off cls Set "Mask=File_2018-10-??_Original." Set "Src=Z:\Box_In\Мой контент\Книги" Set "Dst=Z:\Книги.arc" Set "Log=%Dst%\%~nx0.log" &Rem Путь к лог-файлу. Можно указать в любом доступном месте с любым именем. Set /A Mode=1 &Rem Mode=1 - один файл/папка по маске; Mode=0 - все файлы/папки по маске Set "DirKey=/O:-N" &Rem если выбран режим один файл/папка (Mode=1), то выберется самый последний по алфавиту Rem Set "DirKey=/O:N" &Rem если выбран режим один файл/папка (Mode=1), то выберется самый первый по алфавиту Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y Set "Ext=rar" 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 /O:N`) 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% rem pause Exit /B %Err% :OutArc If Not Exist "%Dst%\%~1.*" ( >>"%Log%" Echo %Date% %Time% "%Src%\%~1" %Arc% "%Dst%\%~1.%Ext%" "%~1" ) Exit /B Посмотрите, пожалуйста. |
Последний раз редактировалось UserX, 07-11-2018 в 18:48. Отправлено: 18:23, 07-11-2018 | #27 |
Ветеран Сообщения: 2709
|
Профиль | Отправить PM | Цитировать Цитата UserX:
Дело Ваше. (1.)Клиент всегда прав. (2.)Если клиент не прав, смотри (1.) Успехов! PS. Обратите внимание, что в посте #18 для одного файла выбирается последний в списке Dir файл, а в постах #23, #26 выбирается первый. Вот тут и имеет значение /O:N в старых вариантах и /O:-N в последних вариантах. |
|
------- Последний раз редактировалось megaloman, 07-11-2018 в 19:23. Отправлено: 18:58, 07-11-2018 | #28 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
В этом одном режиме результаты работы батника в папке Dst при "SetKey=/O:N" и "SetKey=/O:-N" могут получиться совершенно разные. Но я вполне допускаю, что при некоторых вариантах маски эти результаты могут быть и совершенно идентичными. Но разве результаты работы сами по себе не является реальностью? Я ведь эти резульаты работы никак не подтасовывал и не пытался ввести Вас в заблуждение. С чем тут можно соглашаться или не соглашаться? Меня и самого это удивило. Но факт есть факт, вне зависимости от того, согласен ли кто угодно с ним или нет. Цитата megaloman:
Цитата megaloman:
Да и как такое возможно - "сделать некорректное тестирование"? По-моему, тестирование не может быть корректным или некорректным. Оно может быть просто тестированием. Готов выложить Вам примерное содержимое папки Src, которое в режиме с установленным режимом Set /A Mode=0 (то есть, если установлен режим всех файлов по заданной маске), даёт разные результаты в папке Dst по количеству и видам созданных архивов при изменении ключа сортировки в Dir c прямого на обратный, чтобы вы смогли лично в этом убедиться. Выложить свой тест? |
|||
Последний раз редактировалось UserX, 07-11-2018 в 20:40. Отправлено: 20:13, 07-11-2018 | #29 |
Пользователь Сообщения: 61
|
Профиль | Отправить PM | Цитировать Ключи:
Set /A Mode=0 Set "Mask=??10??.*" Dir исходной папки Src
Содержимое папки C:\111\Src 07.11.2018 20:41 <DIR> . 07.11.2018 20:41 <DIR> .. 05.11.2018 19:03 <DIR> 181027 05.11.2018 02:39 <DIR> 181028 01.10.2018 10:07 474 940 181028.jpg 05.11.2018 18:52 <DIR> 181029 01.10.2018 10:07 474 940 181029.jpg 05.11.2018 19:21 <DIR> 181030 01.10.2018 10:07 474 940 181030.jpg 05.11.2018 19:04 <DIR> 181103 01.10.2018 10:07 474 940 181103.jpg 4 файлов 1 899 760 байт 7 папок 4 155 273 216 байт свободно Dir результата в Dst при /N:O
Содержимое папки C:\111\Dst 07.11.2018 20:54 <DIR> . 07.11.2018 20:54 <DIR> .. 07.11.2018 20:53 11 316 072 181027.rar 07.11.2018 20:53 486 766 181028.jpg.rar 07.11.2018 20:53 1 270 083 181028.rar 07.11.2018 20:53 486 766 181029.jpg.rar 07.11.2018 20:53 11 316 072 181029.rar 07.11.2018 20:53 486 766 181030.jpg.rar 07.11.2018 20:53 11 316 072 181030.rar 7 файлов 36 678 597 байт 2 папок 4 165 160 960 байт свободно Dir результата в Dst при /N:-O
Содержимое папки C:\111\Dst 07.11.2018 20:49 <DIR> . 07.11.2018 20:49 <DIR> .. 07.11.2018 20:46 11 316 072 181027.rar 07.11.2018 20:46 486 766 181028.jpg.rar 07.11.2018 20:46 486 766 181029.jpg.rar 07.11.2018 20:46 486 766 181030.jpg.rar 4 файлов 12 776 370 байт 2 папок 4 189 036 544 байт свободно |
Последний раз редактировалось UserX, 07-11-2018 в 21:00. Отправлено: 20:47, 07-11-2018 | #30 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|