Board logo

标题: [文件操作] 判断批处理自身并论批处理的生存法则 [打印本页]

作者: cjiabing    时间: 2009-4-29 10:45     标题: 判断批处理自身并论批处理的生存法则

写一个有点无聊的问题——如何让批处理判断自身并且将自身结束?
问题缘起一个朋友出的题目:删除自身。
批处理很容易处理。假设批处理名称是   123.bat    ,批处理代码一行即可:del 123.bat   。  
后来我由此想到一个问题,就是在同一个文件夹中同时运行两个批处理,如何让其中的一个将自身结束而不会将另外一个结束?
我费了半天思量才把问题解决了,谁知道他们都用   %0   命令,晕倒!~所以说这个题目有点无聊。
但我的努力也不是白费的,用其它方法我也解决了这个“难题”,下面是我发明的“超级命令”:
  1. @echo off
  2. findstr  "flshfindstrfortaskkillmyselfifgotoformatfail"  *.bat
  3. pause
复制代码

大家将它保存为批处理,或者将它加入到其它批处理里面,你会发现,它能判断出正在运行中的批处理名称,基本上是准确无误!~
也许它比  %0  ,显得罗嗦,但它再一次证明了脆弱而万能的批处理的一个真理——批处理不是万能的,同时,批处理万能!~——什么狗屁不通的文字?~!写过批处理的同志——废话,哪个没写过?——都应该深有体会,批处理走路一般不是直直走的,往往是拐弯抹角的走。原因是批处理功能太有限了,命令太少了,所以要解决一些问题通常要借助第三方命令,或者是——换个角度、换种思维方式来解决的,这就是批处理生存的一个基本法则,弱者的生存法则。
这是一种很重要的批处理思维。比如,在批处理处理文本的命令中,提供了忽略前面几行的命令skip,但没有提供忽略后面几行的命令,提供了提取列的for /f  tokens= 但没有提供提取行的命令!~你要实现批处理没有提供的功能,你只能通过其它的方式实现,通过组合常常的批处理代码实现。比如提取行的一个简单的方法:
  1. @echo off
  2.     findstr /n .* 12.txt>>122.txt
  3.     set /p m=请输入要定位的行:
  4.     findstr   /b "%m%" 122.txt
  5.     pause
复制代码

这里用到了findstr和set命令,主要是通过findstr来给每行安排行号,然后提取指定的行号,它的功能是有限的,假如文本中存在大量的数字,它就无能为力了。当然,你还可以换另外一种思路来写代码,不管你怎么写,你都无法直接用一个命令来实现,所以,你只能不停的换思路,实现这个功能的基础是,你要对其它代码非常熟悉,运用起来熟练。
回到前面,一个%0能实现的问题,我用一行命令findstr  "flshfindstrfortaskkillmyselfifgotoformatfail"  *.bat 来实现了,虽然罗嗦了点,但是训练了我批处理的发散和转换思维,这个很重要,送给新手!~
最后出道题,用批处理结束自身的进程(taskkill)。
作者: Batcher    时间: 2009-4-29 12:02

如果当前目录下有1万个批处理,而且每个批处理中都包含字符串“flshfindstrfortaskkillmyselfifgotoformatfail”,请问按照你的思路如何判定到底运行的是哪个批处理?
作者: Batcher    时间: 2009-4-29 12:04

主要是通过findstr来给每行安排行号,然后提取指定的行号,它的功能是有限的,假如文本中存在大量的数字,它就无能为力了

能不用临时文件的时候最好别用,这个功能完全可以用for+findstr来解决。
作者: cjiabing    时间: 2009-4-29 12:40

原帖由 Batcher 于 2009-4-29 12:02 发表
如果当前目录下有1万个批处理,而且每个批处理中都包含字符串“flshfindstrfortaskkillmyselfifgotoformatfail”,请问按照你的思路如何判定到底运行的是哪个批处理?

flshfindstrfortaskkillmyselfifgotoformatfail——这只不过是一个身份标记,相当于ID一样,你一万个批处理身份都一样了肯定判断不出来了,难道你不会设置成不同的字符串啊?
——该代码是以前写的,所以用临时文件了,偶也是个菜鸟,大人严格要求了~!谢谢
作者: Batcher    时间: 2009-4-29 12:45     标题: 回复 4楼 的帖子

难道你不会设置成不同的字符串啊?

难道你这个思路就是为了让别人挨个去修改1万个“标记”?
作者: cjiabing    时间: 2009-4-29 12:51

原帖由 Batcher 于 2009-4-29 12:45 发表

难道你这个思路就是为了让别人挨个去修改1万个“标记”?

如题所述,——这是一个无聊的问题!~不必浪费大人的宝贵时间
作者: Batcher    时间: 2009-4-29 12:58     标题: 回复 6楼 的帖子

关键不是这个问题是否无聊,而是你的思路能否正真解决问题。
作者: 随风    时间: 2009-4-29 14:22

楼主的钻研精神还是可嘉的,至少对finstr 命令明白了许多,findstr是批处理中唯一的正则,作用及功能是很强大的,如果善用,很多时候能达到事半功倍的效果。只是用顶楼这种方式来判断自身不是个有效的办法,问题无不无聊无所谓,很多收获都是从无聊中获得的。
作者: inittab    时间: 2009-4-29 17:35

楼主说的那个例子。有很多种方法可以解决.
比如

for /f "delims=" %%a in ('type a.txt ^| more +%n%') do echo %%a&goto :eof




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2