标题: [求助]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
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 ]
作者: 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个值是真实的,其他是我虚拟的)
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 ]
作者: 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 未正确显示路径! 我主要目的是取得路径. 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 ]
作者: zh159
时间: 2008-7-9 17:23
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 |
|
作者: 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
Quote: |
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.com/crc32.com 下载
此程序在代码页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 文件内容如下:
Quote: |
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_ |
|
运行的结果如下:
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
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楼运行结果不是太理想:
Quote: |
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楼运行结果接近完美:
Quote: |
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
仔细看了下, 还是有问题.
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
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
Quote: |
Originally posted by zw19750516 at 2008-7-10 12:03 AM:
试试crc32>result.txt看,要不就>result.txt crc32 |
|
都试过了, 绝对是世间少有的怪程序.
你不信到我
FTP://quya.2mydns.com/crc32.exe下载试试看.
注意我电脑关了, 我的FTP也没有了.
[
Last edited by quya on 2008-7-10 at 12:09 AM ]
作者: bat-zw
时间: 2008-7-10 00:09
Quote: |
Originally posted by quya at 2008-7-10 00:01:
这就是他的高明之处, 你再看看, 绝对运行准确.
他用 not defined 来检测变量的. 也就是变相的比较.
39楼代码还是不行, 和28楼一样, 提示命令语法 ... |
|
是不是我的眼睛出了问题,我把24楼的代码看了n次,就是没看到一个defined,老土,你是不是再看一下啊。
作者: quya
时间: 2008-7-10 00:11
Quote: |
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
Quote: |
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
Quote: |
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
这个是我的执行结果
Quote: |
文件"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
请按任意键继续. . . |
|