中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-13 20:37
楼 主 [求助]2个文件比较的问题 发表于 2008-07-09 11:28 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
假定我有以下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 ]
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2 发表于 2008-07-09 12:40 ·  中国 江苏 苏州 电信
银牌会员
★★★
积分 1,608
发帖 780
注册 2007-10-07 10:19
UID 99089
性别 男
状态 离线
你这个是不是进行md5效验后检查是否为病毒附本的?
3 发表于 2008-07-09 13:19 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
没用过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
4 发表于 2008-07-09 13:35 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
我这个问题想想还是比较复杂的.

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

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

3. 难的是把比较以后的结果, 即把1.txt, 2.txt, crc.txt 通过一个特征值再次输出.
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
5 发表于 2008-07-09 13:41 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
最好能给出部分crc.txt文件的的样本来。。。
致精致简!
6 发表于 2008-07-09 13:53 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
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 ]
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
7 发表于 2008-07-09 14:34 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
说了一大堆,从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 ]
致精致简!
8 发表于 2008-07-09 15:24 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
假如我运行 (为简化,先暂时不考虑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 ]
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
9 发表于 2008-07-09 16:16 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
问题的关键在于运行crc32.exe 的结果到底是怎样的我们不知道。
你先运行下面的代码把结果帖出来看看。。
:

@echo off
for /f "delims=" %%a in (2.txt) do (
for /f "delims=" %%i in ('crc32 %%a') do echo %%i
)
pause
致精致简!
10 发表于 2008-07-09 16:19 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线

@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
简单!简单!再简单!
11 发表于 2008-07-09 16:45 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
To: 9楼

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

To: 10楼

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

谢谢大家了.
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
12 发表于 2008-07-09 17:10 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
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 ]
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
13 发表于 2008-07-09 17:23 ·  中国 广西 玉林 电信
金牌会员
★★★★
积分 3,687
发帖 1,467
注册 2005-08-08 12:00
UID 44210
状态 离线
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
14 发表于 2008-07-09 17:28 ·  中国 湖南 株洲 电信
金牌会员
★★★★
永远的学习者
积分 3,105
发帖 1,276
注册 2008-03-08 13:00
UID 112398
性别 男
状态 离线
假设你的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
15 发表于 2008-07-09 17:31 ·  中国 江苏 苏州 常熟市 电信
高级用户
★★
五星老土
积分 558
发帖 172
注册 2003-02-09 00:00
UID 881
性别 男
来自 江苏
状态 离线
Originally posted by zh159 at 2008-7-9 05:23 PM:
10 楼写错一个字符,所以 12 楼运行有点错误


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

谢谢10楼和其他帮忙的朋友, 能否再看看. 我是横竖动不出脑筋了.
我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
论坛跳转: