vkill'blog

“技术本身没有太多价值,掌握了新的思考方式才是真的收获”

p-AviraAntiVirupdateV7_v2.0 (命令行更新小红伞杀毒的病毒库和引擎)

23:59 , vkill
最后更新:2009-05-06   适合版本:小红伞杀毒V7绿色版和安装版
p-AviraAntiVirupdateV_v1.8(代码版):
http://blog.vkill.net/attachment/p-AviraAntiVirupdateV_v1.8(code.rar
p-AviraAntiVirupdateV_v1.8(完整版):
http://blog.vkill.net/attachment/p-AviraAntiVirupdateV_v1.8(all.rar
界面预览
Open in new window


vkill&晓月小红伞V7自动更新实验工具2.0beta5脚本:

@echo off
title ---小红伞V7自动更新实验工具2.0beta5---红伞中国使用者论坛 http://www.avira.org.cn
color 0a
goto :start_
DefaultSrv2: http://dl1.antivir-pe.de/upd
DefaultSrv5: http://dl1.pro.antivir.de/upd
DefaultSrv6: http://dl2.pro.antivir.de/upd
DefaultSrv3: http://dl3.pro.antivir.de/upd
DefaultSrv4: http://dl2.antivir-pe.de/upd
DefaultSrv1: http://dl1.avgate.net/upd
DefaultSrv0: http://avira.vkill.net/upd

:start_
cls
@echo off & setlocal ENABLEDELAYEDEXPANSION
::new
IF EXIST regexc.txt DEL regexc.txt
IF EXIST avirap.txt DEL avirap.txt
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Avira >nul 2>nul /s>regexc.txt
::IF NOT EXIST regexc.txt goto old
type regexc.txt | find "Path">avirap.txt
for /f "usebackq tokens=2*" %%i in (avirap.txt) DO SET AVIRApath=%%j
DEL regexc.txt
DEL avirap.txt
if exist "%AVIRApath%" goto nospl

:old
IF EXIST regexc.txt DEL regexc.txt
IF EXIST avirap.txt DEL avirap.txt
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\H+BEDV" /s>regexc.txt
type regexc.txt | find "Path">avirap.txt
for /f "usebackq tokens=2*" %%i in (avirap.txt) DO SET AVIRApath=%%j
DEL regexc.txt
DEL avirap.txt

:nospl
::set "services=AntiVirservice,AntiVirscheduler,AVEservice,AntiVirmailservice"
set "services=AntiVirservice"
set "w=wget.exe -N -t 3 -T 60"
set "p_1=%cd%"
set "p_2=%AVIRApath%"
set "infofile=vdf.info.gz, specvir-nt.info.gz, engine.info.gz, engine-nt-en.info.gz"
set "path=%path%;%cd%"
md "%temp%\aviraupdate" >nul 2>nul
cd /d "%temp%\aviraupdate" >nul 2>nul
for /f "tokens=*" %%? in ('"dir /b "temp\" 2>nul| sort"') do (set "otemp=%%?")
set "oneself=%~f0"
set "v=%date%%time%"
set "v=%v::=%"
set "v=%v:.=%"
set "v=%v: =%"
md "temp\%v%" >nul 2>nul
md "log\%v%" >nul 2>nul
:---------------------------------------------------------------------
cd.>"log\update_%v%.log"
echo              ----小红伞V7自动更新实验工具2.0beta5---
echo.
echo 原始脚本制作: vkill       测试修改: 晓月       感谢 quay776 的支持
echo 本工具根据 blog.vkill.net/read.php/56.htm 之v7原始脚本1.8 改进制作
echo 学习交流:www.vkill.net,www.avira.org.cn,xiaojinglf.blog.163.com
echo __________________________________________________________________
echo 声明:本工具及其技术仅用于交流学习,任何人将此技术用于任何盈利之目
echo       的将自己承担相关法律责任。请你在测试之后24小时内删除本工具。
echo __________________________________________________________________
::echo 支持文件完整性检查...
set "tools_name=wget.exe;7za.exe;xml.exe;filever.exe"
for %%? in (%tools_name%) do (
if *%%~$PATH:?==* if not exist %%? (
echo     缺失支持文件%%? & >>"log\update_%v%.log" echo 缺失支持文件%%?,请到http://www.vkill.net/tools.html上下载& goto :error
                                  )
                             )

pushd "temp\%v%"
del /f /q "..\%otemp%\*info.gz" >nul 2>nul
copy "..\%otemp%\*.gz" >nul 2>nul
rd /s /q "..\%otemp%" >nul 2>nul

for /l %%? in (1,1,10) do (
    if exist "!p_%%?!\avscan.exe" (set "p=!p_%%?!" & goto :findpok)
                      )
:findpok
if not defined p (

    for /f "tokens=3* delims= " %%a in ('"sc qc AntiVirservice|findstr /i "BINARY_PATH_NAME" 2>nul "') do (set "str_=%%a %%b" )
    if not defined str_ (>>"..\..\log\update_%v%.log" echo 没有找到AntiVir的安装目录 & popd & echo     定位AntiVir安装目录失败 & goto :error)
    for /f "tokens=*" %%? in ('echo !str_!') do (set "str=%%~dp?")
    if not exist "!str!avscan.exe" (>>"..\..\log\update_%v%.log" echo 文件!str!avscan.exe不存在,程序无法继续进行 & popd & echo     定位avscan.exe文件失败 & goto :error)
    set "p=!str!"                
                 )

for /f "tokens=1 delims=:" %%? in ('findstr /N "^=filedownurllist.txt_s=$" "%oneself%"') do (more +%%? "%oneself%" > "1.ct")
for /f "tokens=1 delims=:" %%? in ('findstr /N "^=filedownurllist.txt_e=$" "%oneself%"') do (set/a "a=%%?-1" & more +!a! "%oneself%" > "2.ct")
findstr /V /B /E /G:"2.ct" "1.ct" > "filedownurllist.ct" 2>nul
findstr /i "^DefaultSrv[0-9]:" "%oneself%" | sort > "a.ct" 2>nul ||(>>"..\..\log\update_%v%.log" echo 没有找到升级可用的服务器地址 & popd & echo     定位升级服务器地址失败 & goto :error)


::start notepad.exe "a.ct"
::pause
echo.
echo      温馨提示:您可以“最小化”本窗口,以免影响您做其他工作!
echo __________________________________________________________________
echo %DATE% %TIME:~0,5% 初始化完成……
echo.
echo [1/8]连接到服务器....
for /f "tokens=*" %%? in (a.ct) do (
    set "url1_=%%?" & set "url1=!url1_:*:=!" & set "url1=!url1: =!"
    echo !url1!|findstr /i "^[http|ftp]" >nul 2>nul &&(
        set/p=^    !url1!连接中... <nul
        for %%! in (avgate.net,freeav.net,antivir.de,antivir-pe.de) do (
            echo !url1!|findstr /i "%%!" >nul 2>nul &&(set "master_n=master.idx")
                                                                       )
        if not defined master_n (set "master_n=master.idx.txt")
        for /f "tokens=*" %%? in ('"type "filedownurllist.ct" | findstr /i "!master_n!$" 2>nul"') do (set "url2_=%%?" & set "url2=!url2_:\=/!")
        %w% -o "..\..\log\%v%\wget_!master_n!.log" "!url1!/!url2!" && (set "updateurl=!url1!" & echo ok & goto :down_idx_ok)
        echo.
                                                    )
                                  )
if not defined updateurl (>>"..\..\log\update_%v%.log" echo 网络连接失败,文件master.idx下载不到,请检查网络或现在网络慢,更新不了,请稍候再试 & popd & echo     网络连接失败 & goto :error)
:down_idx_ok
::fc "!master_n!" "..\..\backup\master.idx" >nul 2>nul && (
::    popd & echo 你的数据库是最新的,如想再次验证,删除backup目录再试 & goto :update_ok
::                                                        )
echo.
echo [2/8]配置文件下载....
::del /a/q/f "*.info.gz" >nul 2>nul
for %%? in (%infofile%) do (
    set/p=^    %%~nx?下载中...<nul
    for /f "tokens=*" %%! in ('"type "filedownurllist.ct" | findstr /i "%%?$" 2>nul"') do (set "url2_=%%!" & set "url2=!url2_:\=/!")
    %w% -o "..\..\log\%v%\wget_%%~nx?.log" "%updateurl%/!url2!" &&(echo ok & 7za.exe e -y "%%~nx?" >nul 2>nul )||(echo no &>>"..\..\log\update_%v%.log" echo 重要文件%%~nx?下载或解压失败 & popd & goto :error))
                            )
echo.
echo [3/8]检查文件信息中....
xml.exe val *.info 2>nul|findstr "invalid$" > xmlval.ct
findstr . xmlval.ct >nul 2>nul && (>>"..\..\log\update_%v%.log" echo 下列info文件规范不符合规范,请用官方服务器更新 & type xmlval.ct >>"..\..\log\update_%v%.log" & popd & echo     检测info文件规范失败 & goto :error)
xml.exe sel -t -m "//FILE/NAME|//FILE/FILEMD5|//FILE/ZIPSIZE|//FILE/OS|//FILE/VERSION" -n -v "concat(@value,'')" *.info | more > "b.ct"
>>"b.ct" echo test.txt
set n=0
for /f "tokens=*" %%? in (b.ct) do (
   echo %%~nx?|findstr "^[0-9a-zA-Z]*\.[a-zA-Z]*$" >nul 2>nul&& (
       set n=0 & (if defined filemd5 ( >>"fileinfo.ct" echo !name!_!filemd5!_!zipsize!_!os!_!version! & set "version=" )) & set "name=%%?"
                                                    ) || (
           set/a n+=1
           if !n!==1 set "filemd5=%%?"
           if !n!==2 set "zipsize=%%?"
           if !n!==3 set "os=%%?"
           if !n!==4 set "version=%%?"
                                                          )
                                        )
cls
echo [4/8]查询所需更新文件...
cd.>needupdate.ct
cd.>needviewver.ct
for /f "tokens=1-5 delims=_" %%a in (fileinfo.ct) do (
    if not exist "!p!\%%~nxa" (echo     %%~a 0 ^< %%e 需要更新[文件不存在] & >>needupdate.ct echo %%~a_%%c_%%e_!p!) else (
        if /i %%~xa==.vdf (>>needviewver.ct echo %%~a_%%~b_%%~c_%%~d_%%e_!p!) else (
            for /f "tokens=4 delims= " %%? in ('filever /a /d "!p!\%%~a"') do (
                for /f "tokens=1-4 delims=." %%l in ('echo %%?') do (set/a ver1=%%l*1000000+%%m*10000+%%n*100+%%o)
                for /f "tokens=1-4 delims=." %%l in ('echo %%e') do (set/a ver2=%%l*1000000+%%m*10000+%%n*100+%%o)
                if !ver1! lss !ver2! (echo     %%~a %%? ^< %%~e 需要更新 & >>needupdate.ct echo %%~a_%%c_%%e_!p!) else (echo     %%~nxa %%? ^>= %%~e 不需要更新)
                                                                              )
                                                                                          )
                                                                           )
                                                       )

for /f "tokens=1-6 delims=_" %%a in (needviewver.ct) do (
    for /f "tokens=2 delims= " %%? in ('"type "%%~f\%%~nxa"|findstr /i "^version:" 2>nul "') do (
        for /f "tokens=1-4 delims=." %%l in ('echo %%?') do (set/a ver1=%%l*1000000+%%m*10000+%%n*100+%%o)
        for /f "tokens=1-4 delims=." %%l in ('echo %%e') do (set/a ver2=%%l*1000000+%%m*10000+%%n*100+%%o)
        if !ver1! lss !ver2! (echo     %%~nxa %%? ^< %%~e 需要更新 & >>needupdate.ct echo %%~a_%%c_%%e_!p!) else (echo     %%~nxa %%? ^>= %%~e 不需要更新)
                                                                                              )
                                                           )

findstr . needupdate.ct >nul 2>nul ||( popd & echo 你的引擎和病毒库已经是最新的 & goto :update_ok )

echo.
echo 需要更新的文件列表如下:
echo __________________________________
echo   FileName    ZipSize    Version
echo __________________________________
for /f "tokens=1-3 delims=_" %%a in (needupdate.ct) do (
    echo %%~nxa   %%b   %%c
                                                       )
echo __________________________________
ping -n 2 127.1 >nul 2>nul
echo.
echo [5/8]正在下载所需更新,请耐心等待....
echo.
echo 提示:如下载时间过长,可关闭升级,另选时间更新,一般早晨速度最快!
echo.
set maxn=0
for /f "tokens=*" %%? in ('type "needupdate.ct"') do (set/a maxn+=1)
for /f "tokens=1 delims=_" %%a in (needupdate.ct) do (
    set/a n+=1
    set/p=    [!n!/!maxn!]文件%%~nxa下载中...<nul
    
    for /f "tokens=*" %%? in ('"type "filedownurllist.ct" | findstr /i "%%~a.gz$" 2>nul"') do (
        set "str=%%?" & set "url="%updateurl%/!str:\=/!""
                                                                                               )
    %w% -o "..\..\log\%v%\wget_%%~nxa.log" "!url!" &&(echo ok)||(echo no & set "error=vkill" & >>"..\..\log\update_%v%.log" echo 文件%%~nxa下载失败,具体查看日志"log\%v%\wget_%%~nxa.log")
                                                        )

if defined error (goto :error)
echo.
echo [6/8]停止服务中....
for %%a in (%services%) do (
    sc query %%a |findstr /i "RUNNING" >nul 2>nul && (
        net stop %%a >nul 2>nul ||(set "error=vkill" & >>"..\..\log\update_%v%.log" echo 停止服务%%a失败)
        ping -n 3 127.1 >nul 2>nul
                                              )
                            )
if defined error (goto :error)
echo.
echo [7/8]更新文件中....
set n=0
for /f "tokens=1-4 delims=_" %%a in ('type "needupdate.ct"') do (
    set/a n+=1
    set/p=    [!n!/!maxn!]文件%%~nxa安装中...<nul
    7za.exe e -y "%%~nxa.gz" >nul 2>nul
    move /y "%%~nxa" "%%~d" >nul 2>nul && (echo ok) ||(echo no & set "error=vkill" & >>"..\..\log\update_%v%.log" echo 文件%%~nxa覆盖失败)
                                                       )
echo.
echo [8/8]启动服务中....
for %%a in (%services%) do (
    sc query %%a |findstr /i "STOPPED" >nul 2>nul && (
        net start %%a >nul 2>nul ||(set "error=vkill" & >>"..\..\log\update_%v%.log" echo 开启服务%%a失败)
        ping -n 1 127.1 >nul 2>nul
                                              )
                            )
if defined error (goto :error)
:update_ok
call :del_ok
echo __________________________________________________________________
set/p=更新完成,3秒后自动退出...<nul
ping -n 4 127.1 >nul 2>nul
::exit/b
del /f /q "%AVIRApath%*.bat" >nul 2>nul
del %0
:---------------------------------------------------------------------

:error
call :del_no
echo __________________________________________________________________
echo
echo 更新未完成 >>"..\..\log\update_%v%.log"
set/p=更新未完成,3秒后自动退出...<nul
ping -n 4 127.1 >nul 2>nul
::exit/b
del /f /q "%AVIRApath%*.bat" >nul 2>nul
del %0
goto :eof

:del_ok
::del /f/q ..\..\temp\%v%\*.idx >nul 2>nul
::del /f/q ..\..\temp\%v%\*.idx.txt >nul 2>nul
::del /f/q ..\..\temp\%v%\*.ct >nul 2>nul
::del /f/q ..\..\temp\%v%\*.info >nul 2>nul
::del /f/q ..\..\temp\%v%\*.gz >nul 2>nul
rd /q /s "%temp%\aviraupdate\temp" >nul 2>nul
goto :eof

:del_no
del /f/q ..\..\temp\%v%\*.idx >nul 2>nul
del /f/q ..\..\temp\%v%\*.idx.txt >nul 2>nul
del /f/q ..\..\temp\%v%\*.ct >nul 2>nul
del /f/q ..\..\temp\%v%\*.info >nul 2>nul
del /f/q ..\..\temp\%v%\*info.gz >nul 2>nul
::del /f/q ..\..\temp\%v%\*.gz >nul 2>nul
goto :eof

=filedownurllist.txt_s=
idx\master.idx
idx\master.idx.txt
idx\vdf.info.gz
idx\specvir-nt.info.gz
idx\engine.info.gz
idx\engine-nt-en.info.gz
engine\nt\avpack32.dll.gz
engine\avewin32.dll.gz
engine\unacev2.dll.gz
engine\nt\avrep.dll.gz
vdf\antivir0.vdf.gz
vdf\antivir1.vdf.gz
vdf\antivir2.vdf.gz
vdf\antivir3.vdf.gz
=filedownurllist.txt_e=
::



1.8代码:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::p-AviraAntiVirupdateV.cmd
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: p-AviraAntiVirupdateV_v1.8
::
::    Code  by : vkill         Thanks to quay776
::    出    处 : http://www.vkill.net , http://www.avira.org.cn/bbs , http://bbs.cn-dos.net
::    功    能 : 命令行更新小红伞杀毒的病毒库和引擎
::    原    理 : 和小红伞杀毒自带的更新差不多,先下载info文件提取里面的文件名后比对版本,版本低的下载覆盖安装即可
::    最后更新 : 2008-02-24 02:00
::    适合系统 : windows xp/2003
::    适合版本 : Avira AntiVir   C版/P版/W版
::    程序依赖文件:wget.exe ; filever.exe ; xml.exe (xmlstarlet); 7za.exe
::                 如依赖文件不全请手动到http://www.vkill.net/tools.html上下载到windows目录
::    升级记录 : v1.0 (20080216)
::               实现了基本的更新
::               每次更新顺利完成的时候记录下当次的master.idx文件,下次再次更新先fc比对master.idx文件,如不同才下载info文件的,比自带的更新要好我觉得
::               只可以更新c版
::               默认连接的是c版的更新服务器
::               比对文件是否有新版本是比对md5
::               v1.6 (20080220)
::               修改了更新的过程,使得更像红伞自带更新,修改了界面,看起来更漂亮
::               增加了更新p版和w版的功能
::               修改默认连接的是p版的更新服务器,更新的速度有了成倍的增快
::               修改比对文件是否有更新改为了比对版本,因为在测试1.0版的时候发现最新病毒库官方公布的md5和实时下载到文件的md5有出入
::               增加了记录日志的功能,方便以后查看
::               增加了检测info文件是否符合xml规范的功能,不过我测试了好多觉得没有什么用,但毕竟是一种方法,先记下来再说
::               增加了自动复制上次下载到的*.gz的功能,这样的好处是当你上次好不容易下载到了所有的所需升级的文件因为种种原因没有能正常更新的话,这次更新的话是不需要重复下载的,这点比自带的更新要好很多
::               增加可自定义更新服务器的功能,这样用户就可以在内网架设服务器来更新了
::               增加动态查找红伞各版本的安装目录功能,是按照查找服务配置找出安装目录后查看有无avscan.exe来定位的,因为后面本程序要用到avscan.exe,当然你要用的是绿色版本的话也可以自定义安装路径
::               解决了因w版和p版设置密码保护后忘记密码而无法重新配置的问题,解决方法:直接删除配置文件或替换加密的密码字符串
::               解决了病毒库文件无法用filever.exe查出的问题,是在看更新日志的过程中发现扫描报告里面有显示病毒库的版本
::               已知Bug1:w版的邮件监控服务做不到停止后再次恢复,原因不明中,p版没有条件测试
::               v1.7 (20080220)
::               增加可自定义绿色版本路径来更新的功能
::               修正查vdf文件版本方法为直接读取vdf文件,可加快更新速度,还可避免w版安装的时候修改了默认安装目录的而无法检测vdf版本的问题
::               增加下载*.info.gz文件前先删除上次的旧的
::               去掉新建backup目录
::               修改临时文件全部存放到 %temp%\aviraupdate 目录
::               v1.8 (20080224)
::               修正因wget加-c参数导致下载到的文件md5值不合适
::               增加清理垃圾的功能
::               取消改名AVWIN.INI的动作
::               加入检查当前路径是否是主程序目录的功能
::               增加可下载ftp上的文件来更新
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::绿色版特别修改处
::如你的是绿色版本,那么请修改变量 p_绿 为你绿色版杀毒的路径,或者把这个程序放到你绿色版的主目录下
set "p_绿=e:\software\小红伞杀毒"
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto :start_
::更新服务器的地址列表,按上下顺序测试是否可以连接的,所以你用的时候把快的排在前面吧
;p版默认
DefaultSrv0:  http://dl1.pro.antivir.de/upd
DefaultSrv0:  http://dl2.pro.antivir.de/upd
DefaultSrv0:  http://dl3.pro.antivir.de/upd
;s版默认
DefaultSrv0:  http://dl1.antivir-pe.de/upd
DefaultSrv0:  http://dl2.antivir-pe.de/upd
;c版默认
DefaultSrv0:  http://dl1.avgate.net/upd
;自己架设的(测试用)
DefaultSrv0:  http://avira.vkill.net/upd
;我在本机本地测试的
;注意在本机本地测试的话http服务器最好用hfs.exe来搭建,ftp服务器最好用SlimFTPd.exe来搭建
DefaultSrv0:  http://127.0.0.1:8080/wwwroot/upd
DefaultSrv0:  ftp://admin:123456@127.0.0.1:22/wwwroot/upd

:start_
cls
@echo off & setlocal ENABLEDELAYEDEXPANSION
::程序变量
set "services=AntiVirservice,AntiVirscheduler,AVEservice,AntiVirmailservice"
set "processes=avscan.exe;sched.exe;avesvc.exe;avguard.exe"
set "w=wget.exe -N -t 3 -T 120"
::各版本红伞的默认安装路径,最后的\一定不要加
set "p_0=%cd%"
set "p_1=C:\Program Files\Avira\AntiVir PersonalEdition Classic"
set "p_2=C:\Program Files\Avira\AntiVir PersonalEdition Premium"
set "p_3=C:\Program Files\Avira\AntiVir Workstation"
set "p_4=C:\Program Files\AntiVir PersonalEdition Classic"
set "p_5=C:\Program Files\AntiVir PersonalEdition Premium"
set "p_6=C:\Program Files\AntiVir Workstation"
set "p_7=%p_绿%"
::存放info信息的各文件
set "infofile=vdf.info.gz, specvir-nt.info.gz, engine.info.gz, engine-nt-en.info.gz"
::程序开始的一些动作
::如果没有readme.txt则自动生成一个
if not exist "readme.txt" (
    call :echo_readme
    echo 手动关闭readme.txt文件后程序继续运行
    start /wait notepad.exe "readme.txt"
                          )
set "path=%path%;%cd%"
md "%temp%\aviraupdate" >nul 2>nul
cd /d "%temp%\aviraupdate" >nul 2>nul
for /f "tokens=*" %%? in ('"dir /b "temp\" 2>nul| sort"') do (set "otemp=%%?")
set "oneself=%~f0"
set "v=%date%%time%"
set "v=%v::=%"
set "v=%v:.=%"
set "v=%v: =%"
md "temp\%v%" >nul 2>nul
md "log\%v%" >nul 2>nul
:---------------------------------------------------------------------
cd.>"log\update_%v%.log"
echo.
echo p-AviraAntiVirupdateV_v1.8  by:vkill      Thanks to quay776
echo ___________________________________________________________

echo 依赖文件完整性检查...
set "tools_name=wget.exe;7za.exe;xml.exe;filever.exe"
for %%? in (%tools_name%) do (
if *%%~$PATH:?==* if not exist %%? (
echo     缺失依赖文件%%? & >>"log\update_%v%.log" echo 缺失依赖文件%%?,请到http://www.vkill.net/tools.html上下载& goto :error
                                  )
                             )
                            
pushd "temp\%v%"
::先把最后一次未完成更新的*.gz复制到本目录,这样防止上次更新失败后重复下载文件
copy "..\%otemp%\*.gz" >nul 2>nul

::定位小红伞的安装目录
for /l %%? in (1,1,10) do (
    if exist "!p_%%?!\avscan.exe" (set "p=!p_%%?!")
                      )
if not defined p (
    ::查找AntiVir的安装目录
    for /f "tokens=3* delims= " %%a in ('"sc qc AntiVirservice|findstr /i "BINARY_PATH_NAME" 2>nul "') do (set "str_=%%a %%b" )
    if not defined str_ (>>"..\..\log\update_%v%.log" echo 没有找到AntiVir的安装目录,你可能安装的是绿色版本,请编辑本cmd某些变量再使用 & popd & echo     定位AntiVir安装目录失败 & goto :error)
    for /f "tokens=*" %%? in ('echo !str_!') do (set "str=%%~dp?")
    if not exist "!str!avscan.exe" (>>"..\..\log\update_%v%.log" echo 文件!str!avscan.exe不存在,程序无法继续进行 & popd & echo     定位avscan.exe文件失败 & goto :error)
    set "p=!str!"                
                 )
::生成文件的总下载地址文件
for /f "tokens=1 delims=:" %%? in ('findstr /N "^=filedownurllist.txt_s=$" "%oneself%"') do (more +%%? "%oneself%" > "1.ct")
for /f "tokens=1 delims=:" %%? in ('findstr /N "^=filedownurllist.txt_e=$" "%oneself%"') do (set/a "a=%%?-1" & more +!a! "%oneself%" > "2.ct")
findstr /V /B /E /G:"2.ct" "1.ct" > "filedownurllist.ct" 2>nul

::列出更新服务器地址
findstr /i "^DefaultSrv[0-9]:" "%oneself%" > "a.ct" 2>nul ||(>>"..\..\log\update_%v%.log" echo 没有找到升级服务器地址,请编辑本cmd定义升级服务器地址 & popd & echo     定位升级服务器地址失败 & goto :error)

::测试哪个地址可以连接就用哪个地址
echo 连接服务器测试
for /f "tokens=*" %%? in (a.ct) do (
    set "url1_=%%?" & set "url1=!url1_:*:=!" & set "url1=!url1: =!"
    echo !url1!|findstr /i "^[http|ftp]" >nul 2>nul &&(
        set/p=^    !url1!连接中... <nul
        for %%! in (avgate.net,freeav.net,antivir.de,antivir-pe.de) do (
            echo !url1!|findstr /i "%%!" >nul 2>nul &&(set "master_n=master.idx")
                                                                       )
        if not defined master_n (set "master_n=master.idx.txt")
        for /f "tokens=*" %%? in ('"type "filedownurllist.ct" | findstr /i "!master_n!$" 2>nul"') do (set "url2_=%%?" & set "url2=!url2_:\=/!")
        %w% -o "..\..\log\%v%\wget_!master_n!.log" "!url1!/!url2!" && (set "updateurl=!url1!" & echo ok & goto :down_idx_ok)
        echo.
                                                    )
                                  )
if not defined updateurl (>>"..\..\log\update_%v%.log" echo 网络连接失败,文件master.idx下载不到,请检查网络或现在网络慢,更新不了,请稍候再试 & popd & echo     网络连接失败 & goto :error)
:down_idx_ok
::fc "!master_n!" "..\..\backup\master.idx" >nul 2>nul && (
::    popd & echo 你的数据库是最新的,如想再次验证,删除backup目录再试 & goto :update_ok
::                                                        )

::下载几个info文件,这几个info文件里面有所有文件的信息
echo info文件下载...
::del /a/q/f "*.info.gz" >nul 2>nul
for %%? in (%infofile%) do (
    set/p=^    %%~nx?下载中...<nul
    for /f "tokens=*" %%! in ('"type "filedownurllist.ct" | findstr /i "%%?$" 2>nul"') do (set "url2_=%%!" & set "url2=!url2_:\=/!")
    %w% -o "..\..\log\%v%\wget_%%~nx?.log"  "%updateurl%/!url2!" &&(echo ok & 7za.exe e -y "%%~nx?" >nul 2>nul )||(echo no &>>"..\..\log\update_%v%.log" echo 重要文件%%~nx?下载或解压失败 & popd & goto :error))
                            )

::用xmlstarlet工具对info文件进行处理,得到我们所要的格式
echo 从*.info文件中提取所需信息...
::检测info文件是否是符合规范的
xml.exe val *.info 2>nul|findstr "invalid$" > xmlval.ct
findstr . xmlval.ct >nul 2>nul && (>>"..\..\log\update_%v%.log" echo 下列info文件规范不符合规范,请用官方服务器更新 & type xmlval.ct >>"..\..\log\update_%v%.log" & popd & echo     检测info文件规范失败 & goto :error)
xml.exe sel -t -m "//FILE/NAME|//FILE/FILEMD5|//FILE/ZIPSIZE|//FILE/OS|//FILE/VERSION" -n -v "concat(@value,'')" *.info | more > "b.ct"
>>"b.ct" echo test.txt
set n=0
for /f "tokens=*" %%? in (b.ct) do (
   echo %%~nx?|findstr "^[0-9a-zA-Z]*\.[a-zA-Z]*$" >nul 2>nul&& (
       set n=0 & (if defined filemd5 ( >>"fileinfo.ct" echo !name!_!filemd5!_!zipsize!_!os!_!version! & set "version=" )) & set "name=%%?"
                                                    ) || (
           set/a n+=1
           if !n!==1 set "filemd5=%%?"
           if !n!==2 set "zipsize=%%?"
           if !n!==3 set "os=%%?"
           if !n!==4 set "version=%%?"
                                                          )
                                        )

::比对版本信息后列出需要更新的文件
echo 查看比对版本看是否需要更新...
cd.>needupdate.ct
cd.>needviewver.ct
::先查dll的
for /f "tokens=1-5 delims=_" %%a in (fileinfo.ct) do (
    if not exist "!p!\%%~nxa" (echo     %%~a 0 ^< %%e 需要更新[文件不存在] & >>needupdate.ct echo %%~a_%%c_%%e_!p!) else (
        if /i %%~xa==.vdf (>>needviewver.ct echo %%~a_%%~b_%%~c_%%~d_%%e_!p!) else (
            for /f "tokens=4 delims= " %%? in ('filever /a /d "!p!\%%~a"') do (
                for /f "tokens=1-4 delims=." %%l in ('echo %%?') do (set/a ver1=%%l*4+%%m*3+%%n*2+%%o)
                for /f "tokens=1-4 delims=." %%l in ('echo %%e') do (set/a ver2=%%l*4+%%m*3+%%n*2+%%o)
                if !ver1! lss !ver2! (echo     %%~a %%? ^< %%~e 需要更新 & >>needupdate.ct echo %%~a_%%c_%%e_!p!) else (echo     %%~nxa %%? ^>= %%~e 不需要更新)
                                                                              )
                                                                                          )
                                                                           )
                                                       )
::v1.7版修正为不扫描了,采用直接读取vdf文件查看版本
::再查vdf的,想查vdf的方法想了n久终于找到,哈哈~在扫描日志中就有记载
::所以我们模拟扫描一下在查日志就ok
::set "path=%path%;!p!"
::cd.>test.ct
::>"test.avp" (
::   echo [CFG]
::   echo GuiMode=3
::   echo ExitMode=2
::   echo [SEARCH]
::   echo Parameter=0x00300432
::   echo Path0=%cd%\test.ct
::            )
::start /wait avscan.exe /CFG="%cd%\test.avp"
::for /f "tokens=*" %%? in ('echo !p!') do (set "str=%%~nx?")
::set "logp=%ALLUSERSPROFILE%\Application Data\!str!\LOGFILES"
::for /f "tokens=*" %%? in ('"dir /b "!logp!\*.*" | findstr /i "^avscan" 2>nul |sort "') do (set "logf=%%?")
::for /f "tokens=1-6 delims=_" %%a in (needviewver.txt) do (
::    for /f "tokens=2 delims= " %%? in ('"type "!logp!\!logf!"|findstr /i "%%~nxa" 2>nul "') do (
::        for /f "tokens=1-4 delims=." %%l in ('echo %%?') do (set/a ver1=%%l*4+%%m*3+%%n*2+%%o)
::        for /f "tokens=1-4 delims=." %%l in ('echo %%e') do (set/a ver2=%%l*4+%%m*3+%%n*2+%%o)
::        if !ver1! lss !ver2! (echo     %%~nxa %%? ^< %%~e 需要更新 & >>needupdate.txt echo %%~a_%%c_%%e_!p!) else (echo     %%~nxa %%? ^>= %%~e 不需要更新)
::                                                                                              )
::                                                           )
for /f "tokens=1-6 delims=_" %%a in (needviewver.ct) do (
    for /f "tokens=2 delims= " %%? in ('"type "%%~f\%%~nxa"|findstr /i "^version:" 2>nul "') do (
        for /f "tokens=1-4 delims=." %%l in ('echo %%?') do (set/a ver1=%%l*4+%%m*3+%%n*2+%%o)
        for /f "tokens=1-4 delims=." %%l in ('echo %%e') do (set/a ver2=%%l*4+%%m*3+%%n*2+%%o)
        if !ver1! lss !ver2! (echo     %%~nxa %%? ^< %%~e 需要更新 & >>needupdate.ct echo %%~a_%%c_%%e_!p!) else (echo     %%~nxa %%? ^>= %%~e 不需要更新)
                                                                                              )
                                                           )

findstr . needupdate.ct >nul 2>nul ||( popd & echo 你的数据库是最新的 & goto :update_ok )

::开始下载更新
echo 你需要更新的文件列表如下,3秒后开始自动更新
echo _____________________________________
echo name        zipsize        version
echo _____________________________________
for /f "tokens=1-3 delims=_" %%a in (needupdate.ct) do (
    echo %%~nxa  %%b  %%c
                                                       )
echo _____________________________________
ping -n 4 127.1 >nul 2>nul
echo 下载所需更新...
::计算文件个数
set maxn=0
for /f "tokens=*" %%? in ('type "needupdate.ct"') do (set/a maxn+=1)
for /f "tokens=1 delims=_" %%a in (needupdate.ct) do (
    set/a n+=1
    set/p=    [!n!/!maxn!]文件%%~nxa下载中...<nul
    ::匹配下载地址
    for /f "tokens=*" %%? in ('"type "filedownurllist.ct" | findstr /i "%%~a.gz$" 2>nul"') do (
        set "str=%%?" & set "url="%updateurl%/!str:\=/!""
                                                                                               )
    %w% -o "..\..\log\%v%\wget_%%~nxa.log" "!url!" &&(echo ok)||(echo no & set "error=vkill" & >>"..\..\log\update_%v%.log" echo 文件%%~nxa下载失败,具体查看日志"log\%v%\wget_%%~nxa.log")
                                                        )

