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

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

[复制链接]
发表于 2012-6-12 14:57:14 | 显示全部楼层 |阅读模式
  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 ,然后结束它。

评分

参与人数 1PB +2 收起 理由
zqz0012005 + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2012-6-12 15:45:26 | 显示全部楼层
因为要报错,所以要报错!^_^
你把具体出错信息贴出来不行吗?
for each x in x
vbs是不区分大小写的!
另外,你对变量的命名挺奇怪的,不是任何一种常见风格,倒像把几种风格糅合起来了,显得不伦不类。
发表于 2012-6-12 17:03:45 | 显示全部楼层
楼主,你想实现什么功能?
你的代码缩进风格要改善。特别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:07 | 显示全部楼层
回复 2# powerbat


    OK,我以后好好改善一下
 楼主| 发表于 2012-6-12 17:54:44 | 显示全部楼层
回复 3# broly


    恩,我会改进的
 楼主| 发表于 2012-6-12 17:55:55 | 显示全部楼层
回复 3# broly


    嘿嘿 ,那个红字部分就是我输入的值,和原来数组里面的值对比,如果相等那么就进行下一步,我稍微改一下吧
发表于 2012-6-12 18:31:49 | 显示全部楼层
回复 6# 秋风·飞扬


    我理解错误了。我忘记了VBS用=号比较的。我碰到的语言用==比较的情况比较多,就习惯性的以为这里是个赋值语句。囧了
 楼主| 发表于 2012-6-12 19:23:43 | 显示全部楼层
回复 7# broly


    哈哈 ,知识都学杂了
发表于 2012-6-13 10:23:59 | 显示全部楼层
要用数组干嘛?
  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技术 +1 收起 理由
zqz0012005 + 1 乐于助人

查看全部评分

 楼主| 发表于 2012-6-13 11:38:45 | 显示全部楼层
回复 9# broly


    数组存放了所有进程的名称,起初有个查询进程的功能,我本来的目的就是我知道进程名字,我就可以在inputbox里面输入,然后结束它,所以我让where name = &  Array_Name(i) 这数组就用到这里面了,也不知道这样的用法对不对
发表于 2012-6-13 12:15:56 | 显示全部楼层
请学会在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技术 +1 收起 理由
zqz0012005 + 1 乐于助人

查看全部评分

发表于 2012-6-13 12:25:15 | 显示全部楼层
回复 10# 秋风·飞扬


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

评分

参与人数 1PB +2 收起 理由
zqz0012005 + 2 乐于助人

查看全部评分

 楼主| 发表于 2012-6-13 12:35:52 | 显示全部楼层
回复 12# powerbat


    听君一席话,胜读十年书。
 楼主| 发表于 2012-6-13 12:37:09 | 显示全部楼层
回复 11# powerbat


    cscript.exe调试,说实话,还真没有用这个调试的习惯,多谢指点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 04:49 , Processed in 0.020007 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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