Сравнение значения строки реестра в диапазоне дат - PullRequest
0 голосов
/ 27 августа 2018

Я пишу пакетный скрипт, который должен сравнивать строку значений данных реестра с ± 3 днями текущей даты.

My REG QUERY возвращает значение:

HKEY_LOCAL_MACHINE\Software\Wow6432Node\KasperskyLab\Components\34\1103\1.0.0.0\Statistics\AVState
Protection_BasesDate    REG_SZ    27-08-2018 08-53-00

Мне нужно вывести в файл, в зависимости от того, находится он в пределах диапазона или нет.

Сценарий:

REG QUERY "HKLM\Software\Wow6432Node\KasperskyLab\Components\34\1103\1.0.0.0\Statistics\AVState" /v "Protection_BasesDate" | Find "2018"
IF %ERRORLEVEL% == 1 goto end
If %ERRORLEVEL% == 0 goto makefile

:makefile
echo "{"product":"Override Antivirus","running":true,"upToDate":true}" > c:\ProgramData\CentraStage\AEMAgent\antivirus.json

:end
@exit

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Это решение принимает этот ответ за основу, поэтому, пожалуйста, просмотрите такой ответ, прежде чем публиковать дополнительные вопросы здесь ...

@echo off
setlocal EnableDelayedExpansion

rem Define the "Date to Julian Day Number" conversion function
set "DateToJDN(YMD)=( a=(YMD), y=a/10000, a%%=10000, m=a/100, d=a%%100, a=(m-14)/12, (1461*(y+4800+a))/4+(367*(m-2-12*a))/12-(3*((y+4900+a)/100))/4+d-32075 )"

rem Get the JDN of today's date minus/plus 3
for /F "tokens=2 delims==" %%t in ('wmic os get localdatetime /value') do set "dateTime=%%t"
set /A "todayMinus3=!DateToJDN(YMD):YMD=%dateTime:~0,8%!-3, todayPlus3=todayMinus3+6"

reg Get the date from REG QUERY command; the assumed output format is: Protection_BasesDate    REG_SZ    27-08-2018 08-53-00
for /F "tokens=3-5 delims=- " %%a in (
   'REG QUERY "HKLM\Software\Wow6432Node\KasperskyLab\Components\34\1103\1.0.0.0\Statistics\AVState" /v "Protection_BasesDate"'
) do set /A "BasesDate=!DateToJDN(YMD):YMD=%%c%%b%%a!"

if %BasesDate% geq %todayMinus3% if %basesDate% leq %todayPlus3% (
   echo Date in range
)
0 голосов
/ 27 августа 2018

Есть много языков, которые могут работать намного лучше, чем пакетные, но это может быть решением.

@echo off
set day=-3
for /f  "delims=" %%i in ('reg query "HKLM\Software\Wow6432Node\KasperskyLab\Components\34\1103\1.0.0.0\Statistics\AVState" /v Protection_BasesDate" ^| findstr "2018"') do set "regdate=%%i"
for /f "tokens=1-3" %%a in ("%regdate%") do set "actual=%%c"
:check
echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) : d=weekday(s)
echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^& right(100+month(s),2)^& right(100+day(s),2)
for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "result=%%a"
del "%temp%\%~n0.vbs"
set "yyyy=%result:~0,4%"
set "mm=%result:~4,2%"
set "dd=%result:~6,2%"
set "final=%dd%-%mm%-%yyyy%"
echo %final%
if %day% == 1 goto :EOF
if %actual% == %final% (echo Within 3 days!!) else (set /a day+=1 & goto :check)

На самом деле мы получаем дату системы, используя cscript (да, я передаю данные в файл, но вы можете запустить гибрид без временного файла). Затем мы берем даты последних 3 дней и сопоставляем их в формате ключа реестра, если ключ совпадает в течение 3 дней, я просто повторяю Within 3 days! Существует также оператор if, если счетчик дней = 1, я выхожу из сценария, так как мы не хотим идти в будущее и этот цикл навсегда, если счетчик if мы не остановим это где-то.

Если это работает для вас, вы можете просто удалить строку print %final% и заменить эту строку:

if %actual% == %final% (echo Within 3 days!!) else (set /a day+=1 & goto :check)

с этой строкой:

if %actual% == %final% (echo "{"product":"Override Antivirus","running":true,"upToDate":true}" > "c:\ProgramData\CentraStage\AEMAgent\antivirus.json") else (set /a day+=1 & goto :check)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...