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

Ответить
Аватара пользователя
blacks2

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

Сообщение blacks2 »

Здравствуйте.

Прошу помощи.





Скрипт бекапера

В папке e:\backup_dir создаются папки

\20170101_11_53_name_year\ - беки создаются раз в 1-12 месяцев

\20201205_10_23_name_small\ - беки создаются каждый день

...

внутри файлы, с одинаковыми названиями






После создания, проводится чистка старых файлов и папок.

Соответственно, чистка "forfiles за Х дней" - чистится всё:

И годовой бекап теряется при создании каждодневного...







ВЫВОД:

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









Вариант А.

- плох: полюбому чистятся все каждодневные и годовые файлы...

- а сделать: работа по маскам директорий, из которых будут удаляться старые файлы, а после и сами папки...

- не имею представления как!



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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.

Решение находит папки по маске и чистить в них файлы +сами папки по маске

(рабочее: хоть и пишет "ОШИБКА: не удается найти указанный файл")[/i]





Код:

Код: Выделить всё

@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\



но вроде как моё ядро бекапера порушится/переписывать

а главное, когда все папки с датами в одной месте - то наглядно, всё видно, оценка, анализ...[/i]
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] чистка папки по заданной маске

Сообщение megaloman »

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

В аргументах:

"Имя папки с подпапками бэкапов" "маска подпапок с файлами бэкапов" "количество хранимых подпапок по маске" "путь к файлу лога"
Аватара пользователя
blacks2

Re: CMD/BAT - [решено] чистка папки по заданной маске

Сообщение blacks2 »

Цитата megaloman:



Давайте не будем мыслить линейно и привязываться к датам. Допустим, надо хранить 3 последних годовых бэкапа и 7 ежедневных. Зачем возиться с файлами, когда у Вас порядок с именованием папок, будем выводить имена папок по имени в соответствии с маской в обратном порядке и удалим все папки, кроме указанного количества последних.
CMD/BAT - [решено] чистка папки по заданной маске






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

Изображение





Работает!!

Благадарю!








Вопрос:

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



Поясню:

После приведенного Вами (еще раз спасибо!) скрипта

следом должен запускаться скрипт конвертации кодировки (#A)

и 2 комманды по запуску exeшника (#B)

но они не срабатывают именно из-за Exit /B



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

- не помогло.



Спасибо!







#A

[spoiler]for %%? in ("") do chcp 1251 & cmd /d /a /c set /p=яю .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[/spoiler]






#B

[spoiler]MSG.EXE "COMPLETED\n\nStart %run%\nFinsh %time%"

start notepad "%logX%"[/spoiler]
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] чистка папки по заданной маске

Сообщение megaloman »

blacks2, дописывайте код не после exit, а перед ним в верхней части скрипта.

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

Re: CMD/BAT - [решено] чистка папки по заданной маске

Сообщение blacks2 »

Цитата megaloman:



дописывайте код не после exit, а перед ним в верхней части скрипта.

А в вверхней части скрипта можете eще добавлять call для других путей, масок, лог-файлов
CMD/BAT - [решено] чистка папки по заданной маске




Благодарствую!

Работает!
Ответить

Вернуться в «Скриптовые языки администрирования Windows»