Board logo

标题: [求助]2个文件比较的问题 [打印本页]

作者: quya     时间: 2008-7-9 11:28    标题: [求助]2个文件比较的问题

假定我有以下2个文件 1.txt
HPQ	CD4E1902
Pavilion	06D652A4
Lenovo	5237B729
LEGEND	7B06BD13
IBM	D7A77612
TOSHIBA	A16F9D62
FUJITSU	10045CFA
FUJITSUS	D2D64C41
HEDY	162C7931
Founder	3A0C0121
2.txt
G:\I386\OEMBIOS.CA_
G:\WXPOEM\1\OEMBIOS.CAT
G:\WXPOEM\2\OEMBIOS.CAT
G:\WXPOEM\3\OEMBIOS.CA_
G:\WXPOEM\4\OEMBIOS.CAT
G:\WXPOEM\5\OEMBIOS.CAT
G:\WXPOEM\6\OEMBIOS.CAT
G:\WXPOEM\7\OEMBIOS.CAT
G:\WXPOEM\8\OEMBIOS.CAT
F:\cpl\thif\OEMBIOS.CA_
F:\新建文件夹\Acer\OEMBIOS.CA_
F:\新建文件夹\xxx\OEMBIOS.CA_
F:\新建文件夹\Lenovo\oembios.ca_
F:\新建文件夹\xx\OEMBIOS.CA_
现在我得到一个变量值,比如 HEDY,是在文件 1.txt中的行的第一个值。 我对2.txt中路径中的文件(如果是压缩文件则先EXPAND)进行CRC32 校验, 运行 CRC32.EXE, 假定得到的CRC 输出结果在第一行第2个Token, 然后和文件 1.txt第2行值比较,IF FIND, 则把对应的路径赋值给一个变量。 如何在不用第三方程序的前提下高效简洁易懂地写出代码? 谢谢。 补充一下,CRC值校验只运行一次, 但可能要多次调用校验的结果, 所以生成如下的结果文件比较恰当.
LEGEND	7B06BD13 F:\新建文件夹\xxx\OEMBIOS.CA_
HEDY	162C7931 G:\WXPOEM\5\OEMBIOS.CAT
[ Last edited by quya on 2008-7-9 at 12:01 PM ]

作者: huahua0919     时间: 2008-7-9 12:40
你这个是不是进行md5效验后检查是否为病毒附本的?

作者: bat-zw     时间: 2008-7-9 13:19
没用过crc32,估摸着写的:
@echo off
for /f "delims=" %%i in (2.txt) do crc32 %%i>>crc.txt
for /f "tokens=2" %%a in (1.txt) do (
    for /f "tokens=1,3" %%i in ('findstr "%%a" crc.txt') do if "%%i" neq "" echo set %%i=%%j
)
pause>nul
[ Last edited by zw19750516 on 2008-7-9 at 01:27 PM ]

作者: quya     时间: 2008-7-9 13:35
我这个问题想想还是比较复杂的. 1. 首先要把未解压的释放到临时目录校验, 因为最初目录可能是只读的,这种情况下要保存原先未解压的路径值. 2. 就像我一楼帖子最后补充的, 我要把结果放到一个文件中多次调用. 至于CRC运行命令格式和结果是次要的, 只要知道它一定会输出个结果就是了. 就像3楼一样我们只要知道有那么个CRC.TXT文件,里边有各式各样的值就可以了. 3. 难的是把比较以后的结果, 即把1.txt, 2.txt, crc.txt 通过一个特征值再次输出.

作者: 26933062     时间: 2008-7-9 13:41
最好能给出部分crc.txt文件的的样本来。。。

作者: quya     时间: 2008-7-9 13:53
Originally posted by 26933062 at 2008-7-9 01:41 PM: 最好能给出部分crc.txt文件的的样本来。。。
我记不得样本了,但这是个普遍问题.
F:\新建文件夹\xxx\OEMBIOS.CA_  假定这儿 expand F:\新建文件夹\xxx\OEMBIOS.CA_ %temp%\OEMBIOS.CAT

crc32 %temp%\OEMBIOS.CAT

运行结果 ??? 7B06BD13 ???? (仅举个例子,和实际可能不一样,???表示任何东西)

G:\WXPOEM\5\OEMBIOS.CAT

crc32 G:\WXPOEM\5\OEMBIOS.CAT

运行结果 ??? 162C7931 ???? 
为了具有普遍性, 假定我先设法得到以下一个 CRC 文件(其实这个文件可以不要,只要最后结果,但不妨一步一步来) CRC.TXT
G:\I386\OEMBIOS.CA_	???
G:\WXPOEM\1\OEMBIOS.CAT	??? (以下略)
G:\WXPOEM\2\OEMBIOS.CAT
G:\WXPOEM\3\OEMBIOS.CA_
G:\WXPOEM\4\OEMBIOS.CAT
G:\WXPOEM\5\OEMBIOS.CAT	162C7931
G:\WXPOEM\6\OEMBIOS.CAT
G:\WXPOEM\7\OEMBIOS.CAT
G:\WXPOEM\8\OEMBIOS.CAT
F:\cpl\thif\OEMBIOS.CA_
F:\新建文件夹\Acer\OEMBIOS.CA_
F:\新建文件夹\xxx\OEMBIOS.CA_	7B06BD13
F:\新建文件夹\Lenovo\oembios.ca_
F:\新建文件夹\xx\OEMBIOS.CA_
最后我想得到的就是类似下面这个结果
LEGEND        7B06BD13 F:\新建文件夹\xxx\OEMBIOS.CA_
HEDY        162C7931 G:\WXPOEM\5\OEMBIOS.CAT
这个问题用文字描述的话就是这样。 我电脑装了VOL版的XP,现在我想改成OEM版的, 我的主板具备了OEM特征, 我有一大堆OEMBIOS文件可用来替换系统所需要的文件。 为了查找准确的OEMBIOS文件, 我把它们放在一个个特定的文件夹中以便程序来自动寻找。 后来我想想能否再准确一点, 比如我在文件夹中放错了文件,我如果随便放在一个文件夹中呢?能否编个批处理快捷准确地找到呢? 问题就是这样来的。而且我发现这个问题也可以应用在别的地方, 类似的查找应用例子应该不少. [ Last edited by quya on 2008-7-9 at 02:19 PM ]

作者: 26933062     时间: 2008-7-9 14:34
说了一大堆,从1楼到6楼我都没明白你的意图到底是什么。 估摸着写了个代码。先看对不对吧。。。 注意:没考虑crc.txt中的文件名及路径含空格的情况,也没考虑1.txt内容第一列含空格的情况。 且crc.txt的???部分没有重复的前提下。 :
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims= " %%a in (1.txt) do set %%b=%%a
for /f "tokens=1,2 delims= " %%a in (crc.txt) do (
   if defined %%b echo !%%b! %%b %%a
)
pause
[ Last edited by 26933062 on 2008-7-9 at 02:42 PM ]

作者: quya     时间: 2008-7-9 15:24
假如我运行 (为简化,先暂时不考虑OEMBIOS.CA_ 解压到临时目录OEMBIOS.CAT的问题 )
for /f %i in (2.txt) do crc32 %i >crc.txt
得到一个 crc.txt, 这个也是模拟的, 实际上可能不是这样简单, 但我会处理了.
3261089
9308173
2513351
4769779
2389039
162C7931
3468033
3351192
3627383
8631970
3820293
7B06BD13
4832250
8878816
第一个问题: 我如何把 2.txt 和 CRC.txt 合并成以下文件 temp.txt(如果能直接解决第2个问题,这个文件可以不要) temp.txt (表中除了2个值是真实的,其他是我虚拟的)
路径 CRC值 G:\I386\OEMBIOS.CA_ 3261089 G:\WXPOEM\1\OEMBIOS.CAT 9308173 G:\WXPOEM\2\OEMBIOS.CAT 2513351 G:\WXPOEM\3\OEMBIOS.CA_ 4769779 G:\WXPOEM\4\OEMBIOS.CAT 2389039 G:\WXPOEM\5\OEMBIOS.CAT 162C7931 G:\WXPOEM\6\OEMBIOS.CAT 3468033 G:\WXPOEM\7\OEMBIOS.CAT 3351192 G:\WXPOEM\8\OEMBIOS.CAT 3627383 F:\cpl\thif\OEMBIOS.CA_ 8631970 F:\新建文件夹\Acer\OEMBIOS.CA_ 3820293 F:\新建文件夹\xxx\OEMBIOS.CA_ 7B06BD13 F:\新建文件夹\Lenovo\oembios.ca_ 4832250 F:\新建文件夹\xx\OEMBIOS.CA_ 8878816
第二个问题 如何根据 temp.txt 和 1.txt 通过一个共同的CRC值 得到如下文件
LEGEND        7B06BD13 F:\新建文件夹\xxx\OEMBIOS.CA_
HEDY        162C7931 G:\WXPOEM\5\OEMBIOS.CAT
第三个问题 不简化步骤,解决我的实际问题。 实际上,CRC只是个过渡,我只是通过CRC值找到我需要的特定文件的目录,而且这个特定文件可能是CAB压缩的在只读盘上,我不得不先解压再检测。如果不需要上面我说的复杂的步骤,那么再好也不过了。 我真正需要的最终结果类似下面的式样: 不限下面这2个值, 也可能只有一个值, 或者没找到无结果.
LEGEND         F:\新建文件夹\xxx\OEMBIOS.CA_
HEDY       G:\WXPOEM\5\OEMBIOS.CAT
[ Last edited by quya on 2008-7-9 at 04:10 PM ]

作者: 26933062     时间: 2008-7-9 16:16
问题的关键在于运行crc32.exe 的结果到底是怎样的我们不知道。 你先运行下面的代码把结果帖出来看看。。 :
@echo off
for /f "delims=" %%a in (2.txt) do (
   for /f "delims=" %%i in ('crc32 %%a') do echo %%i
)
pause

作者: terse     时间: 2008-7-9 16:19
@echo off
for /f "delims=" %%j in (2.txt) do (
   for /f "delims=" %%j in ('crc32 "%%i"') do (
      for /f "delims=" %%k in ('findstr /ic:"%%j" "1.txt"') do (
         if not "%%k"=="" echo %%k %%i
     )
   )
 )
pause

作者: quya     时间: 2008-7-9 16:45
To: 9楼 我手头现在没CRC软件, 我要晚上才知道, 你假定最简单的好了, 就是 CRC32.EXE Filename 输出结果 CRC值, 因为不管CRC实际运行结果, 我都知道怎么处理,这个不是关键. To: 10楼 下班之后我验证一下你的代码, 三个嵌套的 FOR, 看得我头晕, 可能你的代码在 OEMBIOS全部解压的情况下会正确运行, 但考虑压缩的OEMBIOS.CA_ , 情况就会复杂化, 能否先生成下中间文件, 让我解析一下, 以便解决实际问题. 谢谢大家了.

作者: quya     时间: 2008-7-9 17:10
10楼的思路基本准确,我根据10楼的意思修改了第2个FOR 循环 验证了下。
@echo off
for /f "delims=" %%j in (2.txt) do (
   for /f "delims=" %%j in (crc.txt) do (
      for /f "delims=" %%k in ('findstr /ic:"%%j" "1.txt"') do (
         if not "%%k"=="" echo %%k %%i
     )
   )
)
pause
运行结果是:(能否再完善并提高效率?谢谢!) %i 未正确显示路径! 我主要目的是取得路径.
HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i HEDY 162C7931 %i LEGEND 7B06BD13 %i 请按任意键继续. . .
至于 CRC.TXT 文件的取得, 我初步的设想是下面代码, 未运行验证,可能要用到延迟变量之类的东东。
for /f %%i in (2.txt) do (if %~xi==cat crc32 %%i>>crc.txt else (expand %%i %temp%\oembios.cat &crc32 %temp%\oembios.cat>>crc.txt))
[ Last edited by quya on 2008-7-9 at 05:13 PM ]

作者: zh159     时间: 2008-7-9 17:23
10 楼写错一个字符,所以 12 楼运行有点错误
@echo off for /f "delims=" %%i in (2.txt) do ( for /f "delims=" %%j in ('crc32 "%%i"') do ( for /f "delims=" %%k in ('findstr /ic:"%%j" "1.txt"') do ( if not "%%k"=="" echo %%k %%i ) ) ) pause

作者: bat-zw     时间: 2008-7-9 17:28
假设你的winrar存放路径是c:\progra~1\winrar\,如下:
@echo off&setloca enabledelayedexpansion
for /f %%a in (2.txt) do (
      if "%%~xa" equ ".rar" (
        call c:\progra~1\winrar\rar x %%a %%~dpa\
        for /f "delim=" %%i in ('crc32 "%%~dpna.CA*"') do set str=%%i
        ) else (
        for /f "delims=" %%i in ('crc32 "%%a"') do set str=%%i
     )
     echo !str! %%a>>crc.txt
)
rem 假定crc.exe *.*是如楼主所列出的形式
for /f "tokens=1,2" %%a in (crc.txt) do (
    for /f "delims=" %%i in ('findstr "%%a" 1.txt')  do echo  %%i %%b
)
[ Last edited by zw19750516 on 2008-7-9 at 06:04 PM ]

作者: quya     时间: 2008-7-9 17:31
Originally posted by zh159 at 2008-7-9 05:23 PM: 10 楼写错一个字符,所以 12 楼运行有点错误
不行, 路径名根本没用处. 即时J 改成 I 得到的是错误结果. 谢谢10楼和其他帮忙的朋友, 能否再看看. 我是横竖动不出脑筋了.

作者: 26933062     时间: 2008-7-9 18:59
如果10楼的代码可行的话,那么这样效率应该高些。 :
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1* delims= " %%a in (1.txt) do set "%%b=%%a"
for /f "delims=" %%a in (2.txt) do (
   for /f "delims=" %%b in ('crc32 "%%a"') do (
      if defined %%b echo !%%b! %%a
))
pause

作者: quya     时间: 2008-7-9 21:27
上面的代码都不行啊, 不过还是衷心感谢大家. 我想先从简单的开始, 我有一个很小的CRC32 程序 到我 ftp://quya.2mydns.co ... 下载 此程序在代码页437下运行, 而且不支持长文件名和带有空格的目录, 但用以下代码可以得到正确的结果.
for /f "delims==" %i in (2.txt) do (if /i %~xi==.cat (crc32 %~fsi>>crc.txt) else (expand %~fsi %temp%\oembios.cat&crc32 %temp%\oembios.cat>>crc.txt))
2.txt 文件内容如下:
G:\IBM\oembios.cat G:\IBM\OEMBIOS.CA_ G:\WXPOEM\IBM\I386\OEMBIOS.CA_ G:\xpdos\I386\OEMBIOS.CA_ G:\xpdos\WXPOEM\ACER\OEMBIOS.CAT G:\xpdos\WXPOEM\ASUS\OEMBIOS.CA_ G:\xpdos\WXPOEM\DELL\OEMBIOS.CAT G:\xpdos\WXPOEM\HPQ\OEMBIOS.CAT G:\xpdos\WXPOEM\IBM\OEMBIOS.CAT G:\xpdos\WXPOEM\LENOVO\OEMBIOS.CAT F:\e\Backup\Tools\OEM 5文件\Acer\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\COMPAQ\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\HEDY\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\HP\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\IBM\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\Legend\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\SAMSUNG\OEMBIOS.CA_ F:\e\Backup\Tools\OEM 5文件\Sony\OEMBIOS.CA_ F:\FTP\Up\2003ent\OEMBIOS.CA_ E:\OEM 文件\ACER\OEMBIOS.CAT E:\OEM 文件\LEGEND\OEMBIOS.CA_
运行的结果如下:
G:\IBM\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat 90BBDCA0 G:\xpdos\WXPOEM\ACER\OEMBIOS.CAT 717B6EF3 C:\WINXP\TEMP\oembios.cat B20C65BF G:\xpdos\WXPOEM\DELL\OEMBIOS.CAT B6F0EEFD G:\xpdos\WXPOEM\HPQ\OEMBIOS.CAT CD4E1902 G:\xpdos\WXPOEM\IBM\OEMBIOS.CAT D7A77612 G:\xpdos\WXPOEM\LENOVO\OEMBIOS.CAT 5237B729 C:\WINXP\TEMP\oembios.cat 700A8481 C:\WINXP\TEMP\oembios.cat 74572CCF C:\WINXP\TEMP\oembios.cat 162C7931 C:\WINXP\TEMP\oembios.cat 74572CCF C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat 7B06BD13 C:\WINXP\TEMP\oembios.cat 904CF15A C:\WINXP\TEMP\oembios.cat 74572CCF C:\WINXP\TEMP\oembios.cat 57E3E3DC E:\OEM文~1\ACER\OEMBIOS.CAT 717B6EF3 C:\WINXP\TEMP\oembios.cat 7B06BD13
先解决以下问题, 如何把临时目录 C:\WINXP\TEMP\ 还原成本来目录. 然后再慢慢来, 谢谢大家, 老土的脑筋现在有点不好使. [ Last edited by quya on 2008-7-9 at 09:42 PM ]

作者: 26933062     时间: 2008-7-9 21:36
越来越不知道你要干什么了? G:\IBM\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat 90BBDCA0 G:\xpdos\WXPOEM\ACER\OEMBIOS.CAT 717B6EF3 C:\WINXP\TEMP\oembios.cat B20C65BF G:\xpdos\WXPOEM\DELL\OEMBIOS.CAT B6F0EEFD G:\xpdos\WXPOEM\HPQ\OEMBIOS.CAT CD4E1902 G:\xpdos\WXPOEM\IBM\OEMBIOS.CAT D7A77612 G:\xpdos\WXPOEM\LENOVO\OEMBIOS.CAT 5237B729 C:\WINXP\TEMP\oembios.cat 700A8481 C:\WINXP\TEMP\oembios.cat 74572CCF C:\WINXP\TEMP\oembios.cat 162C7931 C:\WINXP\TEMP\oembios.cat 74572CCF C:\WINXP\TEMP\oembios.cat D7A77612 这些是crc.txt的内容吗? 如果是,难道7楼的代码不行?

作者: quya     时间: 2008-7-9 21:47
Originally posted by 26933062 at 2008-7-9 09:36 PM: 越来越不知道你要干什么了? G:\IBM\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat D7A77612 C:\WINXP\TEMP\oembios.cat 90BBDCA0 G:\xpdos\WXPOEM\ACE ...
下午在单位没试你的代码, 对不起, 刚才试了下, 正确而且速度很快. 但是能否解决在压缩文件的情况下还原本来目录的问题. 17楼我提到的问题. 能解释下 for /f "tokens=1* delims= " %%a in (1.txt) do set %%b=%%a 这句意思吗? %%b 是第2个 token, 也就是 "1*" 中的 "*", 怎么还可以赋值, 实在看不懂啊 . 再编辑, 有点知道了, 这样生成了很多变量, 变量名取第2个token, 赋的值是第一个, 我担心的是, 如果我文件很长, 变量名这么多会不会溢出而出错? 因为小时候就知道, 要节省变量名和及时释放变量, 我那个时候的内存是小得可怜的, 不敢用太多变量. [ Last edited by quya on 2008-7-9 at 10:02 PM ]

作者: 26933062     时间: 2008-7-9 21:52
不理解 是2.txt中有压缩文件? crc32.exe 可以对其进行解压缩?并且解压到C:\WINXP\TEMP\目录? 本来目录又是什么目录?

作者: quya     时间: 2008-7-9 22:01
Originally posted by 26933062 at 2008-7-9 09:52 PM: 不理解 是2.txt中有压缩文件? crc32.exe 可以对其进行解压缩?并且解压到C:\WINXP\TEMP\目录? 本来目录又是什么目录?
是的, 文件名扩展名是 .ca_ 的就是压缩文件, 需要expand 再对它校验, 请参照我17楼的解压代码, 谢谢.

作者: bat-zw     时间: 2008-7-9 22:11
老土测试了我14的代码吗?我里面加了对rar文件的判断和解压,你只要自己改下就可以了。 [ Last edited by zw19750516 on 2008-7-9 at 10:20 PM ]

作者: quya     时间: 2008-7-9 22:20
Originally posted by zw19750516 at 2008-7-9 10:11 PM: 老土测试了我14的代码吗?我里面加了对rar文件的判断和解压,你只要自己改下后缀就可以了。
谢谢你的代码, 但 1. 解压不是 WINRAR, 当然这个我可以改 2. 最关键的是你解压在当前目录了, 而当前目录可能只读, 所以一定要解到临时目录 由于2的问题, 如何取得原来目录就成了问题.

作者: 26933062     时间: 2008-7-9 22:33
根据你17楼代码改进,获取原目录及文件名 至于你说变量益处,这个问题我还没遇到过, 作了个简单的测试,十万个变量名没发现错误的现象。我的物理内存是128m 但如果你的1.txt内容很长的话,你用前面的代码for+findstr估计你会等到头发变白。。。
@echo off
for /f "delims==" %%i in (2.txt) do (
  if /i %%~xi==.cat (crc32 %%~fsi>>crc.txt) else (
    expand %~fsi %temp%\oembios.cat
    for /f "tokens=2" %%a in ('crc32 %temp%\oembios.cat') do echo %%i %%a>>crc.txt
))
[ Last edited by 26933062 on 2008-7-9 at 10:34 PM ]

作者: bat-zw     时间: 2008-7-9 22:35
我日,好麻烦,这下可以解决你的问题了吧:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in (2.txt) do (
    if /i "%%~xi" equ ".cat" (
       crc32 %%~fsi>>crc.txt
       ) else (
      expand "%%i" %temp%\oembios.cat
      for /f "tokens=2" %%a in ('crc32 %temp%\oembios.cat') do set str=%%a
      echo %%i !str!>>crc.txt
      del /q %temp%\oembios.cat
))
for /f "tokens=1,2" %%a in (1.txt) do (
     for /f "delims=" %%i in ('findstr "%%b" crc.txt') do echo %%a %%i
) 
pause>nul
[ Last edited by zw19750516 on 2008-7-9 at 11:25 PM ]

作者: 26933062     时间: 2008-7-9 22:59
不好意思24楼说的十万个变量名,没测试完,实际测试是四万个。

作者: quya     时间: 2008-7-9 23:06
24, 25 楼的代码 %~fsi 都 少了个 %, 不过这容易改. 25楼运行结果不是太理想:
G:\IBM\oembios.cat D7A77612 G:\IBM\OEMBIOS.CA_ D7A77612 G:\WXPOEM\IBM\I386\OEMBIOS.CA_ D7A77612 G:\xpdos\I386\OEMBIOS.CA_ 90BBDCA0 G:\xpdos\WXPOEM\ACER\OEMBIOS.CAT 717B6EF3 G:\xpdos\WXPOEM\ASUS\OEMBIOS.CA_ B20C65BF G:\xpdos\WXPOEM\DELL\OEMBIOS.CAT B6F0EEFD G:\xpdos\WXPOEM\HPQ\OEMBIOS.CAT CD4E1902 G:\xpdos\WXPOEM\IBM\OEMBIOS.CAT D7A77612 G:\xpdos\WXPOEM\LENOVO\OEMBIOS.CAT 5237B729 F:\e\Backup\Tools\OEM 5文件\Acer\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\COMPAQ\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\HEDY\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\HP\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\IBM\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\Legend\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\SAMSUNG\OEMBIOS.CA_ ?? F:\e\Backup\Tools\OEM 5文件\Sony\OEMBIOS.CA_ ?? F:\FTP\Up\2003ent\OEMBIOS.CA_ 57E3E3DC E:\OEM ?? E:\OEM 文件\LEGEND\OEMBIOS.CA_ ??
24楼运行结果接近完美:
G:\IBM\oembios.cat D7A77612 G:\IBM\OEMBIOS.CA_ D7A77612 G:\WXPOEM\IBM\I386\OEMBIOS.CA_ D7A77612 G:\xpdos\I386\OEMBIOS.CA_ 90BBDCA0 G:\xpdos\WXPOEM\ACER\OEMBIOS.CAT 717B6EF3 G:\xpdos\WXPOEM\ASUS\OEMBIOS.CA_ B20C65BF G:\xpdos\WXPOEM\DELL\OEMBIOS.CAT B6F0EEFD G:\xpdos\WXPOEM\HPQ\OEMBIOS.CAT CD4E1902 G:\xpdos\WXPOEM\IBM\OEMBIOS.CAT D7A77612 G:\xpdos\WXPOEM\LENOVO\OEMBIOS.CAT 5237B729 F:\e\Backup\Tools\OEM 5文件\Acer\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\COMPAQ\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\HEDY\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\HP\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\IBM\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\Legend\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\SAMSUNG\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\Sony\OEMBIOS.CA_ B20C65BF F:\FTP\Up\2003ent\OEMBIOS.CA_ 57E3E3DC E:\OEM ?? E:\OEM 文件\LEGEND\OEMBIOS.CA_ 57E3E3DC
但想不通的是倒数第2个结果会这样?!! 我仔细看了代码, 没错误啊. 用下边语句检测也没问题啊, 晕倒!
for /f "delims=" %i in (2.txt) do echo %~fsi
大家辛苦了!!! 万分感谢!! [ Last edited by quya on 2008-7-9 at 11:08 PM ]

作者: bat-zw     时间: 2008-7-9 23:09
如不要生成临时的crc.txt:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (2.txt) do (
     if /i "%%~xa" equ ".cat" (
        for /f "tokens=2" %%d in ('crc32 %%~fsa') do set str=%%d     
        ) else (
        expand "%%a" %temp%\oembios.cat
        for /f "tokens=2" %%d in ('crc32 %%temp%\oembios.cat') do set str=%%d
     )
     for /f "tokens=1,2" %%b in (1.txt) do echo !str!|findstr "%%c">nul&&echo %%b %%a !str!
     del /q /f %temp%\oembios.cat
)
pause>nul
[ Last edited by zw19750516 on 2008-7-9 at 11:31 PM ]

作者: quya     时间: 2008-7-9 23:16
仔细看了下, 还是有问题.
F:\e\Backup\Tools\OEM 5文件\Acer\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\COMPAQ\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\HEDY\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\HP\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\IBM\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\Legend\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\SAMSUNG\OEMBIOS.CA_ B20C65BF F:\e\Backup\Tools\OEM 5文件\Sony\OEMBIOS.CA_ B20C65BF
这里全部一样了.

作者: bat-zw     时间: 2008-7-9 23:16
Originally posted by quya at 2008-7-9 23:06: 24, 25 楼的代码 %~fsi 都 少了个 %, 不过这容易改. 25楼运行结果不是太理想: 24楼运行结果接近完美: 但想不通的是倒数第2个结果会这样?!! ...
难道1.txt是多余的?

作者: bat-zw     时间: 2008-7-9 23:19
Originally posted by quya at 2008-7-9 23:16: 仔细看了下, 还是有问题. 这里全部一样了.
这是因为没及时删除解压后的文件,造成下一次解压不成功,因此每次都是crc32 同一个文件。 ps:25楼代码的问题还是出在expand上面。 [ Last edited by zw19750516 on 2008-7-9 at 11:28 PM ]

作者: bat-zw     时间: 2008-7-9 23:24
请测试我28楼的代码以及修改后的25楼代码。 [ Last edited by zw19750516 on 2008-7-9 at 11:25 PM ]

作者: quya     时间: 2008-7-9 23:31
又经过多次测试. 发现如下规律: 在代码页 936下 运行正确, 运行一遍之后代码页变成 437, 之后结果就不正确, 有很多地方都不正确包括我上面提到的. 有人分析下原因并提高兼容性吗? 这个问题我自己都觉得太变态了.

作者: quya     时间: 2008-7-9 23:32
Originally posted by zw19750516 at 2008-7-9 11:19 PM: 这是因为没及时删除解压后的文件,造成下一次解压不成功,因此每次都是crc32 同一个文件。 ps:25楼代码的问题还是出在expand上面。 [ Last edited by zw19750516 on 2008-7-9 at 11:28 PM ]
不是, expand 会覆盖原文件. 是代码页的问题.

作者: bat-zw     时间: 2008-7-9 23:35
老土测试了我修改后25和28楼的代码吗,有个还是刚修改的,真的是人老了,好粗心的,总写错。

作者: quya     时间: 2008-7-9 23:42
Originally posted by zw19750516 at 2008-7-9 11:35 PM: 老土测试了我修改后25和28楼的代码吗,有个还是刚修改的,真的是人老了,好粗心的,总写错。
28楼刚才测试错误 25楼现在和7楼结果一样, 就是不知道那个效率高. 但只能在代码页 936 下正确, 以前不成功是在 代码页 437下. 所以在批处理行首只能暂时加 CHCP 936 来确保正确运行, 因为用过一次之后就是 437. 这个crc32.com 其他都好, 最欣赏它的就是不到1KB, 可惜会改变代码页. 鱼和熊掌不可兼得啊.

作者: bat-zw     时间: 2008-7-9 23:47
如25楼现在结果完全正确,那么开始就是expand的问题,开始我是照抄你的expand %%~fsi,现在改成了expand "%%i",28楼我再看看,至于效率和7楼根本没法比,因为7楼是直接利用的已生成的crc.txt。

作者: quya     时间: 2008-7-9 23:52
Originally posted by zw19750516 at 2008-7-9 11:47 PM: 如25楼现在结果完全正确,那么开始就是expand的问题,开始我是照抄你的expand %%~fsi,现在改成了expand "%%i",28楼我再看看,至于效率和7楼根本没法比,因为7楼是直接利用的已生成的crc.txt。
25楼以前我在代码页437下运行了, 后来我发现代码页的问题再重新去运行的. %%~fsi 兼容性绝对比 %%i 好, 这应该不容怀疑. 7楼的改进代码在24楼, 我觉得24楼的代码效率要高, 因为用了很多变量来代替FOR 和FINDSTR 语句.

作者: bat-zw     时间: 2008-7-9 23:55
再来:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (2.txt) do (
     if /i "%%~xa" equ ".cat" (
        for /f "tokens=2" %%b in ('crc32 %%~fsa') do set str=%%b     
        ) else (
        expand "%%a" %temp%\oembios.cat
        for /f "tokens=2" %%b in ('crc32 %%temp%\oembios.cat') do set str=%%b
     )
     for /f "tokens=1,2" %%c in (1.txt) do if "!str!" equ "%%d" echo %%c %%a %%d
     if exist %temp%\oembios.cat del /q /f %temp%\oembios.cat
)
pause>nul

作者: bat-zw     时间: 2008-7-9 23:58
Originally posted by quya at 2008-7-9 23:52: 25楼以前我在代码页437下运行了, 后来我发现代码页的问题再重新去运行的. %%~fsi 兼容性绝对比 %%i 好, 这应该不容怀疑. 7楼的改进代码在24楼, 我觉 ...
老土你有没仔细看下24楼的代码,整体就只是个生成crc.txt的代码啊,根本没涉及到比较!

作者: quya     时间: 2008-7-9 23:59
我有5个命令行下的CRC检测软件, 2个40多K, 1个19K, 1个 15K. 一个 1K. 因为1K的这个程序是用在纯DOS下的, 在32环境下支持不好, 会改变代码页等, 所以只好用 %%~fsi 来获取路径. 开始我不想用它的, 我想用15k那个, 但是 15K那个程序奇怪得不得了. 我 CRC32 >result.txt 无法得到结果, 依然显示在屏幕上, 用 1>result.txt 也不行, 不知道大家之前碰到过这样的命令行程序吗? 我反正是第一次遇到.

作者: quya     时间: 2008-7-10 00:01
Originally posted by zw19750516 at 2008-7-9 11:58 PM: 老土你有没仔细看下24楼的代码,整体就只是个生成crc.txt的代码啊,根本没涉及到比较!
这就是他的高明之处, 你再看看, 绝对运行准确. 他用 not defined 来检测变量的. 也就是变相的比较. 39楼代码还是不行, 和28楼一样, 提示命令语法不准确. [ Last edited by quya on 2008-7-10 at 12:04 AM ]

作者: bat-zw     时间: 2008-7-10 00:03
试试crc32>result.txt看,要不就>result.txt crc32

作者: quya     时间: 2008-7-10 00:08
Originally posted by zw19750516 at 2008-7-10 12:03 AM: 试试crc32>result.txt看,要不就>result.txt crc32
都试过了, 绝对是世间少有的怪程序. 你不信到我 FTP://quya.2mydns.co ...下载试试看. 注意我电脑关了, 我的FTP也没有了. [ Last edited by quya on 2008-7-10 at 12:09 AM ]

作者: bat-zw     时间: 2008-7-10 00:09
Originally posted by quya at 2008-7-10 00:01: 这就是他的高明之处, 你再看看, 绝对运行准确. 他用 not defined 来检测变量的. 也就是变相的比较. 39楼代码还是不行, 和28楼一样, 提示命令语法 ...
是不是我的眼睛出了问题,我把24楼的代码看了n次,就是没看到一个defined,老土,你是不是再看一下啊。

作者: quya     时间: 2008-7-10 00:11
Originally posted by zw19750516 at 2008-7-10 12:09 AM: 是不是我的眼睛出了问题,我把24楼的代码看了n次,就是没看到一个defined,老土,你是不是再看一下啊。
对不起, 应该24楼代码+7楼代码, 看错了. 另外, 你的代码可能多了或者少了括号的问题. 我看不出来. [ Last edited by quya on 2008-7-10 at 12:17 AM ]

作者: bat-zw     时间: 2008-7-10 00:23
我晕,没多也没少啊,我也没看出来。 不想了,睡觉了。 [ Last edited by zw19750516 on 2008-7-10 at 12:27 AM ]

作者: 26933062     时间: 2008-7-10 00:30
39楼的代码对1.txt循环的次数等于2.txt的行数乘以1.txt的行数,所以效率会低的多。 [ Last edited by 26933062 on 2008-7-10 at 12:31 AM ]

作者: 26933062     时间: 2008-7-10 00:46
楼主问题解决了吗?

作者: quya     时间: 2008-7-10 00:48
Originally posted by 26933062 at 2008-7-10 12:30 AM: 楼主问题解决了吗?
你号称初中都没毕业, 现在打死我也不相信了. 初中没毕业程序会写得这么溜? 把我这个号称大学以上文化的人忽悠得晕头转向. 要是我年轻十岁, 我估计我不会来这求助的, 难为情啊. 大不了搞个通宵把所有命令吃透了再想办法, 可是年纪大了,确实不行了. 睡觉了, 今天又学到不少东西. 活到老学到老. 谢谢各位! [ Last edited by quya on 2008-7-10 at 12:52 AM ]

作者: terse     时间: 2008-7-10 01:01
还是小楼兄的好看 把你的加上比较
@echo off&setlocal enabledelayedexpansion
for /f "tokens=1*" %%i in (1.txt) do set "%%j=%%i"
   for /f "delims=" %%a in (2.txt) do (
      if /i "%%~xa"==".cat" (
        for /f "tokens=1*" %%i in ('crc32 %%~fsa') do if defined %%j >>crc.txt echo !%%j! %%j %%i)else (
        expand %%~fsa %temp%\%%~na.cat
        for /f "tokens=1*" %%i in ('crc32 %temp%\%%~na.cat') do if defined %%j >>crc.txt echo !%%j! %%j %%~fsa
))
pause

作者: 26933062     时间: 2008-7-10 01:11
又看了下顶楼的描述,楼主的这句话。 现在我得到一个变量值,比如 HEDY,是在文件 1.txt中的行的第一个值。 我对2.txt中路径中的文件(如果是压缩文件则先EXPAND)进行CRC32 校验, 运行 CRC32.EXE, 假定得到的CRC 输出结果在第一行第2个Token, 然后和文件 1.txt第2行值比较,IF FIND, 则把对应的路径赋值给一个变量。 好像是要根据一个变量的值来查找需要的文件名,而不是全部对比。 如下:str的值就是需要查找的。可以是多个,用空格分开。 :
@echo off&setlocal enabledelayedexpansion
set str=HEDY LEGEND
for /f "tokens=1* delims= " %%a in (1.txt) do set "%%a=%%b"
for /f "delims==" %%i in (2.txt) do (
  if /i %%~xi==.cat (
     for /f "delims=" %%j in ('crc32 %%~fsi') do set "var=%%j"
   ) else (
    expand %%~fsi %temp%\oembios.cat
    for /f "tokens=2" %%j in ('crc32 %temp%\oembios.cat') do set "var=%%j"
    del/q %temp%\oembios.cat >nul 2>nul
  )
    for %%a in (%str%) do if /i "!var!"=="!%%a!" echo %%a !var! %%i
)
pause
[ Last edited by 26933062 on 2008-7-10 at 01:21 AM ]

作者: fastslz     时间: 2008-7-10 17:12
Originally posted by quya at 2008-7-9 13:53: 我电脑装了VOL版的XP,现在我想改成OEM版的, 我的主板具备了OEM特征, 我有一大堆OEMBIOS文件可用来替换系统所需要的文件。 为了查找准确的OEMBIOS文件, 我把它们放在一个个特定的文件夹中以便程序来自动寻找。
有点乱七八糟我就上述问题给你解决方法(需要crc32sum.exe)
@echo off
for /f "delims=" %%a in ('dir /s/a-d/b D:\*.CA*') do call :xxx "%%a"
pause

:xxx
set "FliePath=%~dp1"
set "Flie=%~nx1"
if "%Flie:~-1%"=="_" (
    EXPAND "%~1" "%temp%\OEMBIOS.CAT" >nul
    for /f "tokens=1 delims=* " %%i in ('crc32sum.exe -b "%temp%\OEMBIOS.CAT"') do set "crc32=%%i"
    ) else (
    for /f "tokens=1 delims=* " %%i in ('crc32sum.exe -b "%~1"') do set "crc32=%%i"
)
for /f "tokens=1 delims= " %%k in ('type 1.txt^|find /i "%crc32%"') do echo 文件"%~1"	对应品牌%%k
功能描述 枚举D盘CA*扩展名,如果扩展名是CA_就用EXPAND解压到临时文件夹再crc32sum.exe校验,否则直接crc32sum.exe校验,将校验值赋予变量crc32,最后筛选OEM显示结果 crc32sum.exe请到我的网盘下载 http://fastslz.cech.com.cn/#show=file 这个是我的执行结果
文件"D:\oembios\XP_ACER_OEM\OEMBIOS.CA_" 对应品牌Acer 文件"D:\oembios\XP_ASUS_OEM\OEMBIOS.CA_" 对应品牌Asus 文件"D:\oembios\XP_COMPAQ_OEM\OEMBIOS.CA_" 对应品牌Compaq 文件"D:\oembios\XP_DELL_OEM\OEMBIOS.CA_" 对应品牌Dell 文件"D:\oembios\XP_HP_OEM\OEMBIOS.CA_" 对应品牌Hewlett-Packard 文件"D:\oembios\XP_IBM_OEM\OEMBIOS.CA_" 对应品牌IBM 文件"D:\oembios\XP_IBM_OEM\OEMBIOS.CA_" 对应品牌IBM 文件"D:\oembios\XP_Lenovo_OEM\OEMBIOS.CA_" 对应品牌LEGEND 文件"D:\oembios\XP_Lenovo_OEM\OEMBIOS.CA_" 对应品牌LEGEND 文件"D:\oembios\XP_SONY_OEM\OEMBIOS.CA_" 对应品牌Sony 请按任意键继续. . .