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

Показать сообщение отдельно

Googler


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

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


Цитата zavoruev:
чтобы после отрабатывания вот этого скрипта удалялись папки недельной давности отсчетом от вновь созданного »
в такой формулировке батник будет слишком громоздким:
Код: Выделить весь код
@Echo Off
:: Параметры скрипта, 0 < $OLD < 29!
:: $OLD - столько ДНЕЙ храним архивы
Set $SRC=D:\Mazda
Set $DST=D:\Backup
Set $OLD=6
:: Находим текущие день/месяц/год
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set $Time=%%i
Set $Y=%$Time:~0,4%&Set $M=0%$Time:~4,2%&Set $D=0%$Time:~6,2%
Set $M=%$M:~-2%&Set $D=%$D:~-2%
:: Создаем каталог/делаем архив
XCopy /S/E/D/C/Q %$SRC%\* %$DST%\%$D%.%$M%.%$Y:~-2%\
:: Удаляем старые архивные каталоги
Call :GetOldDate %$OLD%
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$DST%\??.??.??') Do If %%k%%j%%i LEQ %$Y:~-2%%$M%%$D% RD /S/Q "%$DST%\%%i.%%j.%%k"
:: Выход
EXIT

:GetOldDate
:: -----------------------------------
:: Расчет даты, предшествующей текущей
:: заданное количество дней (< 29)
:: -----------------------------------
 Set /A $D -= %1
 If %$D% GTR 0 GoTo GetOldDate_2
:: Месяц, год, дней в месяце
 Set /A $M=%$M%+11-((%$M%+10)/12)*12
 If %$M% EQU 12 Set /A $Y-=1
 For /F "Tokens=%$M%" %%i In ("31 28 31 30 31 30 31 31 30 31 30 31") Do Set $X=%%i
 If %$M% NEQ 2 GoTo GetOldDate_1
:: Февраль високосного года
 Set /A $B1=%$Y%-(%$Y%/4)*4
 Set /A $B2=%$Y%-(%$Y%/100)*100
 Set /A $B3=%$Y%-(%$Y%/400)*400
 If 0 EQU %$B1% If 0 NEQ %$B2% Set /A $X+=1
 If 0 EQU %$B3% Set /A $X+=1
:: День месяца
:GetOldDate_1
 Set /A $D=%$D%+%$X%-((%$D%+%$X%-1)/%$X%)*%$X%
:: Форматирование даты
:GetOldDate_2
 Set $M=0%$M%&Set $D=0%$D%
 Set $M=%$M:~-2%&Set $D=%$D:~-2%
GoTo :EOF
Практичней опираться не на "давность" архивов, а на их количество. Предположим, вам пришлось отключить технику на новогодние праздники (~10 дней), после выходных, при первом запуске будут удалены ВСЕ каталоги кроме текущего. Удобней ограничить количество хранимых каталогов (в зависимости от выделенного дискового пространства). Один из таких вариантов:
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion
:: ЧТО и КУДА копируем, сколько храним
:: $OLD - КОЛИЧЕСТВО хранимых архивов
Set $SRC=D:\Mazda
Set $DST=D:\Backup
Set $OLD=6
:: Находим текущие день/месяц/год
For /F "Tokens=1 Delims=." %%i In ('WMIC OS Get LocalDateTime^|Find "."') Do Set $Time=%%i
Set $Y=%$Time:~0,4%&Set $M=0%$Time:~4,2%&Set $D=0%$Time:~6,2%
Set $M=%$M:~-2%&Set $D=%$D:~-2%
:: Создаем каталог/делаем архив
XCopy /S/E/D/C/Q %$SRC%\* %$DST%\%$D%.%$M%.%$Y:~-2%\
:: Ограничиваем количество архивов
For /F "Delims=" %%i In ('DIR /B/O:-D/A:D %$DST%\??.??.??') Do (
   Set /A $OLD-=1
   If !$OLD! LSS 0 RD /S/Q "%$DST%\%%i"
)
P.S. при использовании последнего скрипта нельзя вручную добавлять/изменять содержимое архивных каталогов, иначе их дата будет заменена на текущую и работа скрипта нарушится
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:09, 04-07-2009 | #2