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

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

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

Старожил


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

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


всем добрый день! Имеется задача перемещения устаревший файлов из папки, но не всех, а только недельной давности, что бы файлы за последнюю неделю сохранялись. Скрипт будет выполняться 2 раза в неделю. На данный момент имею вот такой скрипт, но перемещения файлов не происходит???!! Подскажите по чему!

@Echo Off
:: Параметры скрипта, 0 < $OLD < 29!
:: $OLD - столько ДНЕЙ храним архивы
Set $SRC=D:\obmen1
Set $DST=D:\Backup_Obmen1
Set $OLD=1
:: Находим текущие день/месяц/год
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%

:: копируем старые каталоги (файлы)
Call :GetOldDate %$OLD%
For /F "Tokens=1-3 Delims=." %%i In ('DIR /B/A:D %$SRC%\??.??.????') Do If %%k%%j%%i LEQ %$Y%%$M%%$D% move /Y "%$SRC%\%%i.%%j.%%k %$DST%\"
:: Выход
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:11, 02-04-2010

 

Ветеран


Contributor


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

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


Основная проблема - отнять от текущей даты заданное кол-во дней. В решении похожей задачи заимствовал процедуры. Вот батник, который помещаете в назначенные задания (но rar лучше, всё равно старьё надо архивировать!)
Код: Выделить весь код
Echo off
rem -------------------
rem Перенос файлов не новее указанного числа дней из одной директории в другую
rem Предполагаю, что Дата в системе выдаётся в формате дд.мм.гггг чч:мм и т д (разделитель не важен) 
rem -------------------

rem ------------------------------ Кол-во дней за которые не перемещаем файлы
Set NDays=5

rem ------------------------------ Где находятся все файлы (можно указать маску)
Set WhereAll=H:\Delete\All Files\*.*

rem ------------------------------ Куда перемещаем старые
Set WhereOld=H:\Delete\Old Files\

rem Выделяю из текущей даты день, месяц, год

Set Dt=%Date%

Set Day=%Dt:~0,2%
If %Day:~0,1%==0 Set Day=%Day:~1,1%

Set Mon=%Dt:~3,2%
If %Mon:~0,1%==0 Set Mon=%Mon:~1,1%

Set Yea=%Dt:~6,4%

Call :MinusDays

Set Dt=%Yea%%Mon%%Day%

FOR %%i IN ("%WhereAll%") DO Call :MoveFromTo "%%i"

GoTo :End

rem -------------------------------------------------------------
rem Процедура перемещает файлы не новее указанной даты (формат ггггммдд)
rem -------------------------------------------------------------

:MoveFromTo

Set D=%~t1
Set D=%D:~6,4%%D:~3,2%%D:~0,2%

If %D% LEQ %Dt% Move "%~f1" "%WhereOld%"

GoTo :End


rem -------------------------------------------------------------
rem Процедура отнимает от даты заданное число дней
rem Дата содержится в трёх переменных Day Mon Yea
rem -------------------------------------------------------------

:MinusDays

For /L %%D IN (1,1,%NDays%) Do Call :OldDt

If %Day% LSS 10 Set Day=0%Day%
If %Mon% LSS 10 Set Mon=0%Mon%

rem Echo %Yea% %Mon% %Day%
rem Pause 

GoTo End

rem ---------------------------------
rem Процедура отнимает от даты 1 день
rem ---------------------------------

:OldDt
Set /A Day=%Day%-1

If %Day% GTR 0 GoTo End

Set Day=31

Set /A Mon=%Mon%-1

If %Mon% GTR 0 GoTo BotDay

Set Mon=12
Set /A Yea=%Yea%-1

:BotDay
 
If Not %Mon%==2 GoTo Mon30
Set Day=28

Set iYea=%Yea%
Set /A iYea=%iYea%/4
Set /A iYea=%iYea%*4

If %Yea%==%iYea% Set Day=29
GoTo End 

:Mon30
If %Mon%==4 Set Day=30
If %Mon%==6 Set Day=30
If %Mon%==9 Set Day=30
If %Mon%==11 Set Day=30

GoTo End
rem ---------------------------------


:End
Батник располагайте где угодно, только не в директории откуда переносите файлы, в назначенном задании укажите его полное имя (с путем)

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

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

Отправлено: 19:51, 12-05-2010 | #21



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

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


Старожил


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

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


А что Вы там говорили по поводу rar.exe. Готов выслушать Ваши предложения!

Отправлено: 11:21, 28-05-2010 | #22


Ветеран


Contributor


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

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


"C:\Program Files\WinRar\winrar.exe" a -df -to7d -agYYYYMMDD{_NameArc} "H:\Kuda\.rar" "T:\Otkuda\*.*"

Ключ -df удалит заархивированные файлы
Ключ -to7d приведёт к архивации файлов старше 7 дней

Ключ -agYYYYMMDD{_NameArc} - добавит к имени архива дату и символы. Я имя архива написал пустым (.rar). _NameArc - НапишИте своё, подходящее по смыслу.
После отработки WinRar для сегодня получим архив под именем 20100528_NameArc.rar в папке H:\Kuda\

"H:\Kuda\.rar" - путь к заархивированным файлам (напИшите своё)
"T:\Otkuda\*.*" - где лежат архивируемые файлы (напИшите своё)

Описание ключей в справочной системе WinRar
Вызов WinRar можно поместить в назначенные задания

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


Последний раз редактировалось megaloman, 29-05-2010 в 07:57.

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

Отправлено: 14:04, 28-05-2010 | #23



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
7 / 2008 R2 - Перемещение папки Users в Windows 7 bab00n Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista 28 17-03-2015 12:11
V. 5.5/2000/2003 - [решено] Скрипт для чистки общей папки от устаревших сообщений migunov Microsoft Exchange Server 2 21-11-2009 09:50
[решено] SVN, как добавить папку в svn-репозиторий без вложенных в папку файлов? pingUIN Хочу все знать 1 03-11-2009 17:16
Разное - [решено] Перемещение папки Users nikkor7 Microsoft Windows Vista 2 13-04-2009 11:58
[решено] Перемещение папки Users и изменение букв дискам средствами WAIK alcatraz Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista 10 28-02-2009 03:04




 
Переход