Компьютерный форум 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=271471)

FessAectan 06-11-2013 15:55 2248534

Скрипт сравнения дат. Непонятный вывод на консоли.
 
Вложений: 1
Приветствую!
Есть вот такой скрипт
Код:

setlocal enabledelayedexpansion

set /p dateofnod32=<C:\Users\FessAectan\Documents\dateofversion.txt

set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%
set datenow=%year%%month%%day%
set /a diff=%datenow%-%dateofnod32%

echo %diff% 
pause

Вроде бы отрабатывает, но меня смущает то, что(как видно на скрине) строка
Код:

set /p dateofnod32=<C:\Users\FessAectan\Documents\dateofversion.txt
при выполнении превращается в
Код:

set /p dateofnod32=0<C:\Users\FessAectan\Documents\dateofversion.txt
Подскажите как убрать этот 0

Petya V4sechkin 06-11-2013 16:43 2248561

Цитата:

Цитата FessAectan
Вроде бы отрабатывает

Тогда в чем проблема? :)

Цитата:

Цитата FessAectan
как убрать этот 0

Ноль в данном случае - просто номер потока ввода, неявно заданный при указании символа < (не обращайте внимания, он же не попадает в значение переменной).

FessAectan 06-11-2013 16:55 2248570

Задача стояла такая:
Мониторить в Zabbix актуальность антивирусных баз NOD32.
В первом варианте сделал таким образом, что скрипт в планировщике пишет в файл цифру-разницу между текущей датой и датой последнего обновления, Zabbix потом через UserParameter эту цифру забирает и обрабатывает.
Все таки удалось(пусть и местами коряво) получить эту цифру сразу в Zabbix путем подстановки в UserParameter пути к bat файлу.
Скрипт, в итоге, выглядит так

Код:

@echo off
cd /d c:\zabbix_209
setlocal enabledelayedexpansion
CHCP 1251 > Nul
For /F "Tokens=2*" %%a In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Info"^
|Find /I "ScannerVersion"') Do Set DPath=%%b
echo %DPath% | gawk.exe "{print $2}"| tr.exe -d "()" > c:\zabbix_209\dateofversion.txt
For /F "usebackq" %%a In (`cat.exe c:\zabbix_209\dateofversion.txt`) do set dateofnod32=%%a
set day=%DATE:~0,2%
set month=%DATE:~3,2%
set year=%DATE:~6,4%
set datenow=%year%%month%%day%
set /a diff=%datenow%-%dateofnod32%
CHCP 866  >  Nul
echo %diff% 
exit /b

UserParameter вот такой
Код:

UserParameter=statenod32updates_v1, c:\zabbix_209\checknod32updates_v1.bat
Воркает вроде бы :)
Код:

root@zabbix:~# zabbix_get -s 10.189.223.13 -p 10053  -k statenod32updates_v1
1

ps
как раз таки 0 мешал напрямую в Zabbix'е забрать цифру, говорил мол
Код:

C:\zabbix_209>set /p dateofnod32= 0<c:\zabbix_209\dateofversion.txt
Открытие дескриптора невозможно в процессе
перенаправления дескриптора 0.

и так далее, т.е. скрипт не так как нужно отрабатывал

FessAectan 11-11-2013 12:47 2251915

Переделал скрипт, для того чтобы точно определять количество дней(разницу между последним обновлением и текущей датой)
Код:

@ECHO OFF
SetLocal EnableDelayedExpansion
set "YEARBEGIN=1970"
set "YEAR=%date:~6,4%"
set /a "DAY=1%date:~,2%-100"
set /a "MONTH=1%date:~3,2%-100"

set /a "HOUR=1%time:~,2%-100"
set /a "MIN=1%time:~3,2%-100"
set /a "SEC=1%time:~6,2%-100"
set /a "TOTALSEC=0"



For /F "Tokens=2*" %%a In ('Reg Query "HKEY_LOCAL_MACHINE\SOFTWARE\ESET\ESET Security\CurrentVersion\Info"^
|Find /I "ScannerVersion"') Do Set DPath=%%b
echo %DPath% | gawk.exe "{print $2}"| tr.exe -d "()" > c:\zabbix_209\dateofversion.txt
For /F "usebackq" %%a In (`cat.exe c:\zabbix_209\dateofversion.txt`) do set dateofnod32=%%a

set /a "YEARNOD=%dateofnod32:~0,4%"
set /a "DAYNOD=1%dateofnod32:~6,2%-100"
set /a "MONTHNOD=1%dateofnod32:~4,2%-100"
set HOURNOD=11
set MINNOD=15
set SECNOD=15

rem Инициализация таблиц длин месяцев
rem        1  2  3  4  5  6  7  8  9  10 11 12
set "regul=31 28 31 30 31 30 31 31 30 31 30 31"
set "visok=31 29 31 30 31 30 31 31 30 31 30 31"
 
call:date2timestamp %YEAR% %MONTH% %DAY% %HOUR% %MIN% %SEC%
set val1=%TOTALSEC%
call:date2timestamp %YEARNOD% %MONTHNOD% %DAYNOD% %HOURNOD% %MINNOD% %SECNOD%
set val2=%TOTALSEC%
set /a "resultat=(%val1%-%val2%)/86400"
echo %resultat%

rem call :timestamp2date %TOTALSEC%
rem echo %DAY%.%MONTH%.%YEAR% %HOUR%:%MIN%:%SEC%
rem exit
exit /b
 
rem перевести секунды в дату
rem %1 - timestap время в секундах с 01.01.%YEARBEGIN%
rem Возврат в переменных YEAR, MONTH, DAY, HOUR, MIN, SEC
:timestamp2date
set "TT=%1"
set /a "SEC=TT%%60"
set /a "TT=(TT-SEC)/60"
set /a "MIN=TT%%60"
set /a "TT=(TT-MIN)/60"
set /a "HOUR=TT%%24"
set /a "TT=(TT-HOUR)/24"
set /a "YEAR=TT/365"
set /a "TT-=YEAR*365"
set /a "YEAR=YEAR+YEARBEGIN"
for /l %%i in (%YEARBEGIN%,1,%YEAR%) do (
    call:isleap %%i
    set /a "TT-=LEAP"
)
set /a "TT+=LEAP"
set "MONTH=1"
if %LEAP% equ 1 (set "mdays=%visok%") else (set "mdays=%regul%")
for %%i in (%mdays%) do (
    if %%i gtr !TT! goto:step3
    set /a "TT-=%%i"
    set /a "MONTH+=1"
)
:step3
set /a "DAY=TT+1"
set "TT="
exit /b
 
rem перевести дату в секунды
rem %1 - год (4 знака), %2 - месяц (1-12) %3 - день (1-31) %4 - часы (0-23) %5 - минуты (0-59) %6 - секунды (0-59)
:date2timestamp
rem yearsecs=31536000 HOURSSEC=3600 daysecs=86400
set /a "TOTALSEC=(%1-YEARBEGIN)*31536000"
for /l %%i in (%YEARBEGIN%;1;%1) do (
    call:isleap %%i
    if !LEAP! equ 1 set /a "TOTALSEC+=86400"
)
call:isleap %1
if %LEAP% equ 1 (call:month2sec "%visok%" %2) else (call:month2sec "%regul%" %2)
set /a "TOTALSEC+=(%3-1)*86400"
set /a "TOTALSEC+=%4*3600"
set /a "TOTALSEC+=%5*60+%6"
exit /b
 
rem определяет високосность года
rem Если год точно делится на 4, но не делится на 100 или если он точно делится на 400
rem function isleap(year)
rem возврат в переменной LEAP=1 - год высокосный, иначе - 0
:isleap
set "LEAP=0"
set /a "L1=%1%%4"
set /a "L2=%1%%100"
set /a "L3=%1%%400"
if %L1% equ 0 if %L2% neq 0 set "LEAP=1"
if %L3% equ 0 set "LEAP=1"
set L1=
set L2=
set L3=
exit /b
 
rem %1 - массив regul или visok, %2 - текущий месяц
:month2sec
set /a "COUNT=1"
for %%i in (%~1) do (
    if !COUNT! LSS %2 set /a "TOTALSEC+=%%i*86400"
    set /a "COUNT+=1"
)
set COUNT=
exit /b

за скрипт перевода в секунды спасибо товарищу res2001
http://forum.ru-board.com/topic.cgi?...&limit=1&m=1#1


Время: 16:10.

Время: 16:10.
© OSzone.net 2001-