中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-02 15:03
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » [求助][讨论]有没有高手可以在纯dos下做到这个功能? 查看 3,122 回复 33
16 发表于 2008-07-29 21:56 ·  中国 河南 新乡 电信
初级用户
积分 34
发帖 16
注册 2008-07-24 17:55
17年会员
UID 122015
性别 男
状态 离线
我是这样测试的,读的文件是jieguo.txt
find /v "OK" A:\jieguo.txt
if errorlevel 1 goto end
echo 222

:end
echo 333
不管取值0或者是1,结果都是显示 222 333,取值2以上,都是显示333
17 发表于 2008-07-29 22:06 ·  中国 上海 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
如果是这样的话,说明退出码>=2,find 没能完成搜索,在搜索时发生了错误。你的 A:\jieguo.txt 有什么问题?不一定要用 A: 来测试。
18 发表于 2008-07-29 22:18 ·  中国 河南 新乡 电信
初级用户
积分 34
发帖 16
注册 2008-07-24 17:55
17年会员
UID 122015
性别 男
状态 离线
可是,find已经正常的完成了,结果是对的。怎么查看上一个命令的返回值?
19 发表于 2008-07-29 22:32 ·  中国 上海 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
command 下没办法直接看退出码,只能根据 errorlever 来判断,除非用 4DOS 。
结果是对的?对什么对,根据你的语句和结果就是不对的。“不管取值0或者是1,结果都是显示 222 333,取值2以上,都是显示333”,这就说明了说明退出码>=2 。find 结束了搜索不一定说明是正常完成了。其实你不一定要用原文件来测试,就在硬盘上建一个文件,内容只有一个 OK ,然后删除这个 OK 或者改成其它内容不就得了?
20 发表于 2008-07-29 22:37 ·  中国 河南 新乡 电信
初级用户
积分 34
发帖 16
注册 2008-07-24 17:55
17年会员
UID 122015
性别 男
状态 离线
可是 只要有一个不同的地方,哪怕是在文件的最后一行,也可以在屏幕回显出来的。
论坛里帖出来的那个jieguo.txt只是其中一部分,其实这个文件有2000行左右,跟这个有关系吗?
21 发表于 2008-07-29 23:13 ·  中国 上海 杨浦区 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
我不知道 find 搜索文件的大小和行数的上限,我想上千行应该不是什么问题吧,写一个程序几万行都不稀奇。我特地建了个有2048行,每行内容都是ok的文件,第2049行不是ok,试下来没什么问题,返回的结果和退出码完全在意料之中。

你为什么不在硬盘上试一下
22 发表于 2008-07-29 23:38 ·  中国 河南 新乡 电信
初级用户
积分 34
发帖 16
注册 2008-07-24 17:55
17年会员
UID 122015
性别 男
状态 离线
那我再试一下 看看是不是我这里出了什么问题
23 发表于 2008-07-30 00:03 ·  中国 江西 南昌 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
MS-DOS 7.1可以用command /z 查看 errorlevel
也可以自己写一个简单的批处理检测errorlevel
24 发表于 2008-07-30 02:07 ·  中国 上海 杨浦区 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
我后来又试验了下,看来 find 的退出码不是我们想像的那样,具体分析等会儿在说。
25 发表于 2008-07-30 06:12 ·  中国 河南 新乡 电信
初级用户
积分 34
发帖 16
注册 2008-07-24 17:55
17年会员
UID 122015
性别 男
状态 离线
等你们的消息了,我一直在等在好消息呢。
26 发表于 2008-07-30 08:24 ·  中国 安徽 马鞍山 电信
金牌会员
★★★★
积分 3,946
发帖 1,884
注册 2006-01-20 13:00
20年会员
UID 49283
性别 男
状态 离线
STRINGS [目标变量=]LEFT 源字符串 要取的字符数量 〈从左边取源字符串的指定字符数量〉
Windows 一键还原
http://www.yjhy.com
27 发表于 2008-07-30 13:53 ·  中国 上海 杨浦区 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
先说一下 FIND 的退出码说明

FIND exit codes

The following list shows each exit code and a brief description of its meaning:

0
The search was completed successfully and at least one match was found.

1
The search was completed successfully, but no matches were found.

2
The search was not completed successfully. In this case, an error
occurred during the search, and FIND cannot report whether any matches
were found.




建立一个只有一行 ok 内容的文件 txt ,用 FIND 不同的参数来执行查看结果和退出码:

D1.

find "ok" txt

---------- TXT
ok

exitcode = 0

//找到了要找的字符,返回退出码0,正常

D2.

find/v "ok" txt

---------- TXT

exitcode = 0

//按理,这里应该是没有找到要找的字符,为什么返回的退出码是0 ?难道一个不存在的行也算是找到?但是,同样也是“找到”,下面第四个例子返回的却是1

D3.

find "w" txt

---------- TXT

exitcode = 1

//没有找到要找的字符,返回的退出码是1,正常

D4.

find/v "w" txt

---------- TXT
ok

exitcode = 1

//找到了不包含 w 字符的行,也就是找到要找的字符,按理,这里的退出码应该是0,它为什么返回的是1?

现在,在把 txt 文件内容修改一下,增加一行 not 内容,再按照上述参数执行一下,看看结果:

D5.

find "ok" txt

---------- TXT
ok

exitcode = 0

//

D6.

find/v "ok" txt

---------- TXT
not

exitcode = 0

//

D7.

find "w" txt

---------- TXT

exitcode = 1

//

D8.

find/v "w" txt

---------- TXT
ok
not

exitcode = 1

//

具体我就不解释了,和前面一样,退出码的顺序同样也为 0 0 1 1 。我在 MS-DOS 6.22 和 MS-7.10 下的 FIND 得出相同的结果。

后来我又测试了下 WindowsXP 下的 FIND ,被测文件内容和参数顺序同上。

只有内容为 ok 的 txt 文件:

X1.

find "ok" txt

---------- TXT
ok

exitcode = 0

//找到了要找的字符,退出码为0,正常

X2.

find/v "ok" txt

---------- TXT

exitcode = 1

//没有找到要找的字符,退出码为1,正常

X3.

find "w" txt

---------- TXT

exitcode = 1

//没有找到要找的字符,退出码为1,正常

X4.

find/v "w" txt

---------- TXT
ok

exitcode = 0

//找到了不包含 w 的行,也就是查找到了要找的内容,退出码为0,正常

现在, txt 文件内容增加 not 一行:

X5.

find "ok" txt

---------- TXT
ok

exitcode = 0

//找到了要找的字符,退出码为0,正常

X6.

find/v "ok" txt

---------- TXT
not

exitcode = 0

//找到了不包含 ok 的行,也是找到了要查找的内容,退出码为0,正常

X7.

find "w" txt

---------- TXT

exitcode = 1

//没有找到要找的字符,退出码为1,正常

X8.

find/v "w" txt

---------- TXT
ok
not

exitcode = 0

//找到了不包含 w 的行,也是找到了要查找的内容,退出码为0,正常


由此看来 DOS 下,确切的说是 MS-DOS 下(其它的 DOS 我还没试)的 FIND 命令的退出码有缺陷,缺陷在于加了 /v 参数后的退出码没有按照本意来返回,也就是我前面 D2 和 D4 的例子,在 Windows XP 下(我的是SP2版的)的 FIND 修正了这个 bug 。其它版本的 Windows 未作测试。

最后注明:为了方便查看退出码和结果重定向到文件,我在 DOS 下的测试环境是 4DOS ,在 Windows 下的命令行环境是 4NT ,我想这应该不会影响什么测试结果。
28 发表于 2008-07-30 13:56 ·  中国 上海 杨浦区 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
但是,从你的测试结果来看,这个缺陷应该和你的返回退出码是>=2无关。
结合你的具体应用,假如你的校验结果文件全是OK,和有一个不OK的,用 find /v "OK" 命令,返回的退出码都是0,无法判断。就像我前面的 D2 和 D6 的例子。

我不知道你用的是哪个 MD5 ,从你的参数格式来看,使用这样格式的应该是 md5sum.exe ,和 md5.exe 是两个不同的程序,这两个程序也提供了退出码,一般,生成过程和校验结果无误的话,返回的都是0,有错误总是>=1。
29 发表于 2008-07-30 15:32 ·  中国 上海 杨浦区 电信
金牌会员
★★★★
积分 4,639
发帖 2,239
注册 2005-01-30 00:00
21年会员
UID 35785
性别 男
状态 离线
再补充说明一下 D6 这个例子,看上去好像是对的,find 确实找到了不包含 ok 字符的行 not ,返回的是 0,但我认为其实这个和 D1 和 D5 返回的是 0 的原因一样,find 认为它找到了 ok ,而不是因为找到了不包含 ok 的行。
30 发表于 2008-07-31 05:28 ·  中国 河南 新乡 电信
初级用户
积分 34
发帖 16
注册 2008-07-24 17:55
17年会员
UID 122015
性别 男
状态 离线
太谢谢你了,我得好好看看。谢谢你这么耐心的测试,真的感激得不知道说什么好了。
为了您的耐心,我也得好好看看,多试试才对。
论坛跳转: