标题: 将一文本文件与N个文本文件作比较,若与某文件内容相同则运
[打印本页]
作者: quan_zhou
时间: 2005-3-17 00:00
标题: 将一文本文件与N个文本文件作比较,若与某文件内容相同则运
大家好!请教各前辈我想在Dos 下编个批处理,将一个文本文件与N个文本文件作比较,若与某文件内容相同则运行一个与该文本文件相同文件名的批处理文件。
例:若X.txt与1.txt 内容相同则运行1.bat;
若X.txt与2.txt内容相同则运行2.bat。
请问该怎编?
作者: chenhui530
时间: 2005-3-18 00:00
楼主你应该把要执行的批处理所对应的TXT文件列出来啊!不然谁知道有多少啊!是哪些啊
所以我就写了全面看能满足你的要求吗?
要比较的和比较的文件以及BAT文件都得放在一个目录下for %%a in (*.txt) do for %%b in (*.txt) do fc %%a %%b | find "找不到相异处" && %%~na.bat
作者: quan_zhou
时间: 2005-3-18 00:00
标题: 多谢 chenhui530 不好意思我写得不够清楚。
我想写个批处理,DOS 7.1下将C:\X.txt 与D:\1.txt至99.txt 比较。其中1.txt至99.txt只有一个是与X.txt内容是相同的。
TEST.bat、1.txt至99.txt、1.bat 至99.bat 都在D:\
若X.TXT 与1.TXT内容相同则运行 1.BAT。
若X.TXT 与2.TXT内容相同则运行 2.BAT。
若X.TXT 与88.TXT内容相同则运行 88.BAT。
若X.TXT 与99.TXT内容相同则运行 99.BAT。
我写的TEST.bat 的内容
FOR %%C IN (*.TXT|) DO FC %%C C:\X.TXT
----------------------------------------------------------------
TEST.bat对比了那些文件,但要怎能才能运行那个对应的BAT呢? 请指教
作者: chenhui530
时间: 2005-3-19 00:00
我没有98的FC你传个上来我好给你写出批处理来
作者: quan_zhou
时间: 2005-3-19 00:00
标题: 再次谢谢chebhui530的关注
我是在DOS 7.1下使用的,这次上传的也是。
我这样试了一下也不行
----------------test.bat-----------
fc c:\x.txt d:\1.txt
if errorlevel 1 goto 2
if errorlevel 0 call 1.bat
:2
fc c:\x.txt d:\2.txt
if errorlevel 1 goto 3
if errorlevel 0 call 2.bat
:3
--------------------------------------
可是不管那两个文件是相同或有差异都是返回“0”。
作者: chenhui530
时间: 2005-3-19 00:00
Quote: |
以下是引用quan_zhou在2005-3-19 14:08:43的发言:
我是在DOS 7.1下使用的,这次上传的也是。
我这样试了一下也不行
----------------test.bat-----------
fc c:\x.txt d:\1.txt
if errorlevel 1 goto 2
if errorlevel 0 call 1.bat
:2
fc c:\x.txt d:\2.txt
if errorlevel 1 goto 3
if errorlevel 0 call 2.bat
:3
--------------------------------------
可是不管那两个文件是相同或有差异都是返回“0”。 |
|
应该是这样的
if not errorlevel 1 echo find
作者: chenhui530
时间: 2005-3-19 00:00
你这样的批处理是不现实的!为了从100个文件中比较一个写了那么多的命令不好你把98的FC传给我我给你写一个批处理不要多长的代码就可以搞定
作者: quan_zhou
时间: 2005-3-19 00:00
劳烦你了, chenhui530
打开附件
作者: chenhui530
时间: 2005-3-20 00:00
我在DOS7。1下试了FC。EXE怎么没返回值啊?
也许是我这有问题我把代码提供给你你自己改一点点就行了需要个第三方工具STRINGS有什么问题再反映因为我无法测试!STRINGS.com可以在软件站下载:kaishi
strings a=add %b%,1
if not exist %a% fc x.txt %a%.txt>fc.txt
find "相同时FC的代码" fc.txt
if not errorlevel 1 %a%.bat
strings b=add %a%,1
if %b%==101 goto end
goto kaishi:end
作者: 小石头
时间: 2005-3-20 00:00
DOS 7.1下的fc是不能用于批处理中的文件比较的,所以在这里必须引入第三方工具,我在网上找到了两个:filecomp和gscom。另外,使用md5sum或者fsum之类的工具,通过计算文件的md5或者crc32值也可以比较文件是否相同。另外,DOS 7.1下的for命令不支持等差序列的数字变量的产生,所以必须使用类似楼上的strings或者varset之类的第三方程序用来产生数字的顺序增加操作。基本上,楼上的程序只要换一下文件比较工具就可以了。
作者: quan_zhou
时间: 2005-3-21 00:00
标题: 谢谢大家的关注!能否把FC.EXE 改成有返回值?
谢谢大家的帮助!
我在DOS 7.1 下 不管两文件相同还是有差异都是返回0
请问我们能否更改FC.exe的返回值?
[此贴子已经被作者于2005-3-21 8:45:46编辑过]
作者: chenhui530
时间: 2005-3-21 00:00
在DOS 7.1下好像FC没返回值
作者: Climbing
时间: 2005-3-21 00:00
楼上的“小石头”(也就是我的马甲)已经讲过了,就是因为DOS 7.1下的fc没有返回值,所以无法用于判断文件是否相同,所以我提供了另两个用于DOS下的文件比较工具,这两个工具都是有返回值的。gscmp的下载地址:http://www.programmersheaven.com/d/click.aspx?ID=F19947&URL=http%3A%2F%2Fwww.goldsealstudios.com%2Fcgi-bin%2Fdownload.pl%3fdl=gscmp.zipfilecomp的下载地址:http://www.programmersheaven.com/d/click.aspx?ID=F3062在本帖的环境中,我推荐使用gscmp,因为简单易用,而filecomp虽然功能更强,但使用起来也比较麻烦。
作者: quan_zhou
时间: 2005-3-21 00:00
非常多谢大家的帮助!
我下了gscmp 在DOS7.1不能正常运行,提示该程序不能在DOS 方式下运行。
XP 的DOS 能正常运行。
Climbing 能否再次麻烦你给个能在DOS 7.1下运行的,谢谢!
作者: Climbing
时间: 2005-3-21 00:00
那就使用filecomp吧,我因为没有在DOS 7.1下试,从说明上看,这两个程序都是用于纯DOS环境的,所以想当然的以为都可以用于DOS 7.1环境,我觉得filecomp应该是没有问题的。
作者: quan_zhou
时间: 2005-3-22 00:00
标题: 老是麻烦大家,真不好意思,STRINGS哪用下载?
Compfile DOS能正常使用。非常感谢!
请问大家能否提供Strings/Varset哪能下载, 我找了几天都下载不了。
[此贴子已经被作者于2005-3-22 14:01:59编辑过]
作者: Climbing
时间: 2005-3-22 00:00
varset到Horst的主页下载。用google搜索:Horst varsetHorst Schaeffer的主页:
http://home.nikocity.de/horst.muc/int/
Bart的主页:
http://www.nu2.nu
我常用的命令行工具请在这里下载:
Climbing常用的DOS命令行工具压缩安装包(11M左右)
作者: 32211001
时间: 2005-3-22 00:00
Quote: |
我常用的命令行工具请在这里下载:Climbing常用的DOS命令行工具压缩安装包(11M左右) |
|
先谢谢climbing,再问一下:好人做到底吧,请问climing是不是大概写个注释出来啊?要不怎么用啊?
作者: Climbing
时间: 2005-3-23 00:00
没法满足你这种要求(这几乎可以算是无理要求),我的安装包中大概有几百个程序,我不可能一一为这些程序写说明作注释,大部分程序你可以通过运行加/?参数(或者-h, --help)来获得帮助,不明白的你就不要用,还有很多程序的说明文档就在其所在目录下的同名txt文件中。请楼上搞清楚,别人没有义务去手把手教你做什么,很多时候学东西是要靠自己的努力的。
作者: quan_zhou
时间: 2005-3-23 00:00
我把Chehui530的代码改了一下,功能基本上实现了,但总是觉得不是很完善。
如果我的那引些txt、bat的文件名不是数字的,而是随机的英文字母,请问各位前辈那
又要怎么写?
我的内容如下:
TEST.bat
------------------------
@echo off
:start
string a=add %b%,1
compfile d:\mods.log %a%.log /v /a /s
if errorlevel 128 goto bat
if errorlevel 64 goto reture
:reture
string b=add %b%,1
goto start
if %b%==101 goto end
:bat
call %a%.bat
:end
作者: chenhui530
时间: 2005-3-23 00:00
要是是随即数很难
作者: willsort
时间: 2005-3-24 00:00
Re chenhui530: 这不是随机数的问题,而是文件遍历的问题,也就是说,楼主想实现与任意名字的log文件比较,这用for就足够了。如果操作比较复杂,可以在for内Call它的字程序即可。 至于比较,FC完全可以用,用FIND查找FC的输出是否包含文件不存在相异的字串即可,你不是已经这样用了吗? 所以说,这个程序目前可以不需要第三方程序辅助,就可以满足楼主的要求了。
作者: chenhui530
时间: 2005-3-24 00:00
to willsortwillsort兄好像不使用第三方工具不能完成哦!也许是我知识有限吧!请willsort兄公布出完美的程序给大家学习
作者: Climbing
时间: 2005-3-24 00:00
willsort这回是犯错误了,DOS 7.1下的fc是根本没有这种功能的。
作者: willsort
时间: 2005-3-24 00:00
Re chenhui530:
想差了一点,关键的问题在于获得文件的主文件名,这一点for很难完成,所以改用文件遍历循环。
关于文件遍历,如果你仔细看过我曾发过的关于文件遍历的帖子的话,便会明白这个程序只是那些程序的一个变形而已。他们都利用了一类从文本文件根据行、列/单词的地址获取的单词串的算法,即利用debug 生成一个不含回车的命令行前缀,然后链入文本中进行处理。利用此类方法,也可以获取文件的扩展名、完整路径、所在目录、文件大小、日期时间、文件属性等信息,甚至也可以获得我们在XP下很难获得的相对路径,但是算法的复杂度和效率都降低了其实用性。这样,你能更加体会到我的无奈了吧。
Re quan_zhou:
程序要求在命令行执行,因为你的设计需求不明确,所以使用了命令行参数确定比较文件。比如:
cmprcall c:\x.txt d:\ log
这就是将c:\x.txt与d:\下的所有.log文件比较了。
对于你的设计初衷有些建议,关于目标匹配与执行,我建议使用单独的批处理程序,而不是根据匹配调用多个批处理,这样可以节约硬盘空间开销,同时一定程度上可以简化程序,当然如果你有特别的需要必须如此实现,那么例外。另外,那个test.bat也有些问题,比如if %b%==101 goto end永不被执行,变量%b%每次递增2等等。
Re climbing:
DOS/Win9x的FC确实不返回errorlevel,但是FIND返回,所以可以用FIND鉴定FC的比对结果。我早期的文件遍历程序便曾如此用过,
chenhui530兄也曾如此用在了NT环境下的程序中,当然,那是不必要的。不知你是否另有所指?
Quote: |
:: CmprCall.bat - 将一文件与一组文件比较,执行对应的批处理
:: Will Sort - 11:54 2005-3-24
:: 程序稍作修改,可以改为其他名字使用了
@echo off
if "%1"=="$" goto %2
if "%3"=="" goto end
set src=%1
:MakeList
dir %2.\*.%3 | find /i " %3 ">~visit.lst
:MakePreLine
echo %0 $ Compare > ~visit.pre
for %%c in (rcx 17 w q) do echo %%c>> ~visit.asd
debug ~visit.pre < ~visit.asd > nul
rem if [%OS%]==[Windows_NT] chcp 936 > nul
:LoopVisit
copy /a ~visit.pre+~visit.lst ~visit.bat > nul
call ~visit.bat
if not "%matched%"=="" goto Clear
find "%0 $ Compare " /v < ~visit.bat > ~visit.lst
goto LoopVisit
:Compare
if "%3"=="" set matched=!failed!
if "%3"=="" goto end
if not exist d:\%3.bat goto end
fc %src% d:\%3.%4 | find "FC: no differences encountered">nul
if not errorlevel 1 call %3.bat
if not errorlevel 1 set matched=!success!
goto end
:Clear
del ~visit.*
set matched=
set src=
:End |
|
[此贴子已经被作者于2005-3-24 14:11:31编辑过]
作者: chenhui530
时间: 2005-3-24 00:00
to willsort我不会使用debug对你的这个程序也是真的看得不太懂!willsort兄能作解释下吗?
作者: Climbing
时间: 2005-3-24 00:00
Re willsort:是的,是我错了,我没有发现DOS7.1下的fc比较相同的文件后会返回那个“文件没有相异处(英文)”的字符串,我以为不会有任何返回值呢。要不怎么说Willsort是高手呢,佩服的五体投地!
作者: willsort
时间: 2005-3-25 00:00
Re chenhui530: 今天没有时间写太多了,先给你一个旧帖的链接吧:
三个文件遍历的批处理(实际上是5个)
作者: quan_zhou
时间: 2005-3-25 00:00
非常感谢大家的帮助!
我现在正在消化WillSort兄的这批处理, 有太多的地方不明白我先去查资料, 因为我太菜了。
实在消化不了的时候再向大家请教。 谢谢大家!