Показать полную графическую версию : Проверка по названию файлов с расширением 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"
датазавтрашнегодня »
Рассчитать можно так:@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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.