Board logo

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

作者: tacyeh    时间: 2012-10-25 13:31     标题: [已解决]批处理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时候循环会多执行?
作者: apang    时间: 2012-10-25 18:22

因为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了。
作者: tacyeh    时间: 2012-10-26 11:17

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

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



    3Q,谢谢详细解答!




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