Board logo

标题: 如何用批处理来实现这个功能 [打印本页]

作者: tclshx     时间: 2006-7-6 11:19    标题: 如何用批处理来实现这个功能

我用的是一正版瑞星,想制作瑞星杀毒用的IMG文件,关键是提取RISING\RAV中的病毒库文件,病毒库文件为:8个def文件(VirBoot.def、VIRCOM.def、VirInfo.def、VirMacr.def、VirMZ.def、VirNorm.def、VirPe.def、VirSct.def),15个dll文件(engine.dll、extFile.dll、ExtMail.dll、ExtOLE.dll、libload.dll、RsStore.dll、ScanEX.dll、ScanExec.dll、ScanMac.dll、ScanSct.dll、slang936.dll、UnExe.dll、vdp.dll、、VirusLib.dll、Zip.DLL)
还有一个virusdb.cfg文件,且要根据virusdb.cfg文件的内容(每升级一次,内容中的日期和版本号会不同)创建一个Version.inf文件。
在此我列出06年6月26日升级后的virusdb.cfg的内容
[SUMMARY]
FILECOUNT=13
ENGINEVER=17.00.00.36
VIRDEFVER=18.32.42.00
VIRDEFUPDATEDATE=2006-06-23

[FILES]
COM=VirCom.def
MZ=VirMZ.def
PE=VirPe.def
MACRO=VirMacr.def
SCRIPT=VirSct.def
NORMAL=VirNorm.def
BOOT=VirBoot.def
ELF=VirElf.def
INFO=VirInfo.def
MEM=SysMem.def
PTLIB=Posttrt.def
WLLIST=wllib.def
NVLIST=nvlib.def

[PLUGINS]
INFO=VirusLib.dll
MEM=VirusLib.dll
PTLIB=VirusLib.dll
WLLIST=VirusLib.dll
NVLIST=VirusLib.dll
再列出根据VIRUSDB.CFG手工创建的VERSION.INF的内容
[Version]
VersionNo=18.32.42
UpdateDate=2006-06-23

   VERSION.INF文件是用来显示版本号的。每次都要手工创建VERSION.INF,很麻烦,想通过批处理来实现,哪位好心人帮一下忙!

以下是我放在RISING目录下用来提取病毒文件的批处理,只需在后面加上创建VERSION.INF文件的功能就行了。创建的VERSION.INF也要在001目录中。
MD 001
COPY /Y .\Rav\VirBoot.def .\001
COPY /Y .\Rav\VirCom.def .\001
COPY /Y .\Rav\VirInfo.def .\001
COPY /Y .\Rav\VirMacr.def .\001
COPY /Y .\Rav\VirMZ.def .\001
COPY /Y .\Rav\VirPe.def .\001
COPY /Y .\Rav\VirSct.def .\001
COPY /Y .\Rav\ENGINE.DLL .\001
COPY /Y .\Rav\EXTFILE.DLL .\001
COPY /Y .\Rav\EXTMAIL.DLL .\001
COPY /Y .\Rav\EXTOLE.DLL .\001
COPY /Y .\Rav\LIBLOAD.DLL .\001
COPY /Y .\Rav\RsStore.dll .\001
COPY /Y .\Rav\ScanEx.dll .\001
COPY /Y .\Rav\SCANEXEC.DLL .\001
COPY /Y .\Rav\SCANMAC.DLL .\001
COPY /Y .\Rav\SCANSCT.DLL .\001
REM COPY /Y .\Rav\sLang936.dll .\001
COPY /Y .\Rav\Unexe.dll .\001
COPY /Y .\Rav\VDP.DLL .\001
COPY /Y .\Rav\VirusLib.dll .\001
COPY /Y .\Rav\ZIP.DLL .\001
COPY /Y .\Rav\VirNorm.def .\001
COPY /Y .\Rav\VIRUSDB.CFG .\001

[ Last edited by tclshx on 2006-7-6 at 11:39 ]
作者: bagpipe     时间: 2006-7-6 12:49
@echo off
setlocal
for /f "tokens=2 delims==" %%a in ('findstr /c:"VIRDEFVER" /c:"VIRDEFUPDATEDATE" virusdb.cfg') do (
if defined a (set b=%%a) else set a=%%a
)
echo [Version]>.\001\VERSION.INF
echo VersionNo=%a:~0,-3%>>.\001\VERSION.INF      
echo UpdateDate=%b%>>.\001\VERSION.INF



@echo off
setlocal
for /f "tokens=2 delims==" %%a in ('findstr "VIRDEFVER VIRDEFUPDATEDATE" virusdb.cfg') do (
if defined a (set b=%%a) else set a=%%a
)
echo [Version]>.\001\VERSION.INF
echo VersionNo=%a:~0,-3%>>.\001\VERSION.INF      
echo UpdateDate=%b%>>.\001\VERSION.INF


两种应该都可以,就是搜索那改变了一下...........
作者: fastslz     时间: 2006-7-6 13:35
@echo off
set Version=VIRDEFVER
find /i virusdb.cfg "%Version%"
if not errorlevel 1 set Version=VersionNo
for /F "tokens=1 delims=VIRDEFVER " %%A in ('find /i .\Rav\virusdb.cfg "VIRDEFVER"') do set No=%%A
for /F "tokens=1 delims=VIRDEFUPDATEDATE " %%B in ('find /i .\Rav\virusdb.cfg "VIRDEFUPDATEDATE"') do set DATENO=%%B
echo [Version]>.\001\VERSION.INF
echo %Version%%NO%>>.\001\VERSION.INF
echo UpdateDate%DATENO%>>.\001\VERSION.INF

[ Last edited by fastslz on 2006-7-6 at 13:53 ]
作者: fastslz     时间: 2006-7-6 13:49
呵呵...和bagpipe相比我这个办法比较笨
不过我测试过了,路径请楼主添加,提示:当这个.\Rav\虚拟路径的完全路径是C:\Program Files\Rav会有错误提示的
作者: bagpipe     时间: 2006-7-6 13:56
看的是方法,不是笨与不笨,大家思路不一样,结果一样就可以了,大家都是为了学习而来,也都是从笨开始学起的,所以都一样
作者: tclshx     时间: 2006-7-6 15:39


  Quote:
Originally posted by bagpipe at 2006-7-6 12:49 PM:
@echo off
setlocal
for /f "tokens=2 delims==" %%a in ('findstr /c:"VIRDEFVER" /c:"VIRDEFUPDATEDATE" virusdb.cfg') do (
if defined a (set b=%%a) else set a=%%a
)
e ...

二楼的结果是:
VERSION.INF的内容为
[Version]
VersionNo=~0,-3      
UpdateDate=

三楼的结果是:
VERSION.INF的内容为
[Version]
VIRDEFVER=18.34.31.00
UpdateDate=2006-07-06

正确的应该是
VERSION.INF的内容为
[Version]
VIRDEFVER=18.34.31
UpdateDate=2006-07-06
否则运行瑞星DOS杀毒的IMG时不能正确显示版本号(版本:18.34.31)
作者: bagpipe     时间: 2006-7-6 16:16
你先看看你的哪里出现问题了,别光顾着看结果,我在本机测试怎么没有出现你说的这种情况啊?
作者: tclshx     时间: 2006-7-6 16:25


  Quote:
Originally posted by bagpipe at 2006-7-6 04:16 PM:
你先看看你的哪里出现问题了,别光顾着看结果,我在本机测试怎么没有出现你说的这种情况啊?

我的瑞星是装在D盘的,我把这个批处理放在RISING目录下,RAV目录也在这个目录下.
我全部批处理如下:
@echo off
MD 001
COPY /Y .\Rav\VirBoot.def .\001
COPY /Y .\Rav\VirCom.def .\001
COPY /Y .\Rav\VirInfo.def .\001
COPY /Y .\Rav\VirMacr.def .\001
COPY /Y .\Rav\VirMZ.def .\001
COPY /Y .\Rav\VirPe.def .\001
COPY /Y .\Rav\VirSct.def .\001
COPY /Y .\Rav\ENGINE.DLL .\001
COPY /Y .\Rav\EXTFILE.DLL .\001
COPY /Y .\Rav\EXTMAIL.DLL .\001
COPY /Y .\Rav\EXTOLE.DLL .\001
COPY /Y .\Rav\LIBLOAD.DLL .\001
COPY /Y .\Rav\RsStore.dll .\001
COPY /Y .\Rav\ScanEx.dll .\001
COPY /Y .\Rav\SCANEXEC.DLL .\001
COPY /Y .\Rav\SCANMAC.DLL .\001
COPY /Y .\Rav\SCANSCT.DLL .\001
REM COPY /Y .\Rav\sLang936.dll .\001
COPY /Y .\Rav\Unexe.dll .\001
COPY /Y .\Rav\VDP.DLL .\001
COPY /Y .\Rav\VirusLib.dll .\001
COPY /Y .\Rav\ZIP.DLL .\001
COPY /Y .\Rav\VirNorm.def .\001
COPY /Y .\Rav\VIRUSDB.CFG .\001

setlocal
for /f "tokens=2 delims==" %%a in ('findstr /C:"VIRDEFVER" /C:"VIRDEFUPDATEDATE" virusdb.cfg') do (if defined a (set b=%%a) else set a=%%a)
echo [Version]>.\001\VERSION.INF
echo VersionNo=%a:~0,-3%>>.\001\VERSION.INF      
echo UpdateDate=%b%>>.\001\VERSION.IN

你的两个批处理都试了,结果VERSION.INF内容一样:
[Version]
VersionNo=~0,-3      
UpdateDate=
作者: bagpipe     时间: 2006-7-6 17:21
我想问的是您“virusdb.cfg“这个文件的位置在哪里呢?
作者: tclshx     时间: 2006-7-6 17:24


  Quote:
Originally posted by bagpipe at 2006-7-6 05:21 PM:
我想问的是您“virusdb.cfg“这个文件的位置在哪里呢?

virusdb.cfg文件是由批处理从RAV目录copy到001目录中的.
作者: bagpipe     时间: 2006-7-6 17:28
那他就是找不到那个文件
'findstr /C:"VIRDEFVER" /C:"VIRDEFUPDATEDATE" .001\virusdb.cfg'在试试,对了,问你一下,你什么系统?
作者: tclshx     时间: 2006-7-6 17:29


  Quote:
Originally posted by bagpipe at 2006-7-6 05:28 PM:
那他就是找不到那个文件
'findstr /C:"VIRDEFVER" /C:"VIRDEFUPDATEDATE" .001\virusdb.cfg'在试试,对了,问你一下,你什么系统?

XP_sp2
作者: bagpipe     时间: 2006-7-6 17:31
你改了试试,这个就是找不到那个CFG文件的原因
作者: bagpipe     时间: 2006-7-6 17:36
刚才路径错了,应该是  .\001\virusdb.cfg这样才对
作者: tclshx     时间: 2006-7-6 17:37


  Quote:
Originally posted by bagpipe at 2006-7-6 05:31 PM:
你改了试试,这个就是找不到那个CFG文件的原因

setlocal
for /f "tokens=2 delims==" %%a in ('findstr /C:"VIRDEFVER" /C:"VIRDEFUPDATEDATE" virusdb.cfg') do (if defined a (set b=%%a) else set a=%%a)
echo [Version]>.\001\VERSION.INF
echo VersionNo=%a:~0,-3%>>.\001\VERSION.INF      
echo UpdateDate=%b%>>.\001\VERSION.IN
改成
setlocal
for /f "tokens=2 delims==" %%a in ('findstr /C:"VIRDEFVER" /C:"VIRDEFUPDATEDATE" .001\virusdb.cfg') do (if defined a (set b=%%a) else set a=%%a)
echo [Version]>.\001\VERSION.INF
echo VersionNo=%a:~0,-3%>>.\001\VERSION.INF      
echo UpdateDate=%b%>>.\001\VERSION.INF

结果还是和没改前一样。

三楼的那个只是在结果中的版本号后多了".00"。它那个改进后可能行,但我不会。
作者: bagpipe     时间: 2006-7-6 17:41
刚才路径错了,应该是  .\001\virusdb.cfg这样才对
唉,那你随便吧
作者: tclshx     时间: 2006-7-6 17:41


  Quote:
Originally posted by bagpipe at 2006-7-6 05:36 PM:
刚才路径错了,应该是  .\001\virusdb.cfg这样才对

啊,改后成功了,谢谢!大侠就是不一样啊,有空帮我用中文注明一下你的语句中的各部分意思是什么吧,我想学批处理,但有些教程太简单,有些教程又过于复杂。学起来可费劲了。


先谢谢谢谢谢!!!!!!
作者: bagpipe     时间: 2006-7-6 17:43
唉,说这么些废话,我的积分还长了不点,唉