找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22933|回复: 10

[问题求助] 请改进一步结束进程的VBS代码

[复制链接]
发表于 2013-1-22 13:26:03 | 显示全部楼层 |阅读模式
以下是监控QQ程序并关闭它的代码,但有两个不足:
一是会出现类似病毒提示的“有程序要结束QQ进程,是否允许执行?”,如何去除?
二是不能出现“此程序已禁止运行,5秒后将自动关闭”这样的提示框,
哪位高手能改进?谢谢!
  1. do
  2. set ws=createobject("wscript.shell")
  3. dim test
  4. test=False
  5. set wing=getobject("winmgmts:\\.\root\cimv2")
  6. set jincheng=wing.execquery("select * from win32_process where name='QQ.exe'")
  7. For Each id In jincheng
  8. test = True
  9. Next
  10. If test then
  11. ws.run"taskkill /im QQ.exe /f /t"
  12. End If
  13. wscript.sleep 3000
  14. loop
复制代码
 楼主| 发表于 2013-1-22 16:04:07 | 显示全部楼层
换一台电脑,打开QQ,结果出现这个了,为什么?
发表于 2013-1-22 21:39:51 | 显示全部楼层
本帖最后由 batman 于 2013-1-22 21:58 编辑

  1. '结束qq并禁止qq运行
  2. Dim objWMI, objEvents, objEvent
  3. Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
  4. Set objEvents = objWMI.ExecNotifiCationQuery _
  5.   ("Select * From __InstanceOperationEvent Within 5 " _
  6.     & "Where TargetInstance Isa 'Win32_Process'")
  7. Dim objItems, objItem
  8. Set objItems = objWMI.ExecQuery _
  9.   ("Select * From Win32_Process Where Name='qq.exe'")
  10. For Each objItem In objItems
  11.   objItem.Terminate
  12. Next
  13. Do While True
  14.   Set objEvent = objEvents.NextEvent()
  15.   If LCase(objEvent.TargetInstance.Name) = "qq.exe" Then
  16.     If objEvent.Path_.Class = "__InstanceCreationEvent" _
  17.       Then objEvent.TargetInstance.Terminate
  18.   End If
  19. Loop
复制代码
 楼主| 发表于 2013-1-23 08:15:34 | 显示全部楼层
回复 3# batman


    谢谢!!
代码可以用,但是没有提示框,这个有提示框,但没法倒计时!

do
on error resume next
set bag=getobject("winmgmts:\\.\root\cimv2")
set pipe=bag.execquery("select * from win32_process where name='QQ.exe'")
For Each id In pipe
id.terminate
MsgBox "你不能用QQ"
Next
wscript.sleep 500
loop
 楼主| 发表于 2013-1-23 08:28:27 | 显示全部楼层
回复 3# batman


    或者直接用老师的下半部分也行

Dim objWMI, objEvents, objEvent
Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
Set objEvents = objWMI.ExecNotifiCationQuery _
  ("Select * From __InstanceOperationEvent Within 5 " _
    & "Where TargetInstance Isa 'Win32_Process'")
Do While True
  Set objEvent = objEvents.NextEvent()
  If LCase(objEvent.TargetInstance.Name) = "qq.exe" Then
    If objEvent.Path_.Class = "__InstanceCreationEvent" _
      Then objEvent.TargetInstance.Terminate
   MsgBox "对不起,你不能用QQ"
  End If
Loop
发表于 2013-1-23 09:40:59 | 显示全部楼层
问下3楼代码中 do while true 中true指的是哪个变量?
 楼主| 发表于 2013-1-23 09:55:55 | 显示全部楼层
当while中条件为真时(也就是true)循环继续执行。否则循环结束。
发表于 2013-1-23 09:57:35 | 显示全部楼层
回复 6# wankoilz


    Do While True..............Loop 永真循环,在这里实际上你可以写成Do.............Loop
发表于 2013-1-23 10:07:12 | 显示全部楼层
原来如此!
还有个问题,我发现如果把查询间隔改长一点比如 within 10 ,那在这10秒钟内打开进程又关闭的话,脚本检测不出事件的发生……事件是如何被记录和查询的呢?
发表于 2013-1-23 11:52:58 | 显示全部楼层
Set objEvent = objEvents.NextEvent()
这句告诉脚本暂停并直到下一个新建/修改/删除事件发生
发表于 2013-1-23 12:32:55 | 显示全部楼层
感谢回复,具体我是这个意思:
比如我要检测QQ.exe的创建事件,每10秒检测一次。
如果在10秒间隔时间内,我打开QQ.exe再关闭,那么脚本检测不到这个事件;
如果我打开QQ.exe,不关闭,那么间隔时间过后脚本可以检测到事件。
这两种情况下创建事件都发生了,但是为什么后者检测不到呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 12:06 , Processed in 0.028162 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表