![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-13 02:09 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 在批处理中如何关闭由批处理打开的程序? |
| 可打印版本 7,169 / 21 |
| 第1楼 NaturalJ0 | 发表于 2006-11-15 03:44 |
| 银牌会员 发帖 533 积分 1,181 | |
|
在批处理中如何关闭由批处理打开的程序? 举例:
在批处理中打开某记事本文件。 然后在批处理中要关闭它。 问题如下: 如果用 taskkill 的 /IM 关闭,会发现其它记事本程序的名称也全都是 notepad.exe ,达不到关闭指定的某一个的效果。 如果用 taskkill 的 /PID 关闭,又如何得知所需关闭的进程的 PID 号呢? 或者有比 taskkill 更方便的命令? 前些天就想到这个问题,到现在也没想出好办法,所以今天来听听大家的高见。 ![]() |
|
| 第2楼 electronixtar | 发表于 2006-11-15 04:46 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
我猜,start "test" notepad.exe 是不是给进程一个名字test呢?然后用 taskkill 杀这个名字?
|
|
| 第3楼 zh159 | 发表于 2006-11-15 05:00 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
start "test" notepad.exe显示的还是notepad.exe进程
用 VBS 激活“文件标题 - 记事本”,再 VBS 发送Alt+F4(要先保存的先发送Ctrl+s) |
|
| 第4楼 lxmxn | 发表于 2006-11-15 05:11 |
| 版主 发帖 4,938 积分 11,386 | |
|
electronixtar 可能没有试吧? 这个方法不行~ |
|
| 第5楼 ccwan | 发表于 2006-11-15 05:13 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
我试了一下,似乎不会,进程里名称也全都是 notepad.exe ,我又试了一下,依次打开几个bat文件,进程里都只显示cmd.exe,关注中……
|
|
| 第6楼 zh159 | 发表于 2006-11-15 05:24 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
简单的BAT转VBS
>>%Temp%\Temp.vbs echo WshShell.SendKeys "^s" 保存文件 >>%Temp%\Temp.vbs echo WshShell.AppActivate "自己修改文件标题 - 记事本" “自己修改文件标题”一般是文件名(如果文件夹选项打开显示文件扩展名则要加入扩展名) 如果是多个同文件标题的好像是随机的-_-|| |
|
| 第7楼 pengfei | 发表于 2006-11-15 05:52 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
1. 把批处理运行前记事本程序的PID值记录下来.
2. 打开记事本后, 将前后的PID值进行比对, 终止不匹配的PID所对应的程序. [ Last edited by pengfei on 2006-11-15 at 10:41 PM ] |
|
| 第8楼 namejm | 发表于 2006-11-15 06:04 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
其实,taskkill 命令提供了一个匹配窗口标题的参数,它就是 /fi 过滤器里的 WINDOWTITLE 选项,请看:
比如,我要关闭窗口标题为 taskkill.txt - 记事本 的文本文件,此时,用 taskkill /fi "windowtitle eq taskkill*" 就可以了。不过有点奇怪的是,这个选项中必须使用通配符*,否则,就不能关闭。 |
|
| 第9楼 3742668 | 发表于 2006-11-15 08:25 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
Re namejm:
匹配窗口需要加*的情况其实并不奇怪。因为windows窗口的标题本来就并非纯粹当前实例指定的标题,而是当前实例标题+窗口类的标题。例如我们打开联盟的IE窗口,就可以看到标题栏除了当前主题的标题外后面还加上了版块标题,联盟页标题以及系统自动加上的Microsoft Internet Explorer,系统加上的部分就是默认此类窗口标题。可以通过修改注册表来更改,记得以前是保存在hklm\software\microsoft\internetexplorer\main下一个包含字符title的键中,不过sp2中似乎更改了位置,但也可以通过gpedit.msc来修改。 在命令行中,获得完整的标题可以用tasklist /v来查看,查看前建议用mode设定加大缓冲区的宽度,否则会自动换行难以查看。 Re NaturalJ0: 结束指定进程最精确的莫过于通过pid来指定了,通过两次tasklist列表并比较差别可以得到启动进程的pid值,不过比较繁琐,还好可以通过wmic来简单实现: 另外,wmic process可以获得进程的ParentProcessId(父进程pid)和ProcessId(pid),通过ParentProcessId也可以获得父进程的进程名。 |
|
| 第10楼 pengfei | 发表于 2006-11-15 09:48 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
namejm版主用taskkill /fi 结束指定进程的办法简单省事.
而7楼通过比对两次PID值来终止后来开启的进程的方法. 3742668版主居然用wmic process一个语句就搞定了. 看来有时间得好好学习一下DOS命令了. |
|
| 第11楼 lxmxn | 发表于 2006-11-15 09:52 |
| 版主 发帖 4,938 积分 11,386 | |
查看前建议用mode设定加大缓冲区的宽度,否则会自动换行难以查看。 用tasklist /v /fo list查看标题就比较清晰了。 |
|
| 第12楼 NaturalJ0 | 发表于 2006-11-15 22:26 |
| 银牌会员 发帖 533 积分 1,181 | |
|
大家的方法真多啊。
如果不指定 PID ,似乎还是没法避免重名。 IM 或 TITLE 都有可能会相同。 IM 相同:比如运行两个记事本 TITLE 相同:比如用记事本打开两个同名文件(也可以是同一文件打开两次) 如果使用运行前比较的方法,似乎也不是很完美。 比如批处理打开记事本后定时两分钟后自动关闭它,而在这两分钟内又有多个记事本被打开。 3742668 版主的方法我试着换了其它程序,把记事本换成了 curl (上传文件),换成了播放器(播放视频)。但我都没试成功。(我不懂 WMIC ,可能是我不会用,用错了。不知应该如何使用。) 看了大家的讨论还真是学了不少新东西。非常感谢。^_^ |
|
| 第13楼 pengfei | 发表于 2006-11-15 22:38 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
Originally posted by NaturalJ0 at 2006-11-15 22:26: 代码稍微修改一下就可以符合你的要求了, 灵活... [ Last edited by pengfei on 2006-11-15 at 10:48 PM ] |
|
| 第14楼 NaturalJ0 | 发表于 2006-11-15 23:41 |
| 银牌会员 发帖 533 积分 1,181 | |
|
Re: pengfei
看了你的代码,我没理解。 我在你的代码中直接加了些(红色部分是我加的,黑色部分是你写的)。 你也可以试试效果。 [ Last edited by NaturalJ0 on 2006-11-15 at 11:43 PM ] |
|
| 第15楼 pengfei | 发表于 2006-11-15 23:58 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
我想这样你更容易看懂, 主要是灵活使用代码记录下批处理中打开记事本的PID.
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |