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

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

FantomasAnand 03-06-2014 22:32 2359611

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

firstarey 04-06-2014 14:03 2359820

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 2359834

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

firstarey 04-06-2014 15:04 2359850

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 2359852

Цитата:

Цитата FantomasAnand
датазавтрашнегодня »

Рассчитать можно так:
Код:

@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 2359982

Не будем вычислять дату завтрешнего дня - не нужно это. Нам надо переместить файл с датой в имени больше чем сегодняшняя. Если сегодня 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 2360154

Цитата:

Цитата megaloman
Ваш скрипт каждый последний день месяца будет работать криво? »

это было экспресс решение :)
в 4 и 5 сообщениях такого недочета нет.

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

Цитата FantomasAnand
вдруг на сайте не обновили файл DBF и скинет старый »


firstarey 05-06-2014 06:58 2360156

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\"



Время: 02:38.

Время: 02:38.
© OSzone.net 2001-