[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]结束进程的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 ,然后结束它。
1

评分人数

    • zqz0012005: 感谢给帖子标题标注[已解决]字样PB + 2

回复 11# powerbat


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

TOP

回复 12# powerbat


    听君一席话,胜读十年书。

TOP

回复 10# 秋风·飞扬


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

评分人数

TOP

请学会在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))
复制代码
1

评分人数

TOP

回复 9# broly


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

TOP

要用数组干嘛?
  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
复制代码
1

评分人数

---学无止境---

TOP

回复 7# broly


    哈哈 ,知识都学杂了

TOP

回复 6# 秋风·飞扬


    我理解错误了。我忘记了VBS用=号比较的。我碰到的语言用==比较的情况比较多,就习惯性的以为这里是个赋值语句。囧了
---学无止境---

TOP

回复 3# broly


    嘿嘿 ,那个红字部分就是我输入的值,和原来数组里面的值对比,如果相等那么就进行下一步,我稍微改一下吧

TOP

回复 3# broly


    恩,我会改进的

TOP

回复 2# powerbat


    OK,我以后好好改善一下

TOP

楼主,你想实现什么功能?
你的代码缩进风格要改善。特别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)))

红字部分,难以理解
---学无止境---

TOP

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

TOP

返回列表