Board logo

标题: [问题求助] [已解决]结束进程的VBS代码中for each语句为何会报错呢? [打印本页]

作者: 秋风·飞扬    时间: 2012-6-12 14:57     标题: [已解决]结束进程的VBS代码中for each语句为何会报错呢?

  1. strComputer="."
  2. Set wmi = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
  3. Set Get_Process=wmi.instancesof("win32_process")
  4. For Each Process In Get_Process
  5. count=count+1
  6. ReDim Preserve Array_Name(count-1)
  7. Array_Name(count-1)=Process.name
  8. Next
  9. Input= InputBox("请输入要结束的进程名称:")
  10. For i=0 To count
  11. ReDim Preserve Array_Name(count)
  12. If Input=Array_Name(i) Then
  13. Set New_Process = wmi.execquery("select * from win32_process where name ="&  Array_Name(i) )
  14. For Each Over_Process In New_Process
  15. Over_Process.terminate()
  16. Next
  17. Set New_Process = Nothing
  18. Set Over_Process= Nothing
  19. End If
  20. Next
  21. Set wmi = Nothing
  22. Set Get_Process = Nothing
  23. Set Process =  Nothing
复制代码

报错是在上面的第18行


代码的目的是,想实现用inputbox输入一个进程的名字,例如输入taskmgr.exe ,然后结束它。

作者: powerbat    时间: 2012-6-12 15:45

因为要报错,所以要报错!^_^
你把具体出错信息贴出来不行吗?
for each x in x
vbs是不区分大小写的!
另外,你对变量的命名挺奇怪的,不是任何一种常见风格,倒像把几种风格糅合起来了,显得不伦不类。
作者: broly    时间: 2012-6-12 17:03

楼主,你想实现什么功能?
你的代码缩进风格要改善。特别if , for之类的嵌套时,如果你没有良好的缩进风格,要看清楚你的代码很费劲的。

If pro_name=LCase(Arry_Name(i)) Then Set New_Process = wmi.execquery("select * from win32_process where name ="& LCase(Arry_Name(i)))

红字部分,难以理解
作者: 秋风·飞扬    时间: 2012-6-12 17:54

回复 2# powerbat


    OK,我以后好好改善一下
作者: 秋风·飞扬    时间: 2012-6-12 17:54

回复 3# broly


    恩,我会改进的
作者: 秋风·飞扬    时间: 2012-6-12 17:55

回复 3# broly


    嘿嘿 ,那个红字部分就是我输入的值,和原来数组里面的值对比,如果相等那么就进行下一步,我稍微改一下吧
作者: broly    时间: 2012-6-12 18:31

回复 6# 秋风·飞扬


    我理解错误了。我忘记了VBS用=号比较的。我碰到的语言用==比较的情况比较多,就习惯性的以为这里是个赋值语句。囧了
作者: 秋风·飞扬    时间: 2012-6-12 19:23

回复 7# broly


    哈哈 ,知识都学杂了
作者: broly    时间: 2012-6-13 10:23

要用数组干嘛?
  1. strComputer = "."
  2. Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
  3. set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process where name='cmd.exe'")
  4. For Each objProcess in colProcessList
  5.   objProcess.Terminate()
  6. Next
复制代码

作者: 秋风·飞扬    时间: 2012-6-13 11:38

回复 9# broly


    数组存放了所有进程的名称,起初有个查询进程的功能,我本来的目的就是我知道进程名字,我就可以在inputbox里面输入,然后结束它,所以我让where name = &  Array_Name(i) 这数组就用到这里面了,也不知道这样的用法对不对
作者: powerbat    时间: 2012-6-13 12:15

请学会在cmd中用cscript.exe运行脚本,以便查看和调试。
WQL中,文本值需要用引号括起来(单引号或双引号皆可,配对使用),数字值可用可不用。
  1. Set New_Process = wmi.execquery("select * from win32_process where name ='" &  Array_Name(i) & "'")
  2. Set New_Process = wmi.execquery("select * from win32_process where name ="""&  Array_Name(i) & """")
  3. Set New_Process = wmi.execquery("select * from win32_process where name ="""&  Array_Name(i) & chr(34))
复制代码

作者: powerbat    时间: 2012-6-13 12:25

回复 10# 秋风·飞扬


可以,但这样做没什么必要。
如果你想列出特定进程名并显示给用户供其选择,则有点意义。
否则像9楼那样直接查询即可,不需要先获取所有进程列表,wmi不一定比你的数组逐个比较慢,而且如果有新进程产生,你原来获取的列表完全没用。
作者: 秋风·飞扬    时间: 2012-6-13 12:35

回复 12# powerbat


    听君一席话,胜读十年书。
作者: 秋风·飞扬    时间: 2012-6-13 12:37

回复 11# powerbat


    cscript.exe调试,说实话,还真没有用这个调试的习惯,多谢指点。




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