标题: [问题求助] [已解决]结束进程的VBS代码中for each语句为何会报错呢? [打印本页]
作者: 秋风·飞扬 时间: 2012-6-12 14:57 标题: [已解决]结束进程的VBS代码中for each语句为何会报错呢?
- strComputer="."
- Set wmi = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
- Set Get_Process=wmi.instancesof("win32_process")
-
-
- For Each Process In Get_Process
- count=count+1
- ReDim Preserve Array_Name(count-1)
- Array_Name(count-1)=Process.name
- Next
-
- Input= InputBox("请输入要结束的进程名称:")
-
- For i=0 To count
- ReDim Preserve Array_Name(count)
- If Input=Array_Name(i) Then
- Set New_Process = wmi.execquery("select * from win32_process where name ="& Array_Name(i) )
- For Each Over_Process In New_Process
- Over_Process.terminate()
- Next
- Set New_Process = Nothing
- Set Over_Process= Nothing
- End If
- Next
-
- Set wmi = Nothing
- Set Get_Process = Nothing
- 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
要用数组干嘛?- strComputer = "."
- Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
- set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process where name='cmd.exe'")
- For Each objProcess in colProcessList
- objProcess.Terminate()
- Next
复制代码
作者: 秋风·飞扬 时间: 2012-6-13 11:38
回复 9# broly
数组存放了所有进程的名称,起初有个查询进程的功能,我本来的目的就是我知道进程名字,我就可以在inputbox里面输入,然后结束它,所以我让where name = & Array_Name(i) 这数组就用到这里面了,也不知道这样的用法对不对
作者: powerbat 时间: 2012-6-13 12:15
请学会在cmd中用cscript.exe运行脚本,以便查看和调试。
WQL中,文本值需要用引号括起来(单引号或双引号皆可,配对使用),数字值可用可不用。- Set New_Process = wmi.execquery("select * from win32_process where name ='" & Array_Name(i) & "'")
- 或
- Set New_Process = wmi.execquery("select * from win32_process where name ="""& Array_Name(i) & """")
- 或
- 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://bathome.net./) |
Powered by Discuz! 7.2 |