找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25830|回复: 2

[系统相关] [已解决]批处理for循环查找进程用taskkill结束为何循环会多执行?

[复制链接]
发表于 2012-10-25 13:31:27 | 显示全部楼层 |阅读模式
本帖最后由 tacyeh 于 2012-10-26 11:18 编辑
  1. @ECHO OFF
  2. REM 结束进程
  3. TITLE 结束%~1进程
  4. REM NAME存进程名,默认结束bds.exe进程,如果传入有参数,则取第一个作为结束进程的对象。
  5. SET NAME="bds.exe"
  6. if not "%~1"=="" set NAME="%~1"
  7. REM 用TASKKILL结束进程,但是在打开多个Delphi时,此循环会多执行N-1次,原因不清楚,初级菜鸟求教。
  8. REM FOR /F %%L in ('TASKLIST ^|FINDSTR /I %NAME%') do TASKKILL /F /IM %%L
  9. REM 用ntsd.exe来结束进程,这个不会多执行。
  10. FOR /F "tokens=2 delims= " %%L in ('TASKLIST ^|FINDSTR %NAME%') do ntsd -c q -p %%L
  11. CLS
  12. ECHO 执行结束,即将关闭。
  13. ping 127.1 >NUL
复制代码
用taskkill时候循环会多执行?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-10-25 18:22:53 | 显示全部楼层
因为taskkill是一次性kill掉所有进程,并不是循环一次kill一个的,所以会出现多执行N-1次的情况。

可以这样解决:

1.不用FOR,将第8行改成:
  1. TASKLIST /fi "imagename eq %NAME%"|find /i "%NAME%"&&taskkill /f /im %NAME%
复制代码
2.一定要用For的话,将第8行的内容改成这样:
  1. FOR /F %%L in ('TASKLIST /fi "imagename eq %NAME%"^|find /i "%NAME%"') do Set Flag=1
  2. if defined Flag taskkill /f /im %NAME%
复制代码
PS:不建议tasklist|findstr "abc.exe"这样的写法,如果某个进程名恰好包含abc.exe(如123abc.exe),找到的就不止abc.exe了。

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2012-10-26 11:17:41 | 显示全部楼层
因为taskkill是一次性kill掉所有进程,并不是循环一次kill一个的,所以会出现多执行N-1次的情况。

可以这 ...
apang 发表于 2012-10-25 18:22



    3Q,谢谢详细解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 15:31 , Processed in 0.027728 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表