WINDOWS中的脚本教程(No.02)
上一篇说了些VBS中的变量和运算符相关的基本知识,今天来介绍更多的运算和一些之后可能会经常使用的函数。
这里面函数的的意思就是穿一些参数进去,系统会根据它们做一些事情,然后可能会返回一个值,我们不关心也不知道函数里面是怎么工作的,只要知道结果就行了。
这个函数跟数学里面的函数有点像,比如数学里面写一个 f(x)=x+2 ,我们用 y=f(3) 就能得到 3+2 的结果 5 ;它又跟批处理里面用冒号 : 开头标记的代码段有点像,用 call 后面写上这个标记的名称就能执行它里面的所有语句,可以提高代码重用性,但是批处理里面的这种肯定不会有返回值。
来看个简单的代码:
BAT- @echo off
- echo “三加二”和“六加八”的结果分别是:
- call :jiafa 3,2
- call :jiafa 6,8
- pause>nul
- goto
-
- :jiafa
- set /a jisuanjieguo=%1+%2
- echo %jisuanjieguo%
复制代码 VBS- wscript.echo "“三加二”和“六加八”的结果分别是:"
- call jiafa(3,2) 'VBS里面调用函数可以不用 call ,直接写 jiafa(3,2) 就行,一般我们也都是不写 call 的
- call jiafa(6,8)
-
- function jiafa(arg1, arg2)
- jisuanjieguo=arg1+arg2
- wscript.echo jisuanjieguo
- end function
复制代码 这里说一下VBS定义函数的方法。
批处理那种标记都是冒号开头跟上名字,参数默认是 %1 %2 ... ,然后系统认为他的代码就是从那里开始到文件结尾,或者遇到下一个冒号开头的行为止;
VBS里面用 fucntion 开头,然后是函数名字,然后跟上小括号,括号里面是所有参数的临时代号,除了系统关键字以外你可以随便取,在函数体里面使用起来显然比BAT的%几更直观,语句写完之后用 end function 结束,系统认为一对 function ... end function 就表示一个函数,因此你可以把它写在代码的开头中间或结尾的任何地方。
如果你用过BAT里面的变量延迟,这个跟它是不是看起来很像?从 setlocal 到 endlocal 之间的代码可以用 !var! 来使用变量,这里还涉及一个问题,就是定义的参数的临时代号(此例中的 arg1 和 arg2),仅仅在这个函数定义体内有效,在之外的代码就是未定义的变量了。
这样虽然能输出结果,但是如果我们要用计算的结果再去干一些事情就不行了。
BAT中或许可以这么做,但是要多出一个参数:- @echo off
- call :jiafa 3,2,a
- call :jiafa 6,8,b
- echo “三加二”和“六加八”的结果分别是:
- echo 3+2=%a%
- echo 6+8=%b%
- pause>nul
- goto
-
- :jiafa
- set /a %3=%1+%2
复制代码 而之前说到VBS的函数有返回值,那就可以只用两个参数,在外面的程序给变量赋值这样:- a=jiafa(3,2)
- b=jiafa(6,8)
- wscript.echo "“三加二”和“六加八”的结果分别是:"
- wscript.echo "3+2=" & a
- wscript.echo "6+8=" & b
-
- function jiafa(arg1, arg2)
- jiafa=arg1+arg2
- end function
复制代码 还可以精简成这样:- wscript.echo "“三加二”和“六加八”的结果分别是:"
- wscript.echo "3+2=" & jiafa(3,2)
- wscript.echo "6+8=" & jiafa(6,8)
-
- function jiafa(arg1, arg2)
- jiafa=arg1+arg2
- end function
复制代码 这里可以看到,有返回值的函数可以在函数体中用 函数名=返回结果 的方式设置返回值。
好了,关于函数定义就说到这里,我们刚开始学VBS的时候可能根本不会用到,只要知道就行了,现在介绍一下经常要使用到的运算和系统为我们定义好的函数。
基本的算术运算符 + - * / 不说了;
求余数是 Mod ,比如 a = 7 mod 3 ,那么 a 的值就是 1;
幂运算用 ^ ,比如 a = 3 ^ 2 ,那么 a 的值是 9; a = 27^(1/3) 的值是 3;
特别要注意的是VBS里面的比较全是符号,没有什么 neq 之类的,下面是一个BAT和VBS比较运算符号的对比:
比较运算 VBS BAT
小于 < LSS
小于或等于 <= LEQ
大于 > GTR
大于或等于 >= GEQ
等于 = EQU 或者 ==
不等于 <> NEQ
特别要注意的是VBS中没有 == 这个符号!
另外有些逻辑运算符,这个今天先不详细说用途,
And 是两边都是对的则结果才对
Or 是两边只要有一边是对的就对
Not 跟BAT一样,颠倒是非
Xor 是两边一样就不对,不一样就对
BAT中好像没有逻辑运算符,因此做多个判断的时候就比较麻烦。
好了关于常用的运算就说到这里,该说一些基本的函数和语句了。
直到现在,我们都还只知道一个 wscript.echo 能显示一些文字给人看,但是关于如何获取输入值都还不会,这是一个很尴尬的事情,下面是两个窗口形式的输入和输出函数 InputBox 和 MsgBox,以后一般就用这两个啦,最简单的实例:- a = inputbox("请随便输入一点什么:")
- msgbox "你输入的是:" & a
复制代码 或者弄的好看点- a = inputbox("请随便输入一点什么:", "输入框的标题", "我是默认值")
- msgbox "你输入的是:" & vbCrLf & a, vbInformation, "消息框的标题"
复制代码 关于这两个函数的详细参数可以去参考资料;
这里要说明的是 vbCrLf 和 vbInformation 是系统定义好的常量,常量的意思就是不能改的变量,至于系统定义了哪些,去查资料就行了。
几个经常用的时间相关的函数 Now、Date、Time,很容易理解它们的意思,Now 包含 Date 和 Time 的信息。
最简单的实例:- msgbox "日期: " & date & vbCrLf & _
- "时间: " & time & vbCrLf & _
- "现在: " & now & vbCrLf & _
- "年: " & year(now) & vbCrLf & _
- "月: " & month(now) & vbCrLf & _
- "日: " & day(now) & vbCrLf & _
- "时: " & hour(now) & vbCrLf & _
- "分: " & minute(now) & vbCrLf & _
- "秒: " & second(now) & vbCrLf & _
- "星期: " & (weekday(now) - 1)
复制代码 还有一些常用的函数,看一下例子就可以明白了:- str = "我是一只小鸭仔,yiyayiyayo~"
- str1 = "Spring Brother is true man."
- wscript.echo _
- "香港回归的时间是: " & #07/01/1997 00:00:00# & vbCrLf & _
- "现在距南非世界杯开幕式还有: " & (CDate("2010年6月11日 16:00") - Now) & " 天" & vbCrLf & _
- "数字 99 对应的ACSII字符是: " & Chr(99) & vbCrLf & _
- "字符 S 对应的ASCII码值是:" & Asc("S") & vbCrLf & _
- "数字 36 对应的十六进制编码是:" & Hex(36) & vbCrLf & _
- "十六进制编码 FF00FF 对应的数值是:" & &HFF00FF & vbCrLf & _
- "1,234.56 和 12 分别是数字吗? " & IsNumeric("1,234.56") & " " & IsNumeric("12") & vbCrLf & _
- "字符串“" & str & "” 不含引号共有 " & Len(str) & "个字符," & LenB(str) & " 个字节。" & vbCrLf & _
- "字符串“" & str1 & "” 不含引号转换成大写是: " & UCase(str1) & ",转换沉小写是:" & LCase(str1) & vbCrLf & _
- "字符串“" & str1 & "” 不含引号最左边三个字符是: " & Left(str1,3) & ",最右边三个是:" & Right(str1,3) & ",从第九开始的三个字符是:" & Mid(str1,9,3) & vbCrLf & _
- "把“" & str1 & "” 不含引号的man换成 Ultraman 最左边三个字符是: " & Replace(str1, "man", "Ultraman") & vbCrLf & _
- "将“" & str & "” 的主语换成鸡: " & Replace(Replace(str, "y", "j"), "鸭", "鸡") & vbCrLf & _
- "生成一个0到1的随机数:" & Rnd()
复制代码 好了,今天的内容实在是太多了,真是记不住啊,没事,以后应用的时候慢慢查去,最后给个能代表今天内容的例子:- FullName = inputbox("请输入你的中文全名:", "输入")
- NameLength = Len(FullName)
- FamilyName = Left(FullName, 1)
- ASCIICode = Asc(FamilyName)
- HexCode = Hex(ASCIICode)
- MsgBox "你的名字(" & FullName & ")是" & NameLength & _
- "个字的,姓是" & FamilyName & _
- ",它的ASCII编码是 " & ASCIICode & _
- " ,十六进制编码是 " & HexCode, _
- 64, "你好"
复制代码 最后再出个思考题吧,利用今天及以前说过的知识,编写一个VBS脚本,实现如下功能:
1. 运行后弹出一个输入框让输入一个十六进制编码,默认值为 D6ED,
2. 回车之后弹出对话框显示它的十进制值和它代表的字符。
3. 只用一行,用冒号连起来的那种不算。
参考资料:
运算符总结
mk:@MSITStore:D:\vbjs.chm::/html/vsgrpoperatorsummary.htm
函数
mk:@MSITStore:D:\vbjs.chm::/html/vtoriFunctions.htm
常数
mk:@MSITStore:D:\vbjs.chm::/html/vsconVBScript.htm
InputBox函数
mk:@MSITStore:D:\vbjs.chm::/html/vsfctInputBox.htm
MsgBox函数
mk:@MSITStore:D:\vbjs.chm::/html/vsfctMsgBox.htm
MsgBox常数
mk:@MSITStore:D:\vbjs.chm::/html/vsconMsgBox.htm
字符串常数
mk:@MSITStore:D:\vbjs.chm::/html/vsconstring.htm
=== No.02 End ===
[ 本帖最后由 Spring 于 2010-5-16 20:03 编辑 ] |