![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-07 12:13 |
共 48,040 主题排行 / 350,125 发帖 / 今日 0 篇 / 48,252 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 当第二个VBS运行时如何关掉第一个的进程 |
| 可打印版本 938 / 10 |
| 第1楼 hackhd | 发表于 2008-02-04 02:04 |
| 中级用户 发帖 102 积分 231 | |
|
当第二个VBS运行时如何关掉第一个的进程 kill "wscript.exe",1 '可能是脚本问题吧。检测一个的时候就是检测二个,把此代码保存为VBS,复制一分,运行第一个,再运行复制的那个,你会发现一会儿,两个WSCRIPT进程都给关闭了。郁闷,我只想当第二个VBS运行时关掉第一个VBS的进程。帮我修改修改代码吧
do msgbox ("1") msgbox ("2") msgbox ("3") msgbox ("4") msgbox ("5") loop function kill(pcs,xx) if jc(pcs,1) then on error resume next Set objwmiservice=getobject("winmgmts:\\.\root\cimv2") Set colprocesslist=objwmiservice.execquery ("select * from win32_process where name='"&pcs&"' ") for each objprocess in colprocesslist objprocess.terminate() next if xx=1 then taskkill=1 end if end function function jc(wr,gs) on error resume next wscript.sleep 5000 set y=getobject("winmgmts:\\.\root\cimv2") set x=y.execquery("select * from win32_process where name='"&wr&"'") i=0 for each j in x i=i+1 next if not er then if i>gs then jc=true else jc=1 end if end function function er() if err.number=0 then er=false else err.clear er=true end if end function |
|
| 第2楼 luckboy45 | 发表于 2008-02-04 09:44 |
| 中级用户 发帖 212 积分 487 | |
|
兄弟,貌似不能吧..正如P一样,如果是杀进程将杀掉所有CMD进程,包括自己....
|
|
| 第3楼 fastslz | 发表于 2008-02-04 14:31 |
| 铂金会员 发帖 2,315 积分 5,493 来自 上海 | |
|
查进程镜像路径获取PID杀PID就OK了
办年货了长话短说 这段代码实例只杀访问D:\Test目录的CMD.EXE进程 |
|
| 第4楼 slore | 发表于 2008-02-04 16:30 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
如果知道WMI查询到的顺序就好了。
如果是按运行顺序查询到的话,不用循环直接结束。。。应该是第一个。。 |
|
| 第5楼 hackhd | 发表于 2008-02-04 22:04 |
| 中级用户 发帖 102 积分 231 | |
|
哦也。问题是它有不有规律的顺序哦
|
|
| 第6楼 slore | 发表于 2008-02-05 02:27 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
迄今为止,多数人都知道 WMI 内没有内置用于排序返回数据的机制,您得到的是以看似随机的方式排序的数据。事实证明,有方法可以改变 WMI 的这种杂乱排序现象:不随机排序数据,而是按关键属性排序数据。假设我们运行的脚本返回关于计算机上运行的进程的信息。如果我们仅回显进程 Name,那么,似乎已经以随机方式返回了数据:
System Idle Process System smss.exe csrss.exe winlogon.exe services.exe lsass.exe 但请注意,如果我们回显进程 Name 旁的进程 Handle 会发生什么情况: System Idle Process 0 System 4 smss.exe 644 csrss.exe 716 winlogon.exe 740 services.exe 784 lsass.exe 796 您可以看到,没有关于它的随机排序:数据按关键属性 (Handle) 排序。您没有任何办法能改变排序顺序,但是,了解到 WMI 遵循可以预见的方式而不仅仅是以随机方式获取进程信息并将其显示在屏幕上,这仍然是一件令人鼓舞的事情。 如果您知道类的关键属性,也就知道了标识和检索该类的唯一实例的可靠方法。按 Name 检索进程无法保证实例的唯一性;现在,我们的测试计算机上有 5 个不同的 Svchost.exe 实例在运行。但是,按 Handle 检索进程肯定能保证实例的唯一性:如果我们请求含 Handle 1318 的进程,那么我们将只得到返回的含特定 Handle 的进程。您时常需要分离类的单个实例;关键属性是完成此操作的极佳方法。 ![]() ![]() ![]() ![]() ![]() |
|
| 第7楼 slore | 发表于 2008-02-05 02:42 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
不过上面的例子叙述有问题……
只能说明有顺序,但是千万不认为就是PID(HANDLE)的排序! 我测试了下。。。 但是结果是更令我们高兴的!的确是进程的执行顺序! |
|
| 第8楼 3742668 | 发表于 2008-02-05 11:33 |
| 荣誉版主 发帖 718 积分 2,013 | |
Originally posted by slore at 2008-2-5 02:42: 并不一定,至少我这里测试的结果是错误的。 实现楼主的目的,个人认为如果纯粹地用vbs来实现的话,最后分两种情况,第一种是前后两个vbs并非同一个文件,判断它们的CommandLine属性就可以将其分别开来. 另一种则是两个vbs是同一个文件重复执行的情况,则可以在vbs中分别打开一可执行程序,例如记事本,在打开记事本的代码段前先判断有没有notepad.exe进程,如果有,再看notepad的ParentProcessId是否和wscript.exe的pid相同,如果相同则结束之,再结束notepad.exe,然后再打开一notepad.exe以供下一次参考。 楼主有兴趣的话可以尝试一下,理论上是不存在任何问题的。 |
|
| 第9楼 slore | 发表于 2008-02-05 12:35 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
???我打开不同文件,不同程序,打开同一个文件。。。。然后按WMI返回的进程列表,重上向下通过PID结束进程……是我的顺序,不知道3742668你的结果是怎么样?有跳跃的?
|
|
| 第10楼 3742668 | 发表于 2008-02-06 12:54 |
| 荣誉版主 发帖 718 积分 2,013 | |
Originally posted by slore at 2008-2-5 12:35: 我的测试结果,pid大的并不一定就是后执行的。 |
|
| 第11楼 slore | 发表于 2008-02-06 13:07 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
7楼已经说了……
下次来了再仔细看看。 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |