Показать полную графическую версию : [решено] Удаление созданных папок и файлов по времени
zavoruev
03-07-2009, 14:32
Всем добрый день!!!!
есть необходимость дописать скрипт, я в этом деле не мастер, но вот сейчас понадобилось.
Вот существующий
for /f "tokens=5,7,6 delims=_ " %%i in ('date /t') do (set date = %%i-%%j-%%k)
echo %date%
set new_name=%date%
echo %new_name%
Mkdir d:\Backup\%new_name%
CD /D d:\Backup\%new_name%
Xcopy d:\mazda /S /E
Суть такова, делается папка с названием даты (число, месяц, год), необходимо чтобы после отрабатывания вот этого скрипта удалялись папки недельной давности отсчетом от вновь созданного. Например:
Сегодня создалась утром папка 03.07.09, а уавтоматом удалилась 27.06.09.
Заранее всем благодарен!!!!
чтобы после отрабатывания вот этого скрипта удалялись папки недельной давности отсчетом от вновь созданного »в такой формулировке батник будет слишком громоздким:@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. при использовании последнего скрипта нельзя вручную добавлять/изменять содержимое архивных каталогов, иначе их дата будет заменена на текущую и работа скрипта нарушится
zavoruev
06-07-2009, 09:21
amel27,
спасибо тебе огромное! Есть пару вопросов:
1. P.S. при использовании последнего скрипта нельзя вручную добавлять/изменять содержимое архивных каталогов, иначе их дата будет заменена на текущую и работа скрипта нарушится »
Это наверно относится не к последнему скрипту, а к первому, т.к в последем удаление не завязано на дату, а на количество папок. Мне это важно, так как программист 1С работает с базами за прошлые числа.
2. :: Ограничиваем количество архивов » --- Set $OLD=6- это означает что должно быть не больше 6-го архива (каталога)? Но при использовании скрипта папка создается, но архивы (каталоги) не удаляются, хотя их больше 6!!!!! И вообще поясните процесс, т.е создается 7-ой архив, и первый удаляется (критерий удаления), или создается 7-ой архив и первые 6 удаляются!!!! Как это работает??????????
3. Если у меня в папке D:\Backup\ есть не только папки созданные этим скриптом, но и архивы, которые делаются по другому шедулеру (с помощью winrar делается бэкап только нужных папок). Как будет работать последняя часть скрипта на удалении? Будет удалять тока создаваемы архивы, или ограничение идет для все папки.
P.S. Или все таки лучше папки и архивы разнести ао разным папкам в корне диска D:\
zavoruev
06-07-2009, 09:36
И еще одно, формат создаваемого каталога должен выглядеть так 06.07.2009, а при использовании данных скриптов 06.07.09. Как это поправить?
1. к последнему, в нем дата - из атрибутов каталога, в первом - восстановлена из его имени
2. 1) "@Echo Off" --> "@Echo On"; 2) "Script.CMD >Script.Log 2>&1"; 3) Script.Log - в студию!
3. батник обрабатывает только каталоги по маске "??.??.??" (с изменениями - "??.??.????")
формат создаваемого каталога должен выглядеть так 06.07.2009, а при использовании данных скриптов 06.07.09 »как указано в первом посте, так и реализовано в скрипте
программист 1С работает с базами за прошлые числа »значит, второй батник требует модификации, с учетом полного года:@Echo Off
SetLocal EnableDelayedExpansion
:: ЧТО и КУДА копируем, сколько храним
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%\
:: Ограничиваем количество архивов
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$DST%\??.??.????') Do Set $_%%k%%j%%i=%%i.%%j.%%k
For /F "Tokens=2 Delims==" %%i In ('Set $_^|Sort /R') Do (
Set /A $OLD-=1
If !$OLD! LSS 0 RD /S/Q "%$DST%\%%i"
)
zavoruev
06-07-2009, 11:48
Вы уж извените, но я не пишу скрипты, и мне нужно по подробней обозначить процессы. Давайте по очереди:
1. Сейчас разговаривал с программистом 1С, он говорит что ему необходимы архивы давностью за прошедший месяц, т.е с 1-30(31,28) (в зависимости от месяца, и архивы не делаются в субботу и воскресенье). Получается что значение Set $OLD должно быть в зависимости от месяца. Этот скрипт выполняется ночью в 3.30.
2. Далее в конце каждого месяца где-то в 00.30 (думаю 3 часа хватит на архивацию) должен выполняться скрипт (я думаю Winrar) на архивацию всех этих папок с последующим удаление (параметр М), и переносом архива в другой каталог (храняться до 3-х лет). Если есть другие варианты то подскажите!!!!
Т.е вариант с удаление папок отпал, базы нужны, так сказало руководство.
Сейчас разговаривал с программистом 1С »обычно сначала "говорят с программистом", а потом формулируют задачу, ну да ладно...
Т.е. вариант с удаление папок отпал, базы нужны, так сказало руководство »в таком случае все решается не скриптом, а средствами планировщика:
- один скрипт (типа того, что в первом посте) тупо копирует каталоги, этот скрипт планируется на ежедневное выполнение (кроме выходных, в 3.30)
@Echo Off
Set $SRC=D:\Mazda
Set $DST=D:\Backup
:: Находим текущие день/месяц/год
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%\
- второй скрипт архивирует все содержимое каталога "Backup" с удалением содержимого (у WinRAR есть такая опция), планируется на выполнение 1-го числа каждого месяца (в 00.30)
zavoruev
06-07-2009, 17:49
Это все понятно, спасибо!!! Просто на будущее,
1. может ли значение Set $OLD выбирать в зависимости от месяца, допустип в феврале 28 дней Set $OLD =28, июне Set $OLD =30. И вот исходя из этой переменной удаляться последние записи прошлого месяца (т.е февраль, 28 дней -----> при наступлении 1 числа марта будет удаляться бэкап с 1 по 31 января; при наступлении 1 апреля, удаляются бэкапы с 1 по 28 февраля). Возможно ли это реализовать, и если да, то как?????
2. Может ли значение Set $OLD во обоих скриптах быть больше 29 (1 скрипт- удаляет папки старше dd.mm.yyyy - 29, а второй ограничивает вообще кол-во папок, если больше 29, то удаляется 1 или нет, опишите вот это, не понятно???? )
Заранее огромное человеческое Спасибо
zavoruev, всё можно... важней понять, что нужно
1. для такой постановки $OLD не требуется, т.к. сравнение всегда идет с 1-м числом месяца
@Echo Off
Set $SRC=D:\Mazda
Set $DST=D:\Backup
:: Текущие день/месяц/год
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%\
:: Дата 1-го дня предыдущего месяца
Set /A $M=%$M%+11-((%$M%+10)/12)*12
Set $M=0%$M%
Set $M=%$M:~-2%
If %$M% EQU 12 Set /A $Y-=1
:: Удаляем старые архивные каталоги
If %$D% EQU 01 For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$DST%\??.??.????') Do If %%k%%j%%i LSS %$Y%%$M%01 RD /S/Q "%$DST%\%%i.%%j.%%k"
2. во втором скрипте значение $OLD может быть любым положительным целым числом
zavoruev
06-08-2009, 14:29
Всем добрый день!!!! Имеется скрипт на Удаление предварительно созданных папок и файлов с 1-го цисла следующего месяца, но в этом месяце удаление не произошло, так как 1 и 2 числа были суббота и воскресенье, а по этим дням бэкапы не делаются!!!! подскажите как доработать скрипт чтобы таких ситуаций не возникало. Заранее спасибо!!!
Echo Off
Set $SRC=D:\Mazda\2008
Set $DST=D:\Full_Backup
:: Текущие день/месяц/год
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/exclude:C:\scripts\excludelist.txt %$SRC%\* %$DST%\%$D%.%$M%.%$Y%\
:: Дата 1-го дня предыдущего месяца
Set /A $M=%$M%+11-((%$M%+10)/12)*12
Set $M=0%$M%
Set $M=%$M:~-2%
If %$M% EQU 12 Set /A $Y-=1
:: Удаляем старые архивные каталоги
If %$D% EQU 01 For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$DST%\??.??.????') Do If %%k%%j%%i LSS %$Y%%$M%01 @Echo RD /S/Q "%$DST%\%%i.%%j.%%k"
В скрипт не вчитывался, но возможно, что достаточно в процедуре удаления заменить условие If %$D% EQU 01 на If %$D% LEQ 03, тогда условие будет отработано 1, 2 и 3го числа, но сначала протестируйте "на кошках"
ЗЫ: По-хорошему это вопрос должен был быть задан здесь: http://forum.oszone.net/thread-144124.html
zavoruev
07-08-2009, 10:25
Поменял значение LEQ 01 на LEQ 03. "Кошки" остались живы, а вот удаление так и не произошло.
PS: Тему ту создавал я,и как раз сейчас идет доработка скрипта!!!!!!!!!!
ответил здесь >> (http://forum.oszone.net/thread-144124.html)
В неделе 2 выходных дня (насколько понял в шедл указано запускать только по рабочим дням), поэтому если процедура удаления будет запускаться 1го, 2го и 3го числа (не 6го как вчера или 7го, как сегодня), то как минимум один из 3х дней попадет на будни. А в этот раз Вам нужно удалить ручками.
zavoruev
07-08-2009, 12:46
Я опять тебя не понимаю!!!!! Тот топик завел я и отвечал мне на него AMEL27. Я его там задам!!!! Только скажи, ты то помочь сможешь?????
zavoruev
07-08-2009, 12:48
в августе месяце удаление июльских файлов не произошло, так как 1 и 2 числа были суббота и воскресенье, а по этим дням бэкапы не делаются!!!! подскажите как доработать скрипт чтобы таких ситуаций не возникало. Заранее спасибо!!!
Echo Off
Set $SRC=D:\Mazda\2008
Set $DST=D:\Full_Backup
:: Текущие день/месяц/год
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/exclude:C:\scripts\excludelist.txt %$SRC%\* %$DST%\%$D%.%$M%.%$Y%\
:: Дата 1-го дня предыдущего месяца
Set /A $M=%$M%+11-((%$M%+10)/12)*12
Set $M=0%$M%
Set $M=%$M:~-2%
If %$M% EQU 12 Set /A $Y-=1
:: Удаляем старые архивные каталоги
If %$D% EQU 01 For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$DST%\??.??.????') Do If %%k%%j%%i LSS %$Y%%$M%01 @Echo RD /S/Q "%$DST%\%%i.%%j.%%k"
То есть поменять значение EQU 01 на EQU 03 и ждать следующего месяца??????
У тебя возникла проблема. Ты для нее завел тему. Сейчас ты завел вторую тему по тому же вопросу. А отвечают в темах все, у кого есть на то возможность. Потому и ответил я именно в той ветке. Если кратко повторить мой ответ - в следующий раз скрипт должен удалить, но не сегодня, т.к. уже 7е число. Чтобы скрипт отрабатывал более точно, то предложенных исправлений недостаточно.
То есть поменять значение EQU 01 на EQU 03 и ждать следующего месяца? »
нет, поменять "равно 01" (EQU 01) на "меньше или равно 03" (LEQ 03).
tще в примере заметил вообще невыполняющуюся команду удаления - она просто выводится на экран. Нужно убрать "@Echo", чтобы сразу шло "RD..."
далее, можно вообще убрать условие "If %$D% EQU 01", оставив "FOR...", тогда скрипт будет пытаться удалять старые каталоги при каждом запуске, т.е. каждый день. Это будет лишним временем выполнения, но тогда точно удалит.
zavoruev, слушай NiOl, он дело говорит... :yes:
FYI: Как сообщить о том, что моя проблема решена? (http://forum.oszone.net/faq.php?faq=vb_board_usage#faq_solved_thread_faq)
Felix007
19-08-2009, 12:59
В продолжении темы, ребят пожалуйста помогите написать следующий батник. Требуется из папки сделать выборку файлов старше например 6 дней с даты создания переместить в другую папку и за архивировать. Я написал скрипт архивации но вот как по дате сделать даже и не знаю т.е как выбрать файлики лежащие в этой папке больше 6 дней.
Скрипт:
setlocal ENABLEDELAYEDEXPANSION
set day=%date:~0,2%
set month=%date:~3,2%
set year=%date:~6,4%
set today=%year%%month%%day%
set /a yesterday=today
7z a -tzip D:\tmp\Work\archiv_%yesterday% %fpath% *.txt
del D:\tmp\Work\*.txt
P.S надо сделать именно 7-zip т.к он бесплатный...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.