Войти

Показать полную графическую версию : Проверка по названию файлов с расширением dbf


FantomasAnand
03-06-2014, 22:32
В папку C:\SLTEST ежедневно в 21:00 скидывается файл(через wget с определенного сайта) с названием "SLдатазавтрашнегодня.dbf", например сегодня 02.06.2014, значит файл в 21:00 упадет с названием SL030614.DBF.Далее он должен переноситься в другую папку C:\Finish
Мне надо чтобы батник мог проверить что он скачал до переноса, вдруг на сайте не обновили файл DBF и скинет старый. Как он проверит название файла dbf на наличие даты завтрашнего дня?

firstarey
04-06-2014, 14:03
FantomasAnand, если я Вас правильно понял, то этого вполне достаточно:
@echo off
Color 0e
rem http://forum.oszone.net/thread-283120.html
rem задаем переменные:
rem дата
set DD=%date:~0,2%
set DM=%date:~3,2%
set DY=%date:~6,4%
if %DD%==0? set DD=%date:~1,1%
set /a DD=%DD%+1
if %DD% LSS 10 set DD=0%DD%
if exist "C:\SLTEST\SL%DD%%DM%%DY%.dbf" move "C:\SLTEST\SL%DD%%DM%%DY%.dbf" "C:\Finish\SL%DD%%DM%%DY%.dbf"


p.s.
скрипт не учитывает количество дней в месяце и будет искать архив за 32 число, если запущен 31
но думаю 1 день не критично

FantomasAnand
04-06-2014, 14:30
Firstarey, спасибо! А как учесть количество дней в месяце?Я слышал есть утилита Doff http://www.jfitz.com/dos/#DOFF , но как ее пристроить сюда...

firstarey
04-06-2014, 15:04
FantomasAnand, можно так поступить, но тут опять таки не учитываются високосные годы
@echo off
Color 0e
rem http://forum.oszone.net/thread-283120.html
rem задаем переменные:
set /a DD=1%date:~0,2%-100
set /a DM=1%date:~3,2%-100
set /a DY=%date:~-4%
if %DM%==1 set Dmax=31
if %DM%==2 set Dmax=28
if %DM%==3 set Dmax=31
if %DM%==4 set Dmax=30
if %DM%==5 set Dmax=31
if %DM%==6 set Dmax=30
if %DM%==7 set Dmax=31
if %DM%==8 set Dmax=31
if %DM%==9 set Dmax=30
if %DM%==10 set Dmax=31
if %DM%==11 set Dmax=30
if %DM%==12 set Dmax=31

if %DD% == %Dmax% (
set DD=1
set /a DM=%DM%+1
) else (
set /a DD=%DD%+1
)
if %DM% == 13 (
set DM=1
set /a DY=%DY%+1
)
if %DD% LSS 10 set DD=0%DD%
if %DM% LSS 10 set DM=0%DM%
if exist "C:\SLTEST\SL%DD%%DM%%DY%.dbf" move "C:\SLTEST\SL%DD%%DM%%DY%.dbf" "C:\Finish\SL%DD%%DM%%DY%.dbf"

gora
04-06-2014, 15:08
датазавтрашнегодня »
Рассчитать можно так:@Echo Off
:: Процедуре передается число дней для смещения
:: Положительное число - в будущее, отрицательное в прошлое
Set N=1

Call :FromNow %N%
Echo %DATE:~-4%%DATE:~3,2%%DATE:~,2%
Echo %yyyymmdd%
Pause
Exit /B

:FromNow
SetLocal
Set /A yyyy=%DATE:~-4%, mm=100%DATE:~3,2%%%100-14, dd=100%DATE:~,2%%%100
Set /A L=%~1+dd+36494+1461*(yyyy+4800+mm/12)/4+367*(mm+12-mm/12*12)/12-3*((yyyy+4900+mm/12)/100)/4
Set /A 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, dd=100+L-2447*J/80, L=J/11
Set /A mm=100+J+2-12*L, yyyy=100*(N-49)+I+L
EndLocal& Set yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
Exit /B

megaloman
04-06-2014, 20:20
Не будем вычислять дату завтрешнего дня - не нужно это. Нам надо переместить файл с датой в имени больше чем сегодняшняя. Если сегодня 02.06.2014, преобразуем сегодняшнюю (текущую системную) дату к числу 140602, из имени файла SL030614.DBF вычленим его дату и тоже преобразуем в число 140603. Файл(ы) с датой больше сегодняшней, то есть 140603>140602 перемещаем куда надо, остальные не трогаем @Echo Off

Set "Maska=Z:\SLTEST\sl??????.dbf"
Set "Out=Z:\Finish\"

Set "Now=%Date:~8,2%%Date:~3,2%%Date:~0,2%"

SetLocal EnableExtensions EnableDelayedExpansion

FOR %%f IN ("%Maska%") DO (
Set "fname=%%~nxf"
Set "fdate=!fname:~6,2!!fname:~4,2!!fname:~2,2!"
If !fdate! GTR %Now% Move /Y "%%f" "%Out%" >nul
)
А если уж совсем не думать о датах (это возможно, если в архиве хранятся предыдущие файлы и в исходную папку исходный файл попадает один раз) то получится еще проще, переносим файл(ы), которого нет в архиве@Echo Off

Set "Maska=Z:\SLTEST\sl??????.dbf"
Set "Out=Z:\Finish\"

FOR %%f IN ("%Maska%") DO if not exist "%Out%%%~nxf" Move "%%f" "%Out%" >nul
firstarey, скрипт не учитывает количество дней в месяце и будет искать архив за 32 число, если запущен 31
но думаю 1 день не критично не совсем въехал, Ваш скрипт каждый последний день месяца будет работать криво? Искать несуществующий завтрашний день, при этом игнорировать реальный? :not-me:

firstarey
05-06-2014, 06:27
Ваш скрипт каждый последний день месяца будет работать криво? »
это было экспресс решение :)
в 4 и 5 сообщениях такого недочета нет.

мне понравилось Ваше решение с преобразованием даты в число, но в от думаю второй вариант к данной конкретной задаче не совсем подойдет, ведь:вдруг на сайте не обновили файл DBF и скинет старый »

firstarey
05-06-2014, 06:58
megaloman, немного изменил Ваш скрипт, убрал цикл, но идею сохранил и поместил в коллекцию :) :up

@echo off
Color 0e
rem http://forum.oszone.net/thread-283120.html
Set ndate=%Date:~8,2%%Date:~3,2%%Date:~0,2%
For %%i in ("C:\SLTEST\*.dbf") do set fname=%%~nxi
Set fdate=%fname:~6,2%%fname:~4,2%%fname:~2,2%
If %fdate% GTR %ndate% Move /Y "C:\SLTEST\%fname%" "C:\Finish\"




© OSzone.net 2001-2012