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

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

Ветеран


Contributor


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

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


keisersoze, Вот решение, в предположении, что в системе дата отображается в виде дд.мм.гггг. Кроме того, понедельник-1 день недели. При работе в выходной папке создаётся временная подпапка с именем ггггммдд воскресенья заданной недели, которая в конце работы батника удаляется.
Получилось громоздко из-за подсчета дат
Код: Выделить весь код
@Echo off
cls

Set "InBox=D:\Delete\DirIn"
Set "OutBox=D:\Delete\DirOut"
Set "InMask=*.rar"
Set "OutMask=*1603*.bat"

Set "Arc=C:\Program Files\WinRAR\Rar.exe" 

Set /A NWeek=0
If Not ""=="%1" Set /A NWeek=%~1 

Call :DWeek17 "DWeek1" "DWeek7" %NWeek%
Echo %Date% %DOW% %DWeek1% %DWeek7%

SetLocal EnableExtensions EnableDelayedExpansion

md "%OutBox%\%DWeek7%" 2>nul
pushd "%OutBox%\%DWeek7%"
Echo -----

Set "Name1=0"
FOR /F "usebackq delims=" %%f IN (`Dir "%InBox%\%InMask%" /b /A:-D /O:-D 2^>nul`) DO (
	Call :DFile "%InBox%\%%f" "Dtt"	
	Set "Dtt=!Dtt:~6,4!!Dtt:~3,2!!Dtt:~0,2!"
	If %DWeek1% LEQ !Dtt! If !Dtt! LEQ %DWeek7% (
		If !Name1!==0 Set "Name1=!Dtt!"
		Set "Name2=!Dtt!"
		rem Echo %%f %%~tf !Dtt!
                Set Proc="%Arc%" e -y "%InBox%\%%f" "%OutMask%"
		Echo !Proc!
		!Proc! >nul 2>nul
	)
)

If Not !Name1!==0 (
	If Not !Name1!==!Name2! Set Name1=!Name1!-!Name2!
        Set Proc="%Arc%" a -df "%OutBox%\!Name1!"
	Echo +++++
	Echo !Proc!
	!Proc! >nul 2>nul
)

popd
rd /S /Q "%OutBox%\%DWeek7%"
Pause

GoTo :Eof

:DFile
	Set %~2=%~t1
GoTo :Eof

:DWeek17

Call :DayOfWeek %Date% "DOW"

Set /A Delta=1-%DOW%-7*%~3
Set "%~1=%Date:~6,4%%Date:~3,2%%Date:~0,2%"
If Not %Delta%==0 Call :FromDate %Delta% %Date% "%~1" 

Set /A  Delta=7-%DOW%-7*%~3
Set "%~2=%Date:~6,4%%Date:~3,2%%Date:~0,2%"
If Not %Delta%==0 Call :FromDate %Delta% %Date% "%~2" 

GoTo :Eof

:DayOfWeek

rem Выдаёт номер дня недели для даты в первом аргументе (формат дд.мм.гггг)
rem в переменную, имя которой указано во втоорм аргументе в кавычках

Set "@Date=%~1"
Set /A @YYYY=%@Date:~6,4%, @MM=1%@Date:~3,2%-100, @DD=1%@Date:~0,2%-100
Set /A %~2=((%@YYYY%-1901)*365 + (%@YYYY%-1901)/4 + %@DD% + (!(%@YYYY% %% 4))*(!((%@MM%-3)^&16))+(%@MM%-1)*30+2*(!((%@MM%-7)^&16))-1+((65611044^>^>(2*%@MM%))^&3))%%7+1

GoTo :Eof

:FromDate

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

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyymmdd"
rem результат в перемменной %yyyymmdd%

 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 "%~3=%yyyy%%mm:~-2%%dd:~-2%"
GoTo :Eof

В предложенном решении я заимствовал 2 процедуры, их авторов указать затрудняюсь: подсчет номера дня недели и пересчёт даты на заданное количество дней.

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


Последний раз редактировалось megaloman, 26-05-2016 в 13:51.

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

Отправлено: 13:34, 26-05-2016 | #4