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

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

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

Старожил


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

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


Изменения
Автор: zavoruev
Дата: 03-07-2009
Всем добрый день!!!!
есть необходимость дописать скрипт, я в этом деле не мастер, но вот сейчас понадобилось.
Вот существующий
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.
Заранее всем благодарен!!!!

Отправлено: 14:32, 03-07-2009

 

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



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

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


Старожил


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

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


amel27,
спасибо тебе огромное! Есть пару вопросов:
1.
Цитата amel27:
P.S. при использовании последнего скрипта нельзя вручную добавлять/изменять содержимое архивных каталогов, иначе их дата будет заменена на текущую и работа скрипта нарушится »
Это наверно относится не к последнему скрипту, а к первому, т.к в последем удаление не завязано на дату, а на количество папок. Мне это важно, так как программист 1С работает с базами за прошлые числа.
2.
Цитата amel27:
:: Ограничиваем количество архивов »
--- Set $OLD=6- это означает что должно быть не больше 6-го архива (каталога)? Но при использовании скрипта папка создается, но архивы (каталоги) не удаляются, хотя их больше 6!!!!! И вообще поясните процесс, т.е создается 7-ой архив, и первый удаляется (критерий удаления), или создается 7-ой архив и первые 6 удаляются!!!! Как это работает??????????


3. Если у меня в папке D:\Backup\ есть не только папки созданные этим скриптом, но и архивы, которые делаются по другому шедулеру (с помощью winrar делается бэкап только нужных папок). Как будет работать последняя часть скрипта на удалении? Будет удалять тока создаваемы архивы, или ограничение идет для все папки.

P.S. Или все таки лучше папки и архивы разнести ао разным папкам в корне диска D:\

Последний раз редактировалось zavoruev, 06-07-2009 в 10:52.


Отправлено: 09:21, 06-07-2009 | #3


Старожил


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

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


И еще одно, формат создаваемого каталога должен выглядеть так 06.07.2009, а при использовании данных скриптов 06.07.09. Как это поправить?

Отправлено: 09:36, 06-07-2009 | #4


Googler


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

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


1. к последнему, в нем дата - из атрибутов каталога, в первом - восстановлена из его имени
2. 1) "@Echo Off" --> "@Echo On"; 2) "Script.CMD >Script.Log 2>&1"; 3) Script.Log - в студию!
3. батник обрабатывает только каталоги по маске "??.??.??" (с изменениями - "??.??.????")

Цитата zavoruev:
формат создаваемого каталога должен выглядеть так 06.07.2009, а при использовании данных скриптов 06.07.09 »
как указано в первом посте, так и реализовано в скрипте

Цитата zavoruev:
программист 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"
)
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:20, 06-07-2009 | #5


Старожил


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

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


Вы уж извените, но я не пишу скрипты, и мне нужно по подробней обозначить процессы. Давайте по очереди:
1. Сейчас разговаривал с программистом 1С, он говорит что ему необходимы архивы давностью за прошедший месяц, т.е с 1-30(31,28) (в зависимости от месяца, и архивы не делаются в субботу и воскресенье). Получается что значение Set $OLD должно быть в зависимости от месяца. Этот скрипт выполняется ночью в 3.30.
2. Далее в конце каждого месяца где-то в 00.30 (думаю 3 часа хватит на архивацию) должен выполняться скрипт (я думаю Winrar) на архивацию всех этих папок с последующим удаление (параметр М), и переносом архива в другой каталог (храняться до 3-х лет). Если есть другие варианты то подскажите!!!!

Т.е вариант с удаление папок отпал, базы нужны, так сказало руководство.

Последний раз редактировалось zavoruev, 06-07-2009 в 13:57.


Отправлено: 11:48, 06-07-2009 | #6


Googler


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

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


Цитата zavoruev:
Сейчас разговаривал с программистом 1С »
обычно сначала "говорят с программистом", а потом формулируют задачу, ну да ладно...

Цитата zavoruev:
Т.е. вариант с удаление папок отпал, базы нужны, так сказало руководство »
в таком случае все решается не скриптом, а средствами планировщика:
- один скрипт (типа того, что в первом посте) тупо копирует каталоги, этот скрипт планируется на ежедневное выполнение (кроме выходных, в 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)

Отправлено: 17:11, 06-07-2009 | #7


Старожил


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

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


Это все понятно, спасибо!!! Просто на будущее,
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 или нет, опишите вот это, не понятно???? )


Заранее огромное человеческое Спасибо

Отправлено: 17:49, 06-07-2009 | #8


Googler


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

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


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 может быть любым положительным целым числом

Последний раз редактировалось amel27, 07-07-2009 в 14:20. Причина: очепятка

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

Отправлено: 11:35, 07-07-2009 | #9


Старожил


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

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


Всем добрый день!!!! Имеется скрипт на Удаление предварительно созданных папок и файлов с 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"

Отправлено: 14:29, 06-08-2009 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Удаление папок по критериям jentoso Скриптовые языки администрирования Windows 16 17-06-2009 11:38
Любой язык - [решено] удаление файлов по маске, созданных за прошлые сутки BRAT2 Скриптовые языки администрирования Windows 1 06-04-2009 08:51
VBS/WSH/JS - [решено] Удаление файлов созданных ранее текущей даты на неделю KillHunter Скриптовые языки администрирования Windows 5 06-03-2009 12:23
[решено] Удаление файлов и папок ArGoth Автоматическая установка Windows 2000/XP/2003 1 26-05-2008 18:03
Удаление всех папок и файлов из папки c:\Temp DIKPro Microsoft Windows NT/2000/2003 10 15-08-2006 16:20




 
Переход