Board logo

标题: [原创] WINDOWS中的脚本教程(No.02) [打印本页]

作者: Spring    时间: 2010-5-16 20:01     标题: WINDOWS中的脚本教程(No.02)

WINDOWS中的脚本教程(No.02)

上一篇说了些VBS中的变量和运算符相关的基本知识,今天来介绍更多的运算和一些之后可能会经常使用的函数
这里面函数的的意思就是穿一些参数进去,系统会根据它们做一些事情,然后可能会返回一个值,我们不关心也不知道函数里面是怎么工作的,只要知道结果就行了。
这个函数跟数学里面的函数有点像,比如数学里面写一个 f(x)=x+2 ,我们用 y=f(3) 就能得到 3+2 的结果 5 ;它又跟批处理里面用冒号 : 开头标记的代码段有点像,用 call 后面写上这个标记的名称就能执行它里面的所有语句,可以提高代码重用性,但是批处理里面的这种肯定不会有返回值
来看个简单的代码:
BAT
  1. @echo off
  2. echo “三加二”和“六加八”的结果分别是:
  3. call :jiafa 3,2
  4. call :jiafa 6,8
  5. pause>nul
  6. goto
  7. :jiafa
  8. set /a jisuanjieguo=%1+%2
  9. echo %jisuanjieguo%
复制代码
VBS
  1. wscript.echo "“三加二”和“六加八”的结果分别是:"
  2. call jiafa(3,2) 'VBS里面调用函数可以不用 call ,直接写 jiafa(3,2) 就行,一般我们也都是不写 call 的
  3. call jiafa(6,8)
  4. function jiafa(arg1, arg2)
  5. jisuanjieguo=arg1+arg2
  6. wscript.echo jisuanjieguo
  7. end function
复制代码
这里说一下VBS定义函数的方法。
批处理那种标记都是冒号开头跟上名字,参数默认是 %1 %2 ... ,然后系统认为他的代码就是从那里开始到文件结尾,或者遇到下一个冒号开头的行为止;
VBS里面用 fucntion 开头,然后是函数名字,然后跟上小括号,括号里面是所有参数的临时代号,除了系统关键字以外你可以随便取,在函数体里面使用起来显然比BAT的%几更直观,语句写完之后用 end function 结束,系统认为一对 function ... end function 就表示一个函数,因此你可以把它写在代码的开头中间或结尾的任何地方。
如果你用过BAT里面的变量延迟,这个跟它是不是看起来很像?从 setlocal 到 endlocal 之间的代码可以用 !var! 来使用变量,这里还涉及一个问题,就是定义的参数的临时代号(此例中的 arg1 和 arg2),仅仅在这个函数定义体内有效,在之外的代码就是未定义的变量了。

这样虽然能输出结果,但是如果我们要用计算的结果再去干一些事情就不行了。
BAT中或许可以这么做,但是要多出一个参数:
  1. @echo off
  2. call :jiafa 3,2,a
  3. call :jiafa 6,8,b
  4. echo “三加二”和“六加八”的结果分别是:
  5. echo 3+2=%a%
  6. echo 6+8=%b%
  7. pause>nul
  8. goto
  9. :jiafa
  10. set /a %3=%1+%2
复制代码
而之前说到VBS的函数有返回值,那就可以只用两个参数,在外面的程序给变量赋值这样:
  1. a=jiafa(3,2)
  2. b=jiafa(6,8)
  3. wscript.echo "“三加二”和“六加八”的结果分别是:"
  4. wscript.echo "3+2=" & a
  5. wscript.echo "6+8=" & b
  6. function jiafa(arg1, arg2)
  7. jiafa=arg1+arg2
  8. end function
复制代码
还可以精简成这样:
  1. wscript.echo "“三加二”和“六加八”的结果分别是:"
  2. wscript.echo "3+2=" & jiafa(3,2)
  3. wscript.echo "6+8=" & jiafa(6,8)
  4. function jiafa(arg1, arg2)
  5. jiafa=arg1+arg2
  6. 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,以后一般就用这两个啦,最简单的实例:
  1. a = inputbox("请随便输入一点什么:")
  2. msgbox "你输入的是:" & a
复制代码
或者弄的好看点
  1. a = inputbox("请随便输入一点什么:", "输入框的标题", "我是默认值")
  2. msgbox "你输入的是:" & vbCrLf & a, vbInformation, "消息框的标题"
复制代码
关于这两个函数的详细参数可以去参考资料;
这里要说明的是 vbCrLf 和 vbInformation 是系统定义好的常量,常量的意思就是不能改的变量,至于系统定义了哪些,去查资料就行了。

几个经常用的时间相关的函数 Now、Date、Time,很容易理解它们的意思,Now 包含 Date 和 Time 的信息。
最简单的实例:
  1. msgbox  "日期:  " & date & vbCrLf & _
  2.         "时间:  " & time & vbCrLf & _
  3.         "现在:  " & now & vbCrLf & _
  4.         "年:  " & year(now) & vbCrLf & _
  5.         "月:  " & month(now) & vbCrLf & _
  6.         "日:  " & day(now) & vbCrLf & _
  7.         "时:  " & hour(now) & vbCrLf & _
  8.         "分:  " & minute(now) & vbCrLf & _
  9.         "秒:  " & second(now) & vbCrLf & _
  10.         "星期:  " & (weekday(now) - 1)
复制代码
还有一些常用的函数,看一下例子就可以明白了:
  1. str = "我是一只小鸭仔,yiyayiyayo~"
  2. str1 = "Spring Brother is true man."
  3. wscript.echo _
  4. "香港回归的时间是:  " & #07/01/1997 00:00:00# & vbCrLf & _
  5. "现在距南非世界杯开幕式还有:  " & (CDate("2010年6月11日 16:00") - Now) & " 天" & vbCrLf & _
  6. "数字 99 对应的ACSII字符是:  " & Chr(99) & vbCrLf & _
  7. "字符 S 对应的ASCII码值是:" & Asc("S") & vbCrLf & _
  8. "数字 36 对应的十六进制编码是:" & Hex(36) & vbCrLf & _
  9. "十六进制编码 FF00FF 对应的数值是:" & &HFF00FF & vbCrLf & _
  10. "1,234.56 和 12 分别是数字吗? " & IsNumeric("1,234.56") & "  " &  IsNumeric("12") & vbCrLf & _
  11. "字符串“" & str & "” 不含引号共有 " & Len(str) & "个字符," & LenB(str) & " 个字节。" & vbCrLf & _
  12. "字符串“" & str1 & "” 不含引号转换成大写是: " & UCase(str1) & ",转换沉小写是:" & LCase(str1) & vbCrLf & _
  13. "字符串“" & str1 & "” 不含引号最左边三个字符是: " & Left(str1,3) & ",最右边三个是:" & Right(str1,3) & ",从第九开始的三个字符是:" & Mid(str1,9,3) & vbCrLf & _
  14. "把“" & str1 & "” 不含引号的man换成 Ultraman 最左边三个字符是: " & Replace(str1, "man", "Ultraman") & vbCrLf & _
  15. "将“" & str & "” 的主语换成鸡: " & Replace(Replace(str, "y", "j"), "鸭", "鸡") & vbCrLf & _
  16. "生成一个0到1的随机数:" & Rnd()
复制代码
好了,今天的内容实在是太多了,真是记不住啊,没事,以后应用的时候慢慢查去,最后给个能代表今天内容的例子:
  1. FullName = inputbox("请输入你的中文全名:", "输入")
  2. NameLength = Len(FullName)
  3. FamilyName = Left(FullName, 1)
  4. ASCIICode = Asc(FamilyName)
  5. HexCode = Hex(ASCIICode)
  6. MsgBox "你的名字(" & FullName & ")是" & NameLength & _
  7.        "个字的,姓是" & FamilyName & _
  8.        ",它的ASCII编码是 " & ASCIICode & _
  9.        " ,十六进制编码是 " & HexCode, _
  10.        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 编辑 ]
作者: msc2010    时间: 2010-5-19 08:51

waiting for the next~~~~~~~~~
作者: gdts    时间: 2010-5-19 13:23

思考题答案:
Hexcode = InputBox("请输入一个16进制编码","输入")
Intcode = CInt("&H"+Hexcode)
Asccode = ChrW(Intcode)
wscript.echo  Intcode & Asccode
作者: Spring    时间: 2010-5-20 00:13

原帖由 gdts 于 2010-5-19 13:23 发表 思考题答案:Hexcode = InputBox("请输入一个16进制编码","输入")Intcode = CInt("&H"+Hexcode)Asccode = ChrW(Intcode)wscript.echo  Intcode & Asccode

不错哦,居然找到了 CInt 和 ChrW 这两个函数,如果你是刚接触VBS的话这能说明你自学能力很强啊!
你可以试试把 ChrW 改成 Chr ,然后分别输入这个十六进制代码 D6ED 看看结果,会发现一些不一样的地方。
作者: siwmm    时间: 2010-6-23 21:31

msgbox chr("&H"&InputBox("请输入一个16进制编码","回显16进制

编码和代表的ANIS字符","D6ED"))   ,vbRetryCancel

只会这样.
只用一行, 同时实现 十进制值和它代表的字符
这个不会,    请给个答案吧, 老师~
作者: Spring    时间: 2010-6-23 22:15

额,不好意思,我现在也想不起来了,我估计当时想写的是只显示一个,应该就是你那样的!

如果硬要显示两个的话会很别扭,应该不是我想要的结果:
  1. msgbox execute("s = InputBox(""请输入一个16进制编码"",""回显16进制编码和代表的ANIS字符"",""D6ED"")") & s & " --- " & Eval("&H" & s) & " --- " & Chr("&H" & s),vbInformation
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2