Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Создание архива после поиска файлов по дате изменения (http://forum.oszone.net/showthread.php?t=344220)

Adilr3r 28-02-2020 03:19 2911211

Создание архива после поиска файлов по дате изменения
 
Доброго времени суток ! Заранее прошу прощения, не опытен в писаний батников . В общем дали задание написать бат файл , который искал бы файлы по маске .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

Iska 28-02-2020 05:08 2911213

Цитата:

Цитата Adilr3r
и с заданной датой изменения (5 дней к примеру). »

«5 дней» — это не «дата изменения».

Adilr3r 28-02-2020 05:33 2911215

Цитата:

Цитата Iska
«5 дней» — это не «дата изменения». »

Ошибочка , позднее время очень и уже с просони пишу бред . Поиск файлов у которых дата последнего изменения были 5 дней назад , по всем дискам . И дальше уже архивация и с именем этой даты. Прошу прощения за опечаток

Цитата:

Цитата Iska
«5 дней» — это не «дата изменения». »

Ошибочка , позднее время очень и уже с просони пишу бред . Поиск файлов у которых дата последнего изменения были 5 дней назад , по всем дискам . И дальше уже архивация и с именем этой даты. Прошу прощения за опечаток

iglezz 28-02-2020 11:58 2911243

Цитата:

Цитата Adilr3r
но как сделать чтобы найденный результат (все файлы с данной маской) были заархивированы с названием даты изменения ?
@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 2911313

Упаковать файлы по маске в конкретной папке с подпапками в архив с датой в имени, изменённые указанное количество дней тому назад.
Укажите свой путь, маску, количество дней, путь для файлов с архивами
Код:

@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: при поиске файлов. Если Вас это не устраивает - удалите эту строку

Adilr3r 03-03-2020 23:42 2911911

Цитата:

Цитата megaloman
Упаковать файлы по маске в конкретной папке с подпапками в архив с датой в имени, изменённые указанное количество дней тому назад.
Упаковать файлы по маске на всех дисках с путями в архив с датой в имени, изменённые указанное количество дней тому назад. »

Работает все великолепно ! Спасибо большое !)

Adilr3r 04-03-2020 14:52 2911968

Код:

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 2911979

Adilr3r, в коде ссылка
Цитата:

Цитата megaloman

В cmd работа с датами очень затруднена. Я не изобретал велосипед и не стал перепрограммировать рабочий код, взял его, как есть с непринципиальными доработками. По видимому, вычисление основано на преобразовании даты в значение юлианского дня (целое число), с последующим вычитанием или прибавлением требуемого числа дней и последующего обратного преобразования полученного значения юлианского дня в дату григорианского календаря дд мм гггг.

Adilr3r 04-03-2020 16:39 2911985

Цитата:

Цитата megaloman
В cmd работа с датами очень затруднена. Я не изобретал велосипед и не стал перепрограммировать рабочий код, взял его, как есть с непринципиальными доработками. По видимому, вычисление основано на преобразовании даты в значение юлианского дня (целое число), с последующим вычитанием или прибавлением требуемого числа дней и последующего обратного преобразования полученного значения юлианского дня в дату григорианского календаря дд мм гггг. »

Понял Вас , спасибо большое за помощь !


Время: 01:05.

Время: 01:05.
© OSzone.net 2001-