Показать полную графическую версию : Создание архива после поиска файлов по дате изменения
Доброго времени суток ! Заранее прошу прощения, не опытен в писаний батников . В общем дали задание написать бат файл , который искал бы файлы по маске .jpg и с заданной датой изменения (5 дней к примеру). После эти самые файлы были заархивированны , и имя архива было датой изменения . Каюсь , не совсем скорее всего четко объяснил свою мысль .Нашел пример кода который ищет по дате файлы , но как сделать чтобы найденный результат (все файлы с данной маской) были заархивированы с названием даты изменения ?
@echo off
set /p tc="Введите дату (01.04.2016): "
for /f "tokens=1,3,*" %%a in ('dir /a-d/tw/-c "papka"^|findstr /rc:"^[^ ]"') do if %tc%==%%a echo %%c
pause>nul
и с заданной датой изменения (5 дней к примеру). »
«5 дней» — это не «дата изменения».
«5 дней» — это не «дата изменения». »
Ошибочка , позднее время очень и уже с просони пишу бред . Поиск файлов у которых дата последнего изменения были 5 дней назад , по всем дискам . И дальше уже архивация и с именем этой даты. Прошу прощения за опечаток
«5 дней» — это не «дата изменения». »
Ошибочка , позднее время очень и уже с просони пишу бред . Поиск файлов у которых дата последнего изменения были 5 дней назад , по всем дискам . И дальше уже архивация и с именем этой даты. Прошу прощения за опечаток
но как сделать чтобы найденный результат (все файлы с данной маской) были заархивированы с названием даты изменения ?
@echo off
set /p tc="Введите дату (01.04.2016): "
for /f "tokens=1,3,*" %%a in ('dir /a-d/tw/-c "papka"^|findstr /rc:"^[^ ]"') do if %tc%==%%a echo %%c
pause>nul »
Вместо papka подставить %FOLDER%, добавив строчкой выше set FOLDER=x:\путь\к\папке
Заменить echo %%c на команду архиватора. В %tc% есть нужная дата, в %FOLDER%\%%c - полное имя файла для добавления в архив
Пути и имена "обрамлять в кавычки"
megaloman
28-02-2020, 18:13
Укажите свой путь, маску, количество дней, путь для файлов с архивами @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: при поиске файлов. Если Вас это не устраивает - удалите эту строку
Упаковать файлы по маске в конкретной папке с подпапками в архив с датой в имени, изменённые указанное количество дней тому назад.
Упаковать файлы по маске на всех дисках с путями в архив с датой в имени, изменённые указанное количество дней тому назад. »
Работает все великолепно ! Спасибо большое !)
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%"
А можно пожалуйста эту часть разобрать ? Сам код работает , но хотелось понимать его полностью
megaloman
04-03-2020, 15:46
Adilr3r, в коде ссылкаЗаимствовано http://forum.oszone.net/thread-186889.html »В cmd работа с датами очень затруднена. Я не изобретал велосипед и не стал перепрограммировать рабочий код, взял его, как есть с непринципиальными доработками. По видимому, вычисление основано на преобразовании даты в значение юлианского дня (целое число), с последующим вычитанием или прибавлением требуемого числа дней и последующего обратного преобразования полученного значения юлианского дня в дату григорианского календаря дд мм гггг.
В cmd работа с датами очень затруднена. Я не изобретал велосипед и не стал перепрограммировать рабочий код, взял его, как есть с непринципиальными доработками. По видимому, вычисление основано на преобразовании даты в значение юлианского дня (целое число), с последующим вычитанием или прибавлением требуемого числа дней и последующего обратного преобразования полученного значения юлианского дня в дату григорианского календаря дд мм гггг. »
Понял Вас , спасибо большое за помощь !
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.