[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 判断批处理自身并论批处理的生存法则

写一个有点无聊的问题——如何让批处理判断自身并且将自身结束?
问题缘起一个朋友出的题目:删除自身。
批处理很容易处理。假设批处理名称是   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)。

如果当前目录下有1万个批处理,而且每个批处理中都包含字符串“flshfindstrfortaskkillmyselfifgotoformatfail”,请问按照你的思路如何判定到底运行的是哪个批处理?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

能不用临时文件的时候最好别用,这个功能完全可以用for+findstr来解决。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

TOP

回复 4楼 的帖子

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

难道你这个思路就是为了让别人挨个去修改1万个“标记”?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

如题所述,——这是一个无聊的问题!~不必浪费大人的宝贵时间

TOP

回复 6楼 的帖子

关键不是这个问题是否无聊,而是你的思路能否正真解决问题。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

楼主的钻研精神还是可嘉的,至少对finstr 命令明白了许多,findstr是批处理中唯一的正则,作用及功能是很强大的,如果善用,很多时候能达到事半功倍的效果。只是用顶楼这种方式来判断自身不是个有效的办法,问题无不无聊无所谓,很多收获都是从无聊中获得的。
技术问题请到论坛发帖求助!

TOP

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

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

TOP

返回列表