1 (изменено: alexii, 2012-11-22 22:47:49)

Тема: CMD/BAT: Обработка архивов по дате создания

Здравствуйте!

В папке лежат файлы архивов вида Inf#1_496766#2012_11_20#23_09_10.zip их нужно обработать, но для это скопировать по текущей дате только архивы этого дня в отдельную папку.

Я написала по аналогичным примерам, но в цикле, когда прохожу файлы в каталоге не получается вставить сравнение дат:

@echo on
@cd %1
@cd ?a»?«??
@rem j -- ¬??N???

@echo %date%
@set day=%date:~0,2%
@if %day:~0,1%==0 set day=%day:~1,1%
@set mes=%date:~3,2%
@if %mes:~0,1%==0 set mes=%mes:~1,1%
@set god=%date:~6,4%

:STEP1
@set /a JDN=%day%+((153*(%mes%+(12*((14-%mes%)/12))-3)+2)/5)+(365*(%god%+4800-((14-%mes%)/12)))+((%god%+4800-((14-%mes%)/12))/4)-((%god%+4800-((14-%mes%)/12))/100)+((%god%+4800-((14-%mes%)/12))/400)-32045

set FOLDER=C:\Internet
if exist %temp%\files.lst del %temp%\files.lst
FOR %%A in (%FOLDER%\*.*) do @echo %%~txA "%%A"  >>%temp%\files.lst
FOR /F "tokens=1-6,* delims=.: " %%A in (%temp%\files.lst) do (

@set day2= %%A
@set mes2=%%B
@set god2=%%C

@set /a JDN2=%day2%+((153*(%mes2%+(12*((14-%mes2%)/12))-3)+2)/5)+(365*(%god2%+4800-((14-%mes2%)/12)))+((%god2%+4800-((14-%mes2%)/12))/4)-((%god2%+4800-((14-%mes2%)/12))/100)+((%god2%+4800-((14-%mes2%)/12))/400)-32045

@set /a dif=%JDN%-%JDN2%

@If %dif% EQU 0 (GOTO STEP4) ELSE (GOTO STEP5)

:STEP4
copy %%G  С:\Arhiv\%%A_%%B_%%C_00.%%F 

:STEP5

"C:\Program Files\WinRAR\winrar.exe" x  *.zip *.*
)

2

Re: CMD/BAT: Обработка архивов по дате создания

Lrv, добавьте префикс «CMD/BAT: » в заголовок темы. Оформите код при помощи тэга «сode».

3

Re: CMD/BAT: Обработка архивов по дате создания

Lvr, для чего Вы используете знак собачки в каждой строке, когда можно просто указать в начале @echo off, дабы избавиться от эха комманд? Это во-первых. Во-вторых, лично мне не понятен разбор даты:

Lvr пишет:

@echo %date%
@set day=%date:~0,2%
@if %day:~0,1%==0 set day=%day:~1,1%

Может все же

@echo off
...
set today=%date:.=%
::в итоге легче парсить дату
set day=%today:~0,2%
set month=%today:~3,2%
set year=%today:~5,4%

Также следует учитывать, что переменая %date% зависит от локали.
В-третьих, чтобы копировать архив по дате в заголовке вовсе не обязательно писать сложные конструкции, а следует обратить внимание на регулярные выражения.

4

Re: CMD/BAT: Обработка архивов по дате создания

xcopy путь\*.zip [куда] /d:mm-dd-yyyy

чтобы не парсить список для разбира даты файлов можно сразу же выполнить копирование файлов только за указанную дату, только с требуемым в команде представлением день-месяц-год надо на конкретной машине разобраться.

WBR. Roman

5

Re: CMD/BAT: Обработка архивов по дате создания

greg zakharov пишет:

Lvr, для чего Вы используете знак собачки в каждой строке, когда можно просто указать в начале @echo off, дабы избавиться от эха комманд?
....

Я такой прием тоже использую, когда эхо у части команд интересует, а у части нет. Правда когда интересующих команд всего 4-е строчки то легче вначале батника выключить, а перед интересующими строками - временно включить.

WBR. Roman

6

Re: CMD/BAT: Обработка архивов по дате создания

Rom5 пишет:

выполнить копирование файлов только за указанную дату

Это хорошо, когда надо скопировать любые файлы. Если же требуется заданные имена файлов (как в задаче), то без конструирования шаблонов не обойтись.

Почитал

xcopy /?
robocopy /?

Они так не умеют. Если все же надо выбирать определенные файлы по шаблону, то как-то так. Возможно и есть путь проще, но мне он не известен.

@echo off


setlocal enabledelayedexpansion


:: вычисляем компоненты времени 
call :get_time

:: создаем поисковый шаблон
call :create_template

::set timestamp
::set search

:: полезный код: что-то делаем с заданными файлами
dir "%search_tmpl%"

goto :EOF


:: выбираем элементы даты/времени и
:: сохраняем в переменных окружения
:: элементы выравнивается вправо добавлением нулей
:get_time
for /f "tokens=1,2 delims==" %%i in (
    'wmic path win32_localtime get /value ^| findstr /v "^$"'
) do (
    call set timestamp_%%i=%%j
    if not "%%~i" == "Year" (
        set timestamp_%%i=00!timestamp_%%i!
        set timestamp_%%i=!timestamp_%%i:~-2!
rem    ) else (
rem        set timestamp_YearShort=!timestamp_Year:~-2!
rem        set timestamp_Century=!timestamp_Year:~0,2!
    )
)
goto :EOF


:: создаем последовательно 
:: шаблоны для даты и имени файла
:create_template
set "search_date=%timestamp_Year%_%timestamp_Month%_%timestamp_Day%"
set "search_tmpl=Inf#*_*#%search_date%#*.zip"
goto :EOF
( 2 * b ) || ! ( 2 * b )

7

Re: CMD/BAT: Обработка архивов по дате создания

Спасибо огромное за ответы. Rumata - точно пригодится.
Но сейчас мне нужно помочь найти ошибку вот здесь:

FOR /F "tokens=1-6,* delims=.: " %%A in (%temp%\files.lst) do (

)
в теле цикла почему-то не сравниваются расчет текущей даты по юлианскому календарю и даты создания архива также переведенного на юлианский календарь? Я не могу понять почему.
%JDN% и %JDN2% рассчитываются правильно, но как только я ставлю расчет %JDN2% в цикл у меня ничего не работает.

8

Re: CMD/BAT: Обработка архивов по дате создания

у меня такое задание:сделать bat-файл, чтобы при его выполнении архив из одной папки(основной) делал резервная копю..например c:\DB\f.rar в с:\DB\f1.1.01.13.rar
Каждый раз копирование происходило c новой датой(допустим один день - c:\DB\f1.01.13.ra, второй - c:\DB\f2.01.13.rar, третий - c:\DB\f3.01.13.rar и тд..)
то есть резервное копирование архива за каждый день
может у кого-то есть готовый такой батник! я не особо в этом разбираюсь, но преподаватель дал такое задание..
кто-то может помочь?

9

Re: CMD/BAT: Обработка архивов по дате создания

fdv-220v-sever, не надо дублировать посты, тем более в не подходящих по смыслу темах.