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

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

本帖最后由 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时候循环会多执行?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

因为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

评分人数

TOP

因为taskkill是一次性kill掉所有进程,并不是循环一次kill一个的,所以会出现多执行N-1次的情况。

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



    3Q,谢谢详细解答!

TOP

返回列表