::先把配置文件暂时替换下(v1.8已经把这步去掉)
::copy /y "%logp%\..\AVWIN.INI" "%logp%\..\AVWIN.INI.back" >nul 2>nul && (
::    del /a/f/q "%logp%\..\AVWIN.INI" >nul 2>nul) || (>>"..\..\log\update_%v%.log" echo 由于w版和p版可设置停止进程需密码,所以这次更新有可能不成功)
::                                                                       )
echo 停止服务中...
for %%a in (%services%) do (
    sc qc %%a |findstr "1060:" >nul 2>nul || (
        ::sc config %%a start= disabled >nul 2>nul
        sc stop %%a >nul 2>nul ||(>>"..\..\log\update_%v%.log" echo 停止服务%%a失败)
        ping -n 2 127.1 >nul 2>nul
                                              )
                            )
echo 结束进程中...
for %%? in (%processes%) do (
    tasklist|findstr /i "^%%?" >nul 2>nul &&(
        taskkill /f /im "%%?" >nul 2>nul ||(>>"..\..\log\update_%v%.log" echo 结束进程%%?失败)
                                            )
                            )
echo 安装更新中...
set n=0
for /f "tokens=1-4 delims=_" %%a in ('type "needupdate.ct"') do (
    set/a n+=1
    set/p=    [!n!/!maxn!]文件%%~nxa安装中...<nul
    7za.exe e -y "%%~nxa.gz" >nul 2>nul
    move /y "%%~nxa" "%%~d" >nul 2>nul && (echo ok) ||(echo no & set "error=vkill" &  >>"..\..\log\update_%v%.log" echo 文件%%~nxa覆盖失败)
                                                       )
echo 开启服务中...
for %%a in (%services%) do (
    sc qc %%a |findstr "1060:" >nul 2>nul || (
        ::sc config %%a start= auto >nul 2>nul
        sc start %%a >nul 2>nul ||(>>"..\..\log\update_%v%.log" echo 开启服务%%a失败)
        ping -n 2 127.1 >nul 2>nul
                                              )
                            )
::再把配置文件替换回来(v1.8已经去掉这步)
::copy /y "%logp%\..\AVWIN.INI.back" "%logp%\..\AVWIN.INI" >nul 2>nul
popd
::if not defined error (copy "temp\%v%\!master_n!" "backup\master.idx" >nul 2>nul)

:update_ok
call :del_ok
echo ___________________________________________________________
set/p=更新完成,3秒后自动退出...<nul
ping -n 4 127.1 >nul 2>nul
findstr . "log\update_%v%.log" >nul 2>nul && (start notepad.exe "log\update_%v%.log")
exit/b
:---------------------------------------------------------------------

:error
call :del_no
echo ___________________________________________________________
echo 
>>"log\update_%v%.log" echo 更新未完成
set/p=更新未完成,3秒后自动退出...<nul
ping -n 4 127.1 >nul 2>nul
start notepad.exe "log\update_%v%.log"
exit/b
goto :eof

:del_ok
del /a/f/q temp\%v%\*.idx >nul 2>nul
del /a/f/q temp\%v%\*.idx.txt >nul 2>nul
del /a/f/q temp\%v%\*.ct >nul 2>nul
del /a/f/q temp\%v%\*.info >nul 2>nul
del /a/f/q temp\%v%\*.gz >nul 2>nul
goto :eof

:del_no
::当失败安装时不删除*.gz文件
del /a/f/q temp\%v%\*.idx >nul 2>nul
del /a/f/q temp\%v%\*.idx.txt >nul 2>nul
del /a/f/q temp\%v%\*.ct >nul 2>nul
del /a/f/q temp\%v%\*.info >nul 2>nul
::del /a/f/q temp\%v%\*.gz >nul 2>nul
goto :eof

:echo_readme
            (
    echo 请先阅读帮助文件:
    echo 介绍:
    echo 命令行更新小红伞杀毒的病毒库和引擎,适合于小红伞杀毒V7 C版/P版/W版
    echo 在使用本更新工具更新的时候请先退出扫描程序
    echo 最新版本请关注 http://blog.vkill.net
    echo 如提示你依赖文件不全请到http://www.vkill.net/tools.html下载
    echo 经过反复测试,w版的邮件监控服务做不到停止后再次恢复,原因不明中,算是已知的一个bug吧
             ) >"readme.txt"
goto :eof
::文件filedownurllist
=filedownurllist.txt_s=
idx\master.idx
idx\master.idx.txt
idx\vdf.info.gz
idx\specvir-nt.info.gz
idx\engine.info.gz
idx\engine-nt-en.info.gz
engine\nt\avpack32.dll.gz
engine\avewin32.dll.gz
engine\unacev2.dll.gz
engine\nt\avrep.dll.gz
vdf\antivir0.vdf.gz
vdf\antivir1.vdf.gz
vdf\antivir2.vdf.gz
vdf\antivir3.vdf.gz
=filedownurllist.txt_e=
::


Last modified by vkill on2009/05/06 20:14
类别:cmd script | Tags: , , , , | 0 条评论, 2725 次阅读
网友评论(0):
发表评论:

Nickname: 
Email:
Site URI: