中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] [3] [4] »
作者:
标题: [求助]2个文件比较的问题 上一主题 | 下一主题
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『楼 主』:  [求助]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 ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 11:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 2 楼』:  

你这个是不是进行md5效验后检查是否为病毒附本的?

2008-7-9 12:40
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 3 楼』:  

没用过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 ]



批处理之家新域名:www.bathome.net
2008-7-9 13:19
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 4 楼』:  

我这个问题想想还是比较复杂的.

1. 首先要把未解压的释放到临时目录校验, 因为最初目录可能是只读的,这种情况下要保存原先未解压的路径值.

2. 就像我一楼帖子最后补充的, 我要把结果放到一个文件中多次调用. 至于CRC运行命令格式和结果是次要的, 只要知道它一定会输出个结果就是了. 就像3楼一样我们只要知道有那么个CRC.TXT文件,里边有各式各样的值就可以了.

3. 难的是把比较以后的结果, 即把1.txt, 2.txt, crc.txt 通过一个特征值再次输出.



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 13:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 5 楼』:  

最好能给出部分crc.txt文件的的样本来。。。



致精致简!
2008-7-9 13:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 6 楼』:  



  Quote:
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 ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 13:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 7 楼』:  

说了一大堆,从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 ]



致精致简!
2008-7-9 14:34
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 8 楼』:  

假如我运行 (为简化,先暂时不考虑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个值是真实的,其他是我虚拟的)

  Quote:
路径                                                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 ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 15:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 9 楼』:  

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




致精致简!
2008-7-9 16:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 10 楼』:  


@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




简单!简单!再简单!
2008-7-9 16:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 11 楼』:  

To: 9楼

我手头现在没CRC软件, 我要晚上才知道, 你假定最简单的好了, 就是 CRC32.EXE Filename 输出结果 CRC值, 因为不管CRC实际运行结果, 我都知道怎么处理,这个不是关键.

To: 10楼

下班之后我验证一下你的代码, 三个嵌套的 FOR, 看得我头晕, 可能你的代码在 OEMBIOS全部解压的情况下会正确运行, 但考虑压缩的OEMBIOS.CA_ , 情况就会复杂化, 能否先生成下中间文件, 让我解析一下, 以便解决实际问题.

谢谢大家了.



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 16:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 12 楼』:  

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 未正确显示路径! 我主要目的是取得路径.

  Quote:
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 ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 17:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 13 楼』:  

10 楼写错一个字符,所以 12 楼运行有点错误

  Quote:
@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





2008-7-9 17:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 14 楼』:  

假设你的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 ]



批处理之家新域名:www.bathome.net
2008-7-9 17:28
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by zh159 at 2008-7-9 05:23 PM:
10 楼写错一个字符,所以 12 楼运行有点错误

不行, 路径名根本没用处. 即时J 改成 I 得到的是错误结果.

谢谢10楼和其他帮忙的朋友, 能否再看看. 我是横竖动不出脑筋了.



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-9 17:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: