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

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

Ответить
Настройки темы
CMD/BAT - [решено] чистка папки по заданной маске

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


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

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


Изменения
Автор: blacks2
Дата: 29-10-2020
Описание: вынесено из http://forum.oszone.net/thread-346854.html
Здравствуйте.
Прошу помощи.


Скрипт бекапера
В папке e:\backup_dir создаются папки
\20170101_11_53_name_year\ - беки создаются раз в 1-12 месяцев
\20201205_10_23_name_small\ - беки создаются каждый день
...
внутри файлы, с одинаковыми названиями



После создания, проводится чистка старых файлов и папок.
Соответственно, чистка "forfiles за Х дней" - чистится всё:
И годовой бекап теряется при создании каждодневного...



ВЫВОД:
Нужна чистка папки по заданной маске (например *_year )




Вариант А.
- плох: полюбому чистятся все каждодневные и годовые файлы...
- а сделать: работа по маскам директорий, из которых будут удаляться старые файлы, а после и сами папки...
- не имею представления как!
Скрытый текст
Код: Выделить весь код
@ECHO OFF
chcp 866

SET BKUP_DelPath=е:\backup_dir
SET BKUP_DelLogs=е:\backup_dir\Deleted.log
SET BKUP_Max_Days=7

forfiles /p "%BKUP_DelPath%" /s /m * /D -%BKUP_Max_Days% /C "cmd /c del /q /s @path" >> %BKUP_DelLogs%
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%BKUP_DelPath%" /S /B /A:D ^|Sort /R`) DO 2>nul Rd "%%d"&&>>"%BKUP_DelLogs%" Echo "%%d"

echo pause and end
PAUSE >nul




Вариант B.
Решение находит папки по маске и чистить в них файлы +сами папки по маске
(рабочее: хоть и пишет "ОШИБКА: не удается найти указанный файл")

Код: Выделить весь код
@ECHO OFF
chcp 866

SET BKUP_DelPath=е:\backup_dir
SET BKUP_DelLogs=е:\backup_dir\Deleted.log
SET BKUP_Max_Days=7

forfiles /S /P "%BKUP_DelPath%" /M *_base /D -%BKUP_Max_Days% /C "cmd /C if @isdir == TRUE (rd /S /Q @path) else (del /F /A @path)" >> "%BKUP_DelLogs%" 

echo pause and end
PAUSE >nul

Однако,
Сколько методом тыка(знаний не хватает) не пытался сделать вывод в лог - не получалось
Хотя пример и найден на просторах буржунета, и вроде у них работает... - но у меня нет.



Очень прошу помощи:
а. с правкой варианта #А. - под задачу работы с масками
или
б. с вариантом #В. - настроить вывод в лог (если такое возможно)


ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО!



PS
простым решением было бы создание субпапок
e:\backup_dir\_year\
e:\backup_dir\_smal\

но вроде как моё ядро бекапера порушится/переписывать
а главное, когда все папки с датами в одной месте - то наглядно, всё видно, оценка, анализ...

Отправлено: 09:17, 29-10-2020

 

Ветеран


Contributor


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

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


blacks2, Давайте не будем мыслить линейно и привязываться к датам. Допустим, надо хранить 3 последних годовых бэкапа и 7 ежедневных. Зачем возиться с файлами, когда у Вас порядок с именованием папок, будем выводить имена папок по имени в соответствии с маской в обратном порядке и удалим все папки, кроме указанного количества последних.
Код: Выделить весь код
@Echo Off
	Call :DelOld "Z:\Box_Arc" "*_11_53_тра ля ля_ку_ку_year" 3 "e:\Deleted.log"
	Call :DelOld "Z:\Box_Arc" "*_11_53_тра ля ля_ку_ку_small" 7 "e:\Deleted.log"
Exit /B

:DelOld
	FOR /F "usebackq skip=%3 delims=" %%d IN (`2^>nul Dir "%~1\%~2" /B /A:D /O:-N`) DO 2>nul Rd /S /Q "%~1\%%d" &&>>%4 Echo "%~1\%%d"
Exit /B
В аргументах:
"Имя папки с подпапками бэкапов" "маска подпапок с файлами бэкапов" "количество хранимых подпапок по маске" "путь к файлу лога"

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


Последний раз редактировалось megaloman, 29-10-2020 в 16:30.

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

Отправлено: 16:14, 29-10-2020 | #2



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

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


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


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

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


Цитата megaloman:
Давайте не будем мыслить линейно и привязываться к датам. Допустим, надо хранить 3 последних годовых бэкапа и 7 ежедневных. Зачем возиться с файлами, когда у Вас порядок с именованием папок, будем выводить имена папок по имени в соответствии с маской в обратном порядке и удалим все папки, кроме указанного количества последних. »

"А что, так можно было!?" v.2.0



Работает!!
Благадарю!




Вопрос:
можно ли чем-то заменить строки с Exit /B ?

Поясню:
После приведенного Вами (еще раз спасибо!) скрипта
следом должен запускаться скрипт конвертации кодировки (#A)
и 2 комманды по запуску exeшника (#B)
но они не срабатывают именно из-за Exit /B

Пробовал удалять, заменять на Goto, убирать /b, удалять то одну строку то другую с Exit /B
- не помогло.

Спасибо!


#A
for %%? in ("") do chcp 1251 & cmd /d /a /c set /p=яю<NUL > .tmp
chcp 866
cmd /d /u /c type "%BKUP_11_logX%" >> .tmp
chcp 1251
cmd /d /a /c type .tmp > "%BKUP_11_logX%"
del .tmp

#B
MSG.EXE "COMPLETED\n\nStart %run%\nFinsh %time%"
start notepad "%logX%"

Отправлено: 16:12, 30-10-2020 | #3


Ветеран


Contributor


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

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


blacks2, дописывайте код не после exit, а перед ним в верхней части скрипта.
А в вверхней части скрипта можете eще добавлять call для других путей, масок, лог-файлов

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

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

Отправлено: 16:18, 30-10-2020 | #4


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


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

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


Цитата megaloman:
дописывайте код не после exit, а перед ним в верхней части скрипта.
А в вверхней части скрипта можете eще добавлять call для других путей, масок, лог-файлов »
Благодарствую!
Работает!

Отправлено: 20:47, 05-11-2020 | #5



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Перемещение файлов по маске с созданием папки по дате в названии файла AndreH Скриптовые языки администрирования Windows 5 08-08-2018 09:14
CMD/BAT - [решено] Удалить папки по маске run0ut Скриптовые языки администрирования Windows 9 21-03-2017 01:27
CMD/BAT - Копирование файлов в папки по маске файла и маске папки (BAT) skyskiff Скриптовые языки администрирования Windows 7 20-09-2015 22:41
CMD/BAT - [решено] Переименование по заданной маске bat Boiston Скриптовые языки администрирования Windows 3 18-03-2015 01:15
CMD/BAT - [решено] Удаление по маске, кроме папки исключения. serjei Скриптовые языки администрирования Windows 27 18-02-2012 03:42




 
Переход