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

[问题求助] 如何根据条件来决定for语句的循环次数?能否用if…then…else?

刚开始学VBS,很多东西都还不明白。

如何根据条件来决定for语句的循环次数?比如说当条件为A时,执行“for i=0 to 50”,当条件为B时执行“for i=0 to 100”?
  1. rem 这是一段错误的代码
  2. dim asdf(2)
  3. asdf(0)="111111111"
  4. asdf(1)="222222222"
  5. asdf(2)="333333333"
  6. a=1
  7. if a=1 then
  8.     for i=0 to 1
  9.     else
  10.     for i=0 to 2
  11. end if
  12. s=s&asdf(i)&"    "
  13. next
  14. msgbox s
复制代码
上面那段代码是错误的,但是就是我想达到的效果。

下面是我想完成的任务:
我准备用VBS给若干程序创建快捷方式,所有程序的快捷方式将会创建到开始菜单的某个文件夹,但是其中部分程序的快捷方式会创建到快速启动栏。
“程序”、“起始位置”、“图标”、等参数我用的是一维数组,快捷方式的“目标位置”我定义了一个二维数组,分别指向开始菜单和快速启动栏。

以下这段代码(从完整代码中提取的部分内容并稍做修改)可以完成任务,但是有缺陷:
  1. rem Name:快捷方式名称
  2. rem Goal:目标位置
  3. rem Prog:程序名
  4. rem PPth: 程序位置
  5. rem Icon:图标引用文件
  6. rem Parm:参数
  7. rem Dscp:描述
  8. dim Dir(32),Name(147),Goal(147,1),Prog(147),PPth(147),Icon(147),Parm(147),Dscp(147)
  9. dim a,f,g,i,j,fso,AppBox
  10. Set a = WScript.CreateObject("WScript.Shell")
  11. f = a.SpecialFolders("AllUsersStartMenu") & "\工具箱"
  12. Dir(0)   = f
  13. Dir(04) = f & "\备份"
  14. Dir(05) = f & "\编辑"
  15. Set fso = Createobject("Scripting.Filesystemobject")
  16. for g=0 to 32
  17.     if not fso.folderexists(Dir(g)) then
  18.         fso.createfolder(Dir(g))
  19.     end if
  20. next
  21. AppBox = "C:\Programs\"
  22. Name(0)   = "MyBackup"
  23. Goal(0,0) = Dir(04)
  24. Prog(0)   = "MyBackup.bat"
  25. PPth(0)   = AppBox & "MyTools\MyBackup"
  26. Name(1)   = "GVim"
  27. Goal(1,0) = Dir(05)
  28. Prog(1)   = "gvim.exe"
  29. PPth(1)   = AppBox & "Vim"
  30. Icon(1)   = AppBox & "VMware\VMware.exe"
  31. Name(2)   = "HtmlDocEdit"
  32. Goal(2,0) = Dir(05)
  33. Prog(2)   = "HtmlDocEdit.exe"
  34. PPth(2)   = AppBox & "NirSoft\HtmlDocEdit"
  35. Parm(2)   = "/prefetch:1"
  36. Name(3)   = "MadEdit"
  37. Goal(3,0) = Dir(05)
  38. Goal(3,1) = a.SpecialFolders("appdata") & "\Microsoft\Internet Explorer\Quick Launch"
  39. Prog(3)   = "MadEdit.exe"
  40. PPth(3)   = AppBox & "MadEdit"
  41. Name(4)   = "Notepad2"
  42. Goal(4,0) = Dir(05)
  43. Prog(4)   = "Notepad2.exe"
  44. PPth(4)   = AppBox & "Notepad2"
  45. for i=0 to 4
  46. for j=0 to 1
  47.     set link = a.CreateShortcut(Goal(i,j) & "\" & Name(i) & ".lnk")
  48.     link.TargetPath = PPth(i) & "\" & Prog(i)
  49.     link.WorkingDirectory = ppth(i)
  50.   if not isempty(Icon(i)) then
  51.     link.IconLocation = Icon(i)
  52.    elseif not isempty(Parm(i)) then
  53.     link.Arguments = Parm(i)
  54.    elseif not isempty(Dscp(i)) then
  55.     link.Description = Dscp(i)
  56.   end if
  57.     link.save
  58. next
  59. next
复制代码
这段代码的确可以完成任务,但是缺陷有二:
1、多循环了一次,降低了效率。
2、仅仅是因为VBS创建快捷方式没找到参数时,不会报错,才完成的任务。
所以,我想把
  1. for i=0 to 4
  2. for j=0 to 1
复制代码
改成类似这样的语句:
  1. for i=0 to 4
  2.   if  isempty(goal(i,1)) then   
  3. for j=0 to 0
  4. else
  5. for j= 0 to 1
  6. end if
复制代码
但是这段代码又是错误的。

又研究了一下,如果我在倒数的两个“next”前加上这一句“if  isempty(goal(i,1)) then exit for”,是不是就可以不做那一次多余的循环?这样程序发现缺少参数时也不会报错了?
最后一段修改如下:
  1. for i=0 to 4
  2. for j=0 to 1
  3.     set link = a.CreateShortcut(Goal(i,j) & "\" & Name(i) & ".lnk")
  4.     link.TargetPath = PPth(i) & "\" & Prog(i)
  5.     link.WorkingDirectory = ppth(i)
  6.   if not isempty(Icon(i)) then
  7.     link.IconLocation = Icon(i)
  8.    elseif not isempty(Parm(i)) then
  9.     link.Arguments = Parm(i)
  10.    elseif not isempty(Dscp(i)) then
  11.     link.Description = Dscp(i)
  12.   end if
  13.     link.save
  14.   if  isempty(goal(i,1)) then exit for
  15. next
  16. next
复制代码
这样的话,是不是程序先在“i=0”、“j=0”的情况下来执行,然后当程序发现goal(i,1)即goal(0,1)这个参数不存在时,程序就不再让j=1执行第二次循环了?并且程序就直接跳出“for j=0 to 1”的循环,返回到上层“for i=0 to 4”的循环,并且令“i=1”,即开始第二次循环?

TOP

返回列表