标题: [系统相关] [已解决]批处理for循环查找进程用taskkill结束为何循环会多执行? [打印本页]
作者: tacyeh 时间: 2012-10-25 13:31 标题: [已解决]批处理for循环查找进程用taskkill结束为何循环会多执行?
本帖最后由 tacyeh 于 2012-10-26 11:18 编辑
- @ECHO OFF
- REM 结束进程
- TITLE 结束%~1进程
- REM NAME存进程名,默认结束bds.exe进程,如果传入有参数,则取第一个作为结束进程的对象。
- SET NAME="bds.exe"
- if not "%~1"=="" set NAME="%~1"
- REM 用TASKKILL结束进程,但是在打开多个Delphi时,此循环会多执行N-1次,原因不清楚,初级菜鸟求教。
- REM FOR /F %%L in ('TASKLIST ^|FINDSTR /I %NAME%') do TASKKILL /F /IM %%L
- REM 用ntsd.exe来结束进程,这个不会多执行。
- FOR /F "tokens=2 delims= " %%L in ('TASKLIST ^|FINDSTR %NAME%') do ntsd -c q -p %%L
- CLS
- ECHO 执行结束,即将关闭。
- ping 127.1 >NUL
复制代码
用taskkill时候循环会多执行?
作者: apang 时间: 2012-10-25 18:22
因为taskkill是一次性kill掉所有进程,并不是循环一次kill一个的,所以会出现多执行N-1次的情况。
可以这样解决:
1.不用FOR,将第8行改成:- TASKLIST /fi "imagename eq %NAME%"|find /i "%NAME%"&&taskkill /f /im %NAME%
复制代码
2.一定要用For的话,将第8行的内容改成这样:- FOR /F %%L in ('TASKLIST /fi "imagename eq %NAME%"^|find /i "%NAME%"') do Set Flag=1
- 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 |