中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-16 04:06
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » (已结)为何我使用find /v 后得到了相反的结果? 查看 1,920 回复 10
楼 主 (已结)为何我使用find /v 后得到了相反的结果? 发表于 2005-10-07 11:05 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
UID 517
性别 男
状态 离线
各位老师:
我有一个tmp.txt文件,内容是:

Invalid keyboard code specified
C
D
E
F
G
H
J
K
L


我想在批处理a.bat中用了以下命令:
echo tmp.txt|find "Invalid" /V /i> .\_tmp.txt
想去掉tmp.txt文件的第一行内容:“Invalid keyboard code specified”,结果输出到当前文件夹的_tmp.txt文件当中,可是事与愿违,得到的_tmp.txt文件内容竟然是:Invalid keyboard code specified。

后来我将a.bat的命令改为:
find /v /i "Invalid"<tmp.txt > .\_tmp.txt
可是执行结果同上,这是为何?请老师们指点一下,谢谢!(我的目的是在dos下运行,现在是在winXP下进行测试的,我想Find命令在这两种系统下效果应该是相同的吧?)。
.
.

[ Last edited by willsort on 2005-10-11 at 00:58 ]
2 发表于 2005-10-07 12:16 ·  中国 辽宁 锦州 中移铁通
荣誉版主
★★★
积分 1,338
发帖 356
注册 2005-07-15 12:09
UID 40733
性别 男
状态 离线
你的第一条命令, echo tmp.txt| find ..... 肯定不是你要的结果,应该是 type tmp.txt| find .....
你的第二条命令,在我这里一点问题也没有,我也是winXP。
如果只是去掉文本第一行,不搜索确定位置的话,用这个命令试试
more +1 tmp.txt>_tmp.txt

[ Last edited by 无奈何 on 2005-10-7 at 12:17 ]
3 发表于 2005-10-07 14:18 ·  中国 河北 沧州 联通
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
UID 517
性别 男
状态 离线
Originally posted by 无奈何 at 2005-10-7 12:16 PM:
你的第一条命令, echo tmp.txt| find ..... 肯定不是你要的结果,应该是 type tmp.txt| find .....
你的第二条命令,在我这里一点问题也没有,我也是winXP。
妠...




谢谢你,兄弟!我根据你的提示重新作了测试,正如你所说:第一句的echo应该是type。而且以前没有成功的原因我也找到了,原来是在我所测试的目录里还存在一个find.com !把这个find.com改名为find.co_后再运行那个批处理就OK了。
再次谢谢你的帮助!
4 发表于 2005-10-07 16:08 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re sglxy:

“Invalid keyboard code specified”的错误提示,大多数是发生在命令行中运行16位DOS程序时。而你所提到的find.com正是这样一个程序,当在32位的CMD环境中运行时它的输出结果会比屏蔽,而只显示若干个空行,而如果将输出重定向到文件中,则会捕捉到一闪而过的“Invalid keyboard code specified”错误。因此,你的测试文件也很可能是某个16位DOS程序输出的。

这种限制的发生机理我尚未得到很好的解释,但是并不是所有的16位程序都会出现此问题,比如Debug运行后,便会将cmd调整至可接受16位程序的命令行环境,此后即使退出Debug,也仍然可以正常运行find.com等16位程序。

所以,如果在CMD的批处理中使用到了16位程序,我通常会在其前面加一行echo q|debug>nul来切换cmd状态,但此时的代码页会被调整为英文的437,所以如果需要中文的话,需要再加上一句graftabl 936来调整显示代码,而使用chcp 936是无用的,因为在任何16位程序运行时chcp代码页都会被强制切换为437。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
5 发表于 2005-10-08 07:28 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
UID 517
性别 男
状态 离线
噢,原来是这样,谢谢老师。那么我现在是在做自己的系统恢复盘,作成后主要用在DOS纯环境下,应该不用靠滤临时生成的文本文件中会出现这个“Invalid keyboard code specified”文字吧?也就是说在DOS下运行这些文件应该不会生成这行文字,是吗?
6 发表于 2005-10-08 10:18 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
Re sglxy:
是的,在纯DOS环境下不需要过滤这行字符。

Re willsort:
请问graftab是什么命令?
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
7 发表于 2005-10-08 19:30 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
UID 517
性别 男
状态 离线
谢谢Climbing老师,对了,还有一个问题想向你们请教。我在http://www.cn-dos.net/forum/viewthread.php?tid=17147&fpage=1 这个帖子中曾得到willsort老师的指点,他教给我使用“locate *.gho /n /f1 /b:"set _ghofile=" > _setghof.bat”命令将gho文件加入到%_ghofile%变量中,非常实用。
但是我接着又发现一点,在生成的_setghof.bat文件中的“set _ghofile=" 字符串后面多了一个空格,_setghof.bat 内容如下:
set _ghofile= F:\sysbak\IBM.GHO (注意,在”F:“之前多了个空格)
我试过了生成的变量中在”F:“之前也是多了个空格,请问这个情况是怎么回事,会不会影响ghost的运行效果? 有没有必要用CHANGE命令去掉空格? CHANGE在纯dos下是否也能用? 请willsort和Climbing老师在百忙之中指点一下,谢谢。
...

[ Last edited by sglxy on 2005-10-8 at 19:35 ]
8 发表于 2005-10-08 19:59 ·  中国 广东 广州 海珠区 电信
金牌会员
★★★★
D◎$ Fαп
积分 4,562
发帖 1,883
注册 2004-01-19 00:00
UID 15812
性别 男
来自 广东广州
状态 离线
Originally posted by sglxy at 2005-10-8 19:30:
我试过了生成的变量中在”F:“之前也是多了个空格,请问这个情况是怎么回事,会不会影响ghost的运行效果? 有没有必要用CHANGE命令去掉空格? CHANGE在纯dos下是否也能用?


没必要去掉空格。不影响GHOST的运行的。CHANGE是什么命令?是DOS的外部命令还是Linux的?
----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
9 发表于 2005-10-08 20:42 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
UID 517
性别 男
状态 离线
感谢JonePeng老兄的回答,CHANGE可以在用行命令的方式替换文本文件中的内容,使用方法是:change d:\文件夹\*.txt /from "要更换的字符段" /to "更换后的内容"。只是我一直在Winxp下使用它,就是不知道CHANGE在纯dos下是否也能用?我在以前纯dos下试了一次没成功,有哪位明白的兄弟请告知,先谢谢了!
10 发表于 2005-10-08 21:04 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re sglxy:

change 应该是16位的DOS程序,除非你我所接触的不是一个版本。这是我所见到的Change的版本说明:


CHANGE pgm by Bruce Guthrie, (c)2001 U.S. Dept of Commerce Revised 03/10/2001


Re Climbing:

graftabl 是XP自带的命令行工具,2000下也应该有。这是引用自WindowsXP帮助文档中的文字。


Graftabl启用可在图形模式下显示扩展字符集的功能。

语法
graftabl

参数
xxx
指定要在所定义的图形模式中显示扩展字符的代码页。下表显示了每个有效代码页标识号及其国家(地区)或者语言: 值 国家(地区)
437 美国
850 多语言(拉丁文 I)
852 斯拉夫语(拉丁文 II)
855 西里尔文(俄语)
857 土耳其语
860 葡萄牙语
861 冰岛语
863 加拿大 - 法语
865 日耳曼语
866 俄语
869 现代希腊语

/status
标识 graftabl 正在使用的代码页。
/?
在命令提示符显示帮助。
注释
有关使用代码页的信息,请参阅“相关主题”中的 chcp 或 mode (设置设备代码页)。
Graftabl 不更改控制台输入代码页。Graftabl 只影响指定代码页扩展字符的监视器显示。要更改正在使用的代码页,请使用 mode 或 chcp 命令。
理解 graftabl 退出码
下表列出了每个退出码及其简单描述。

退出码 说明
0 已成功装载字符集。未装载过去的代码页。
1 指定了不正确的参数未执行操作。
2 发生文件错误。

可以在批处理程序的 if 命令行上使用 errorlevel 参数来处理由 graftabl 返回的退出代码。
范例
要将代码页 437(美国)的图形字符集加载到内存,请键入:

Graftabl 437

要将代码页 850(多语种)的图形字符集加载到内存,请键入:

Graftabl 850


[ Last edited by willsort on 2005-10-8 at 21:35 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
11 发表于 2005-10-08 21:34 ·  中国 河北 沧州 任丘市 华北油田网络
中级用户
★★
MS-DOS爱好者
积分 397
发帖 87
注册 2002-12-15 00:00
UID 517
性别 男
状态 离线
谢谢了willsort老师,你的意思是change本身是16位DOS下的程序,看来是我自己的问题,我再慢慢研究。
论坛跳转: