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%COPY |
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 functionCOPY |
这里说一下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+%2COPY |
而之前说到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 functionCOPY |
还可以精简成这样: | wscript.echo "“三加二”和“六加八”的结果分别是:" | | wscript.echo "3+2=" & jiafa(3,2) | | wscript.echo "6+8=" & jiafa(6,8) | | | | function jiafa(arg1, arg2) | | jiafa=arg1+arg2 | | end functionCOPY |
这里可以看到,有返回值的函数可以在函数体中用 函数名=返回结果 的方式设置返回值。
好了,关于函数定义就说到这里,我们刚开始学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 "你输入的是:" & aCOPY |
或者弄的好看点 | a = inputbox("请随便输入一点什么:", "输入框的标题", "我是默认值") | | msgbox "你输入的是:" & vbCrLf & a, vbInformation, "消息框的标题"COPY |
关于这两个函数的详细参数可以去参考资料;
这里要说明的是 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)COPY |
还有一些常用的函数,看一下例子就可以明白了: | 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()COPY |
好了,今天的内容实在是太多了,真是记不住啊,没事,以后应用的时候慢慢查去,最后给个能代表今天内容的例子: | FullName = inputbox("请输入你的中文全名:", "输入") | | NameLength = Len(FullName) | | FamilyName = Left(FullName, 1) | | ASCIICode = Asc(FamilyName) | | HexCode = Hex(ASCIICode) | | MsgBox "你的名字(" & FullName & ")是" & NameLength & _ | | "个字的,姓是" & FamilyName & _ | | ",它的ASCII编码是 " & ASCIICode & _ | | " ,十六进制编码是 " & HexCode, _ | | 64, "你好"COPY |
最后再出个思考题吧,利用今天及以前说过的知识,编写一个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 编辑 ] |