Имя пользователя:
Пароль:
 

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

Ветеран


Contributor


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

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


Упаковать файлы по маске в конкретной папке с подпапками в архив с датой в имени, изменённые указанное количество дней тому назад.
Укажите свой путь, маску, количество дней, путь для файлов с архивами
Код: Выделить весь код
@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: при поиске файлов. Если Вас это не устраивает - удалите эту строку

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


Последний раз редактировалось megaloman, 28-02-2020 в 18:25.

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

Отправлено: 18:13, 28-02-2020 | #5