Date 比较日期范围内的注册表字符串值

Date 比较日期范围内的注册表字符串值,date,batch-file,registry,Date,Batch File,Registry,我正在编写一个批处理脚本,需要将注册表数据值字符串与今天的±3天进行比较 MyREG 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 "HKL

我正在编写一个批处理脚本,需要将注册表数据值字符串与今天的±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

有许多语言可以比batch做得更好,但这可能是一个解决方案

@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获取系统的日期(是的,我将管道传输到文件,但您可以在没有临时文件的情况下运行hybrid),然后我们获取过去3天的日期,并以注册表项的格式进行匹配,如果注册表项在3天内匹配,我只会在3天内回显
还有一个if语句,如果day counter=1,我将退出脚本,因为我们不想进入未来,如果我们不在某个地方停止计数器,这个循环将永远停止

如果它确实适用于您,您只需删除行
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)
这一行:

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)
此解决方案以为基础,所以请在这里发布更多问题之前查看此答案

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

请正确设置您的问题的格式。对不起,请先在此处发布。字符串值不是日期对象,批处理文件如果不使用其他实用程序或语言,则无法轻松地在数据类型之间进行转换,以便进行比较。我当然会考虑使用/撬动<代码> WSH 或 PuthSu壳。但是,如果您运行<代码> CMD.exe < /COD>和类型<代码> ECHOR%日期%<代码>,您的系统上的日期格式是什么?是不是
2018-08-27
?Compo,我会尝试通过powershell实现,但我对它的经验太少了。我在想可能会将密钥输出到一个文件,然后将%date%输出到一个文件,然后进行比较。格哈德,产量为2018年8月27日。但是我有很多系统要检查,所以我不确定所有系统都会给出相同的结果。你认为需要plus3吗?注册表将来会有更新吗?Registru每天都在更新,可能是2天或3天更新一次,最多3天。非常感谢你的帮助!谢谢你!