Упаковать файлы по маске в конкретной папке с подпапками в архив с датой в имени, изменённые указанное количество дней тому назад.
Укажите свой путь, маску, количество дней, путь для файлов с архивами
Код:
@Echo Off
cls
Set /A DeltaDay=-5
Set "BoxIn=D:\CMD_Forum"
Set "Mask=*.jpg"
Set "BoxOut=Z:\Box_Out"
Set "Arc="%ProgramFiles%\winrar\winrar.exe""
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "@Tdate=%@Tdate:~0,8%"
Set /A DeltaDay2=%DeltaDay%+1
Set "ddmmyyyy=%@Tdate:~6,2%.%@Tdate:~4,2%.%@Tdate:~0,4%"
Call :FromDate %DeltaDay% %ddmmyyyy% "Ayyyymmdd"
Call :FromDate %DeltaDay2% %ddmmyyyy% "Byyyymmdd"
Call :Archives "%BoxIn%" "%Mask%" "%BoxOut%" %Arc% "%Ayyyymmdd%" %Byyyymmdd%
pause
Exit /B 0
:Archives
Set "NBoxIn=%~1"
Set "NBoxIn=%NBoxIn::\=_%"
Set "NBoxIn=%NBoxIn::=%"
Set "NBoxIn=%NBoxIn:\=-%"
%4 a -r -tam%~5 -tbm%~6 "%~3\%~5-%NBoxIn%" "%~1\%~2"
Exit /B 0
: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
Упаковать файлы по маске на всех дисках с путями в архив с датой в имени, изменённые указанное количество дней тому назад.
Код:
@Echo Off
cls
Set /A DeltaDay=-5
Set "Mask=*.jpg"
Set "BoxOut=Z:\Box_Out"
Set "Arc="%ProgramFiles%\winrar\winrar.exe""
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "@Tdate=%@Tdate:~0,8%"
Set /A DeltaDay2=%DeltaDay%+1
Set "ddmmyyyy=%@Tdate:~6,2%.%@Tdate:~4,2%.%@Tdate:~0,4%"
Call :FromDate %DeltaDay% %ddmmyyyy% "Ayyyymmdd"
Call :FromDate %DeltaDay2% %ddmmyyyy% "Byyyymmdd"
FOR /F "usebackq tokens=1 skip=1 delims=:" %%i IN (`"wmic logicaldisk where drivetype="3" get caption | FINDSTR /R /C:"[A-Z]""`) DO (
Call :Archives "%%~i:" "%Mask%" "%BoxOut%" %Arc% "%Ayyyymmdd%" %Byyyymmdd%
)
pause
Exit /B 0
:Archives
If /I %1=="C:" Exit /B
Set "NBoxIn=%~1"
Set "NBoxIn=%NBoxIn::\=_%"
Set "NBoxIn=%NBoxIn::=%"
Set "NBoxIn=%NBoxIn:\=-%"
%4 a -r -tam%~5 -tbm%~6 "%~3\%~5-%NBoxIn%" "%~1\%~2"
Exit /B 0
: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
If /I %1=="C:" Exit /B - здесь сделано исключение диска C: при поиске файлов. Если Вас это не устраивает - удалите эту строку
|