Board logo

标题: 疑难征解:批处理中的find应用 [打印本页]

作者: willsort     时间: 2004-11-18 00:00    标题: 疑难征解:批处理中的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中的字符串,如果无法可以求其次;本次征解无任何额外奖励,只是借此开阔一下大家的编程思路而已。
作者: Climbing     时间: 2004-11-19 00:00
看不明白你的意图,不知道你所谓的find_A和find_B只是这两条Find语句的代号,还是代表一个具体的命令(例如使用Find语句的两个批处理),既然要区分出两条不同的Find,那可以肯定的就是这两个find之间必定有可供区分的标志。高手写的批处理让人看不懂,连出的问题也让人看不懂,晕ing...
作者: willsort     时间: 2004-12-4 00:00
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 <...>....
作者: Climbing     时间: 2004-12-4 00:00
想破脑袋,发现这两条语句是一个悖论,无论如何我也找不到一个唯一标识自己的标志,如果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

作者: willsort     时间: 2004-12-6 00:00
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=


作者: Climbing     时间: 2004-12-6 00:00
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=


作者: Climbing     时间: 2004-12-6 00:00
实现的确实很巧妙,关键处就在于%me%环境变量的使用及引用,导致两个find语句出现完全不同的标志,高,实在是高!
作者: willsort     时间: 2004-12-6 00:00
Re Climbing:    “/v” 是反过滤参数,是必要的,因为“find_B 可以将find_A所在行之外的所有行过滤至程序test2.bat中“
作者: Climbing     时间: 2004-12-6 00:00
Sorry,我没有看清原题意,我还以为是Find_a过滤Find_b所在的行,而Find_b则过滤Find_a所在的行呢。
作者: nsdos     时间: 2005-12-24 13:06
我倒。。。
你们俩在这里慢慢玩吧,

我闪,我闪
作者: 220110     时间: 2005-12-24 17:59
路过就不要发贴了嘛。

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

支持这种求解贴!但不要太过难了,让人望而却步。
作者: htysm     时间: 2006-6-28 07:56
说实话,就是用C++编程,程序员也会标注说明的,可我看到这个DOS论坛里的高手写出的高难度高技巧的批处理从来就没有说明,让我等菜鸟看得云头雾里,一行批处理我要看半个钟头还不知所以然.如果在后边标注个说明岂不事半功倍.

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

[ Last edited by htysm on 2006-6-28 at 08:00 ]
作者: zhaxi     时间: 2006-6-28 13:05
恩,有道理。我本来以为dos批处理实现不了什么功能的。没有想到来了这个dos联盟,才知道高手竟然是那样的高! 他们写的东西我知道很经典,也很羡慕。可惜就是看不太懂。哈哈。估计我要再学半年才能看懂他们写的一半吧。

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

我们公司规定对90%以上的代码要作注释,哈哈。
作者: net72     时间: 2009-8-30 04:38


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

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