中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-16 10:30
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 疑难征解:批处理中的find应用 查看 5,648 回复 13
楼 主 疑难征解:批处理中的find应用 发表于 2004-11-18 00:00 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
To All:
应用平台:Windows 9x / Windows NT's / MS-DOS 6.xx
问题描述:批处理程序 test.bat 中有两个find语句,分别是find_A与find_B。他们的作用为:find_A 可以将find_B所在的行过滤至程序test1.bat中,find_B 可以将find_A所在行之外的所有行过滤至程序test2.bat中。请问find_A和find_B如何编写?
附加说明:程序应该可以在以上提到的三种平台下均可运行,如果无法可以求其次;程序中其他语句无法确定其内容,它可含有任何可能出现在find_A和find_B中的字符串,如果无法可以求其次;本次征解无任何额外奖励,只是借此开阔一下大家的编程思路而已。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
8417a +1 2010-01-07 15:43
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2 发表于 2004-11-19 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
看不明白你的意图,不知道你所谓的find_A和find_B只是这两条Find语句的代号,还是代表一个具体的命令(例如使用Find语句的两个批处理),既然要区分出两条不同的Find,那可以肯定的就是这两个find之间必定有可供区分的标志。高手写的批处理让人看不懂,连出的问题也让人看不懂,晕ing...
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
3 发表于 2004-12-04 00:00 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re Climbing: find_a 和 find_b 都只是语句的代号,真正的实现仍然使用外部命令find。至于可供区分的标志肯定应该有,只是这个标志有些特殊性。因为find_b的标志不能出现在find_a中,否则就无法实现对find_b的单独过滤,但是find_a本身又要求可供识别的find_a标志,所以遇到了矛盾。比如下面的情况,find_b:便同现在find_a与find_b中,无法单独过滤其中的find_a和find_b。 总结:find语句过滤/反过滤自身所在批处理中的某一条语句,但不能过滤/反过滤自身,如何来实现? find_a: find "find_b:" <...>... find_b: find "find_a:" /v <...>....
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
4 发表于 2004-12-04 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
想破脑袋,发现这两条语句是一个悖论,无论如何我也找不到一个唯一标识自己的标志,如果find命令支持正则表达式,那么问题就很容易解决。我知道肯定是有解决方法的,但我太愚笨了。因此,请willsort兄公布答案。在Windows 2000/xp/2003(支持findstr命令)下可以用这个批处理:
@echo off
set src=
if exist %0.cmd set src=%0.cmd
if %src%#==# if exist %0.bat set src=%0.bat
if %src%#==# set src=%0
TYPE %src% | findstr "^type" > test1.bat
type %src% | findstr "^TYPE" > test2.bat
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
5 发表于 2004-12-06 00:00 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re Climbing: 等了许久,只有Climbing兄一人做答,看来此题实在不适合作为争鸣类的题目。之所以将此题提出来讨论,是因为确实曾经有人实现过,但已经随着我的前期资料一起轶失了。而我现在的答案也不很完善,所以希望有人可以查缺补遗。下面是我的解答,它的缺憾之处,在于无法保证它的关键字在其它语句中不会出现。
@echo off
if exist %0 set me=%0
if exist %0.bat set me=%0.bat
echo find a in %me%
find " < %%me%% > test2.bat" < %me% > test1.bat
echo find b in %me%
find " < %%me%% > test1.bat" /v < %me% > test2.bat
set me=
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
6 发表于 2004-12-06 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
willsort兄的程序有些问题,修改如下:

@echo off
if exist %0 set me=%0
if exist %0.bat set me=%0.bat
echo find a in %me%
find " < %%me%% > test2.bat" < %me% > test1.bat
echo find b in %me%
:: 下面一行应该没有/v的。
find " < %%me%% > test1.bat" < %me% > test2.bat
set me=
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
7 发表于 2004-12-06 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
实现的确实很巧妙,关键处就在于%me%环境变量的使用及引用,导致两个find语句出现完全不同的标志,高,实在是高!
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
8 发表于 2004-12-06 00:00 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re Climbing: “/v” 是反过滤参数,是必要的,因为“find_B 可以将find_A所在行之外的所有行过滤至程序test2.bat中“
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
9 发表于 2004-12-06 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
Sorry,我没有看清原题意,我还以为是Find_a过滤Find_b所在的行,而Find_b则过滤Find_a所在的行呢。
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
10 发表于 2005-12-24 13:06 ·  中国 广东 东莞 联通
新手上路
积分 4
发帖 2
注册 2005-12-24 11:03
UID 47770
状态 离线
我倒。。。
你们俩在这里慢慢玩吧,

我闪,我闪
11 发表于 2005-12-24 17:59 ·  中国 广东 广州 白云区 电信
荣誉版主
★★★
积分 718
发帖 313
注册 2005-09-26 00:00
UID 42844
性别 男
状态 离线
路过就不要发贴了嘛。

不过也谢谢你顶起这经典的贴。

支持这种求解贴!但不要太过难了,让人望而却步。
12 发表于 2006-06-28 07:56 ·  中国 安徽 芜湖 电信
高级用户
★★★
积分 866
发帖 415
注册 2005-12-04 11:19
UID 46459
状态 离线
说实话,就是用C++编程,程序员也会标注说明的,可我看到这个DOS论坛里的高手写出的高难度高技巧的批处理从来就没有说明,让我等菜鸟看得云头雾里,一行批处理我要看半个钟头还不知所以然.如果在后边标注个说明岂不事半功倍.

可能是我等菜鸟太菜,让你们见笑了.但是我还要说.因为你这个论坛不就是要扶持新人吗?;):o

[ Last edited by htysm on 2006-6-28 at 08:00 ]
13 发表于 2006-06-28 13:05 ·  中国 广东 珠海 电信
初级用户
积分 112
发帖 40
注册 2006-06-23 19:52
UID 57473
性别 男
状态 离线
恩,有道理。我本来以为dos批处理实现不了什么功能的。没有想到来了这个dos联盟,才知道高手竟然是那样的高! 他们写的东西我知道很经典,也很羡慕。可惜就是看不太懂。哈哈。估计我要再学半年才能看懂他们写的一半吧。

尽管如此,来了这里我还是重新有了对批处理的认识,觉得很有前途。由于我是软件测试人员,所以我没有时间去搞专门的java等开发,自己只要编些简单的批处理程序就很知足了。生活过的开心。

我们公司规定对90%以上的代码要作注释,哈哈。
14 发表于 2009-08-30 04:38 ·  中国 广东 广州 荔湾区 电信
新手上路
积分 5
发帖 3
注册 2009-08-23 16:26
UID 150845
性别 男
状态 离线
Originally posted by htysm at 2006-6-28 07:56:
说实话,就是用C++编程,程序员也会标注说明的,可我看到这个DOS论坛里的高手写出的高难度高技巧的批处理从来就没有说明,让我等菜鸟看得云头雾里,一 ...

确实啊
以后真的希望高手们能在写一些高难度的批处理的时候写上注释!我们菜鸟看了也知道那个命令究竟怎么用,不然看了还是没有理解,水平还是无法提高!
论坛跳转: