标题: [文件操作] 判断批处理自身并论批处理的生存法则 [打印本页]
作者: cjiabing 时间: 2009-4-29 10:45 标题: 判断批处理自身并论批处理的生存法则
写一个有点无聊的问题——如何让批处理判断自身并且将自身结束?
问题缘起一个朋友出的题目:删除自身。
批处理很容易处理。假设批处理名称是 123.bat ,批处理代码一行即可:del 123.bat 。
后来我由此想到一个问题,就是在同一个文件夹中同时运行两个批处理,如何让其中的一个将自身结束而不会将另外一个结束?
我费了半天思量才把问题解决了,谁知道他们都用 %0 命令,晕倒!~所以说这个题目有点无聊。
但我的努力也不是白费的,用其它方法我也解决了这个“难题”,下面是我发明的“超级命令”:
- @echo off
- findstr "flshfindstrfortaskkillmyselfifgotoformatfail" *.bat
- pause
复制代码
大家将它保存为批处理,或者将它加入到其它批处理里面,你会发现,它能判断出正在运行中的批处理名称,基本上是准确无误!~
也许它比 %0 ,显得罗嗦,但它再一次证明了脆弱而万能的批处理的一个真理——批处理不是万能的,同时,批处理万能!~——什么狗屁不通的文字?~!写过批处理的同志——废话,哪个没写过?——都应该深有体会,批处理走路一般不是直直走的,往往是拐弯抹角的走。原因是批处理功能太有限了,命令太少了,所以要解决一些问题通常要借助第三方命令,或者是——换个角度、换种思维方式来解决的,这就是批处理生存的一个基本法则,弱者的生存法则。
这是一种很重要的批处理思维。比如,在批处理处理文本的命令中,提供了忽略前面几行的命令skip,但没有提供忽略后面几行的命令,提供了提取列的for /f tokens= 但没有提供提取行的命令!~你要实现批处理没有提供的功能,你只能通过其它的方式实现,通过组合常常的批处理代码实现。比如提取行的一个简单的方法:
- @echo off
- findstr /n .* 12.txt>>122.txt
- set /p m=请输入要定位的行:
- findstr /b "%m%" 122.txt
- 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 |