标题: [问题求助] 如何根据条件来决定for语句的循环次数?能否用if…then…else? [打印本页]
作者: killer3k 时间: 2013-9-18 01:09 标题: 如何根据条件来决定for语句的循环次数?能否用if…then…else?
刚开始学VBS,很多东西都还不明白。
如何根据条件来决定for语句的循环次数?比如说当条件为A时,执行“for i=0 to 50”,当条件为B时执行“for i=0 to 100”?- rem 这是一段错误的代码
- dim asdf(2)
- asdf(0)="111111111"
- asdf(1)="222222222"
- asdf(2)="333333333"
-
- a=1
- if a=1 then
- for i=0 to 1
- else
- for i=0 to 2
- end if
- s=s&asdf(i)&" "
- next
- msgbox s
复制代码
上面那段代码是错误的,但是就是我想达到的效果。
下面是我想完成的任务:
我准备用VBS给若干程序创建快捷方式,所有程序的快捷方式将会创建到开始菜单的某个文件夹,但是其中部分程序的快捷方式会创建到快速启动栏。
“程序”、“起始位置”、“图标”、等参数我用的是一维数组,快捷方式的“目标位置”我定义了一个二维数组,分别指向开始菜单和快速启动栏。
以下这段代码(从完整代码中提取的部分内容并稍做修改)可以完成任务,但是有缺陷:- rem Name:快捷方式名称
- rem Goal:目标位置
- rem Prog:程序名
- rem PPth: 程序位置
- rem Icon:图标引用文件
- rem Parm:参数
- rem Dscp:描述
-
- dim Dir(32),Name(147),Goal(147,1),Prog(147),PPth(147),Icon(147),Parm(147),Dscp(147)
- dim a,f,g,i,j,fso,AppBox
- Set a = WScript.CreateObject("WScript.Shell")
- f = a.SpecialFolders("AllUsersStartMenu") & "\工具箱"
-
- Dir(0) = f
- Dir(04) = f & "\备份"
- Dir(05) = f & "\编辑"
-
- Set fso = Createobject("Scripting.Filesystemobject")
-
- for g=0 to 32
- if not fso.folderexists(Dir(g)) then
- fso.createfolder(Dir(g))
- end if
- next
-
- AppBox = "C:\Programs\"
-
- Name(0) = "MyBackup"
- Goal(0,0) = Dir(04)
- Prog(0) = "MyBackup.bat"
- PPth(0) = AppBox & "MyTools\MyBackup"
-
- Name(1) = "GVim"
- Goal(1,0) = Dir(05)
- Prog(1) = "gvim.exe"
- PPth(1) = AppBox & "Vim"
- Icon(1) = AppBox & "VMware\VMware.exe"
-
- Name(2) = "HtmlDocEdit"
- Goal(2,0) = Dir(05)
- Prog(2) = "HtmlDocEdit.exe"
- PPth(2) = AppBox & "NirSoft\HtmlDocEdit"
- Parm(2) = "/prefetch:1"
-
- Name(3) = "MadEdit"
- Goal(3,0) = Dir(05)
- Goal(3,1) = a.SpecialFolders("appdata") & "\Microsoft\Internet Explorer\Quick Launch"
- Prog(3) = "MadEdit.exe"
- PPth(3) = AppBox & "MadEdit"
-
- Name(4) = "Notepad2"
- Goal(4,0) = Dir(05)
- Prog(4) = "Notepad2.exe"
- PPth(4) = AppBox & "Notepad2"
-
- for i=0 to 4
- for j=0 to 1
- set link = a.CreateShortcut(Goal(i,j) & "\" & Name(i) & ".lnk")
- link.TargetPath = PPth(i) & "\" & Prog(i)
- link.WorkingDirectory = ppth(i)
- if not isempty(Icon(i)) then
- link.IconLocation = Icon(i)
- elseif not isempty(Parm(i)) then
- link.Arguments = Parm(i)
- elseif not isempty(Dscp(i)) then
- link.Description = Dscp(i)
- end if
- link.save
- next
- next
复制代码
这段代码的确可以完成任务,但是缺陷有二:
1、多循环了一次,降低了效率。
2、仅仅是因为VBS创建快捷方式没找到参数时,不会报错,才完成的任务。
所以,我想把- for i=0 to 4
- for j=0 to 1
复制代码
改成类似这样的语句:- for i=0 to 4
- if isempty(goal(i,1)) then
- for j=0 to 0
- else
- for j= 0 to 1
- end if
复制代码
但是这段代码又是错误的。
作者: killer3k 时间: 2013-9-18 01:43
又研究了一下,如果我在倒数的两个“next”前加上这一句“if isempty(goal(i,1)) then exit for”,是不是就可以不做那一次多余的循环?这样程序发现缺少参数时也不会报错了?
最后一段修改如下:- for i=0 to 4
- for j=0 to 1
- set link = a.CreateShortcut(Goal(i,j) & "\" & Name(i) & ".lnk")
- link.TargetPath = PPth(i) & "\" & Prog(i)
- link.WorkingDirectory = ppth(i)
- if not isempty(Icon(i)) then
- link.IconLocation = Icon(i)
- elseif not isempty(Parm(i)) then
- link.Arguments = Parm(i)
- elseif not isempty(Dscp(i)) then
- link.Description = Dscp(i)
- end if
- link.save
- if isempty(goal(i,1)) then exit for
- next
- 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”,即开始第二次循环?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |