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

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

Ветеран


Contributor


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

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


Постановка задачи в Вашем изложении весьма запутана, поэтому сам себе ставлю задачу и сам её решаю
Имеется папка, например, E:\Delete, в которой создаются подпапки с именами вида дд.мм.гггг .
В них создаются файлы с именами вида ггггммддччмм.rar
Также есть папка, например, E:\DDDDD, в которой хранятся копии файлов из указанных папок, но копии файлов в этой папке должны храниться не более недели.
Вот батник, который удаляет в папке E:\DDDDD копии файлов старше недели (время создания файла анализируется по информации в его имени ггггммдд) и копирует все файлы в подпапках E:\Delete\дд.мм.гггг\ггггммддччмм.rar в папку E:\DDDDD, которые не старше недели и которых еще нет в папке E:\DDDDD (время создания файлов определяется из имени папки дд.мм.гггг)
Код: Выделить весь код
@Echo Off

Set From=E:\Delete
Set To=E:\DDDDD
Set Mask=20*.rar
Set MaskD=??.??.20??

Set DeltaDay=-7

SetLocal EnableExtensions EnableDelayedExpansion

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

Call :FromNow %DeltaDay% %Date%

rem Чистим папку %To% от файлов старше недели

If Exist "%To%\%Mask%" (
	FOR /F "usebackq delims=" %%j IN (`Dir "%To%\%Mask%" /B /A:-D /O:N`) DO (
		Set FDate=%%~nxj
		Set FDate=!FDate:~0,8!
		If !FDate! LEQ %yyyymmdd% (Del "%To%\%%j">NUL) Else (GoTo :Continue) 
	)
)
:Continue

rem Копируем файлы из папок во %From% не старше недели

FOR /F "usebackq delims=" %%j IN (`Dir "%From%\%MaskD%" /B /A:D /O:N`) DO (
	Set FDate=%%~nxj
	Set FDate=!FDate:~6,4!!FDate:~3,2!!FDate:~0,2!
	If !FDate! GTR %yyyymmdd% XCopy "%From%\%%j\%Mask%" "%To%\" /D /Y >NUL
)

GoTo :Eof

:FromNow
 SetLocal
 Set DT=%2
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
 Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
 Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
 Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
 Set /A J=J+2-12*L,I=100*(N-49)+I+L
 Set /A yyyy=I,mm=100+J,dd=100+K
 EndLocal& Set yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof
Пересчет даты заимствовал здесь

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

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

Отправлено: 18:13, 29-03-2013 | #11