中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 疑难征解:批处理中的find应用
作者:
标题: 疑难征解:批处理中的find应用 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  疑难征解:批处理中的find应用

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-1-7 15:43




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-11-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

看不明白你的意图,不知道你所谓的find_A和find_B只是这两条Find语句的代号,还是代表一个具体的命令(例如使用Find语句的两个批处理),既然要区分出两条不同的Find,那可以肯定的就是这两个find之间必定有可供区分的标志。高手写的批处理让人看不懂,连出的问题也让人看不懂,晕ing...



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-11-19 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-12-4 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 4 楼』:  

想破脑袋,发现这两条语句是一个悖论,无论如何我也找不到一个唯一标识自己的标志,如果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




偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-12-4 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  

Re Climbing:    等了许久,只有Climbing兄一人做答,看来此题实在不适合作为争鸣类的题目。之所以将此题提出来讨论,是因为确实曾经有人实现过,但已经随着我的前期资料一起轶失了。而我现在的答案也不很完善,所以希望有人可以查缺补遗。下面是我的解答,它的缺憾之处,在于无法保证它的关键字在其它语句中不会出现。

  Quote:
@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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-12-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 6 楼』:  

willsort兄的程序有些问题,修改如下:

  Quote:
@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=





偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-12-6 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 7 楼』:  

实现的确实很巧妙,关键处就在于%me%环境变量的使用及引用,导致两个find语句出现完全不同的标志,高,实在是高!



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-12-6 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 8 楼』:  

Re Climbing:    “/v” 是反过滤参数,是必要的,因为“find_B 可以将find_A所在行之外的所有行过滤至程序test2.bat中“



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2004-12-6 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 9 楼』:  

Sorry,我没有看清原题意,我还以为是Find_a过滤Find_b所在的行,而Find_b则过滤Find_a所在的行呢。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-12-6 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
nsdos
新手上路





积分 4
发帖 2
注册 2005-12-24
状态 离线
『第 10 楼』:  

我倒。。。
你们俩在这里慢慢玩吧,

我闪,我闪

2005-12-24 13:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
220110
荣誉版主




积分 718
发帖 313
注册 2005-9-26
状态 离线
『第 11 楼』:  

路过就不要发贴了嘛。

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

支持这种求解贴!但不要太过难了,让人望而却步。

2005-12-24 17:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
htysm
高级用户




积分 866
发帖 415
注册 2005-12-4
状态 离线
『第 12 楼』:  

说实话,就是用C++编程,程序员也会标注说明的,可我看到这个DOS论坛里的高手写出的高难度高技巧的批处理从来就没有说明,让我等菜鸟看得云头雾里,一行批处理我要看半个钟头还不知所以然.如果在后边标注个说明岂不事半功倍.

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

[ Last edited by htysm on 2006-6-28 at 08:00 ]

2006-6-28 07:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhaxi
初级用户





积分 112
发帖 40
注册 2006-6-23
状态 离线
『第 13 楼』:  

恩,有道理。我本来以为dos批处理实现不了什么功能的。没有想到来了这个dos联盟,才知道高手竟然是那样的高! 他们写的东西我知道很经典,也很羡慕。可惜就是看不太懂。哈哈。估计我要再学半年才能看懂他们写的一半吧。

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

我们公司规定对90%以上的代码要作注释,哈哈。

2006-6-28 13:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
net72
新手上路





积分 5
发帖 3
注册 2009-8-23
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by htysm at 2006-6-28 07:56:
说实话,就是用C++编程,程序员也会标注说明的,可我看到这个DOS论坛里的高手写出的高难度高技巧的批处理从来就没有说明,让我等菜鸟看得云头雾里,一 ...

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

2009-8-30 04:38
查看资料  发送邮件  发短消息 网志  OICQ (472607448)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: