热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VBScript程序员参考手册读书笔记01-07

第一章编程快速入门变量是一断预留用于储存数据的计算机内存。内存是临时的(不像硬盘),内存都有独一无二的地址。不同类型的变量需要的内存数量不同。自顶向下程序设计:适合

 第一章 编程快速入门

变量是一断预留用于储存数据的计算机内存。内存是临时的(不像硬盘),内存都有独一无二的地址。不同类型的变量需要的内存数量不同。

自顶向下程序设计:适合面向任务的脚本中自顶向下的设计比较合适。代码从头到尾一行一行执行。

事件驱动程序设计:代码只有在某个特定事件发生时才会被执行。Windows程序/web编程都是基于事件驱动模型写的。

自顶向下和事件驱动结合程序设计。

编程习惯:不要再对个任务中使用同一个变量。

第二章 VBS是什么?

VBS 是VB的子集。

VBS是解释性语言,没有被编译。编译意味着代码(如C++)在交付前编译为扩展名为.exe的可执行文件。

 

 

第三章 数据类型 data type

1. 语言分类:

1.1强类型语言(strongly typed language):要求事先声明变量,还要声明数据类型。比如编译型语言。

1.2弱类型语言 (loosely typed language): 不需要声明变量的数据类型。比如脚本语言,含vbs。

2.运行流程:

普通文本中编写代码à执行脚本文件à脚本在运行时引擎(runtime engine)在程序运行时编译代码à程序运行。

3.程序员的要求:实现需求,没有bug,遗留代码方便别人理解阅读。

4.VBS中唯一的数据类型:Variant.

但是它有很多子类型:比如String, Date, Boolean等。

5. 两种方式更改变量的子类型:

               隐式更改(implicit type coercion):隐式更改发生在被赋值之前。在被赋的值赋到这个变量前,vbs引擎使用本身的逻辑检查这个新值并确定应该具有的子类型。

               显式更改:对子类型的精细的控制。可用类型转换函数(conversion function)来完成。

6. Vbs中VarType()返回值等价的具名常量(namedconstant),比如vbString常量是8

If VarType(variable)=vbString Then  或者IfVarType(variable)=8 Then 

7.匈牙利表示法(Hungarian notation)的变量前缀,比如(var-variant;str-string; int-integer; lng-long; byt-byte; sng-single; dbl-double;cur-currency; obj-object; boll-bollean)。Var 一般用于不知道放什么类型,或变量的类型会变。

8. Date类型: Var = #5/16/99#           (##)

  String类型:Var =  “str”          (“”)

9.Is函数来检验是不是特定的数据类型;比如 检查是不是数字:

               If IsNumeric(IngAge) Then         

10. If NOT lsNumberic(lngAge) Then  等同与

        If lsNumberic(lngAge) = False Then 

11.隐式转换:比如 3 & “str”      “3str”            (转换为string,不要用+)

                               “3” + 5 8         (转换为数字类型,应该是double)

12. 使用+和&的原则:

               12.1 只有对数字进行数字运算时才使用+操作符;

               12.2 坚持用&操作符连接字符串;

               12.3 不要用+操作符连接字符串;

13.数据类型和值一样:Empty和Null。

               一个变量Variant声明没赋值,它就是子类型Empty.

         Null表示变量中没有合适的值或未知值。当一个变量只有在将Null赋给它之后,它的值和子类型才是Null。不能用(If var = Null Then)来验证是不是Null,因为Null和Null不可比,只能用IsNull(var)函数。

区别:Empty是隐式的,而Null是显式的。

处理:空字符串和Null连接在一起,结果就是空字符串。所以对取数据库值的最好处理方式:

               strName = “”+rxCustomers.Fields(“Name”).value

14.含有Object子类型:含有对象引用的变量。对象有属性和方法。类通常是组件的一部分。

     生成object: Set obj =WScript.CreateObject(“Scripting.FileSystemObject”)

  Nothing 是一个特殊的值,只针对Object变量。如果这个变量对象被销毁或者还没有被初始化,它就是值为Nothing的变量。

    销毁对象: Set obj = Nothing

    因为对象的变量耗很大的内存。养成习惯,对象用完就要设为 Nothing.

15.数组: 比如 Dim avar(2,4)   三行五列!!!

               动态的数组: Dim avar()

                                               ReDim Preserve avar(2,0)

                                               ReDim Preserve avar(2,1)

注意: Preserve关键字只能改变数组最后一个维度的大小,否则会有一个运行的大小。所以使用二维数组,最好把第一维视为列,第二维视为行来设计你的数组。

数组的遍历:Ubound(arrName,2) 函数来统计行数,2代表2维数组。再用for循环遍历。

清除数组:对于静态数组,数组元素的数据会被清除,但元素本身依然存在。但对于动态数组,Erase语句会彻底释放占用的内存,数据和元素都会被销毁。

                 例:    Erase arrayName

16. 匈牙利表示法的变量前缀:

var :variant

str :string

int :integer

lng :long

byt :byte

sng : single

dbl : double

cur : currency

obj : object

bln\bool : boolean

其他编码规范:

常量:全部大写或con前缀;

数组:字母a或arr的前缀;

 

第四章 变量与过程

1. 变量不是必须声明的。比如

               lngFirst = 1

               lngSecOnd= 2

               lngThird = lngFirst + lgnSecond

这里三个变量都没有声明,但都可以用。但是有这个可能,你把lngSecond写成了lgnSecond,程序默认它是第四个变量,赋值为0。所以lngThird是1。

2. 但是如果要求都是显式声明,在所有的代码前加上Option Explicit 语句,养成习惯

               例: Option Explicit

3. 变量命名规则:首字符为字母,其他非首字符可以是字母,数字,下划线。

          必备的技术: 匈牙利命名原则”

4. 函数有返回值,过程没有返回值。

过程用Sub开始(“subprocedure”的缩写)。语法:

[Public| private] Sub name ([arg1],[arg2])

[Codeinside the procedure]

EndSub

关键字Public | private只有在类内部才使用。但是.vbs文件是个孤岛(在Windows脚本宿主文件),其他脚本无法访问内部的代码。

命名尽量用动词-名词结合,比如:ProcessOrder. 参数可有可无。

 

函数唯一的区别就是把关键字改为Function. 最后一点说明:不能声明函数返回值的类型。

对函数名也使用匈牙利类型前缀:例如,GetUserName()可以命名为strGetUserName()。

5. 调用过程的两种方法:

è GetsubOrFun “arg”

è Call GetsubOrFun (“arg”)

没有call不能用括号,有call一定要用括号。

表4-1 调用过程的合法方式

调用过程的非法方式

GreetUser "Bill"

GreetUser("Bill")

Call GreetUser("Bill")

Call GreetUser "Bill"

 

6.调用函数的三种方式:

à lngSum=AddNumber(10,20)

àCallAddNumber(10,20)

à AddNumber 10,20


表4-2 调用函数的合法方式

调用函数的不合法方式

备 注

lngSum = AddNumbers(10, 20)

lngSum = AddNumbers 10, 20

要获得函数的返回值,就不能用Call关键字,并且一定要将参数放在圆括号中。没有圆括号是非法的

Call AddNumbers (10, 20)

lngSum = Call AddNumbers (10, 20)

如果不需要接收函数的返回值则可以使用Call关键字,但是必须使用圆括号。在接收返回值时用Call关键字是非法的

AddNumbers 10, 20

AddNumbers (10, 20)

可以同时忽略Call关键字和返回值,但这样也必须忽略圆括号

过程和函数可以有可选参数(optional argument)。但是您自己用Vbscript编写的过程和函数不能有可选参数。

7.内建的“具名常量”,就象值固定的变量。比如vbYesNo

     MsgBox(“Hello”,vbYesNo)

8.退出过程或函数,除非在复杂情况下遇到逻辑终止点,否则不推荐使用。

              Exit Sub

               Exit Function

9.一个过程里的过程级变量数量<=127;一个脚本中脚本级变量数量<=127. 。如果您确实有那么多数据,可以考虑将它们组织成类,每一个类可以有多个属性。

变量的三种作用域:

               9.1脚本级(Script-level):在整个脚本文件的代码都有效。

               9.2过程级(procedure-level):变量在过程或函数中有效。局部变量。

               9.3类级(class-level):在Class … End Class中定义。类中用private语句声明的变量就是类级的作用域。

三种语句声明变量:Dim;Private;Public.

 

Dim

Private

Public

Script-level(三者一样效果)

yes

Yes

yes

Procedure-level

yes

 

 

Class-level

Yes = public

Yes

yes

 。这里有一个要时刻记住的重要原则:必须要尽可能地限制变量的生存期和作用域。因为变量会消耗内存,;限制作用域可以减少程序的错误,并提高代码的可理解性和可维护性。只要遵守模块化的良好原则,设计优良的过程和函数自然就会处理好作用域和生存期问题—— 无需任何额外的努力。

10.函数传参: 传址(by reference) 和 传值(by value), 关键字是ByRef 和ByVal,而ByRef是默认的。大部分时候(基本上可以说是几乎所有时候),都会用ByVal处理过程和函数的参数。但是在您确实需要ByRef之前最好还是坚持使用ByVal。

               传址是永久地修改变量的值;传值只在过程中的代码里临时修改这个参数。

比如: Dim lngA, lngB

               lngA = 1

               lngB = 1

ByRefByVal lngA, lngB

Sub  ByRefByVal(ByRef lngA, ByVal lngB)

lngA = lngA + 1

lngB = lngB + 1

End Sub

结果是 lngA=2 ; lngB =1; 因为过程中的改变不影响外面的lngB变量没有修改。

11. 两种常量:文字常量 和具名常量(关键字 Const)

               比如: Const GREETING = “Hello”

这里 “Hello”是文字常量,GREETING是具名常量,使用效果是一样的。一般具名常量的命名全是大写字母。,常量名称中的不同单词是以下划线(_)分割的,跟变量一样,具名常量也有作用域。但不能用Dim语句声明常量,而是用Private和Public加上Const语句。

系统自带的内建常量:很多以vb前缀来识别。比如vbExclamation

MsgBox “Hello”,vbExclamation

 

第五章 流程控制 control of flow

大部分人都很难理解超过三重或四重的嵌套.

分支:

If… ElseIf…Else…EndIf

Selectcase…case …case else…End Select

循环:

For… Next\For Each ..Next

Do…Loop While (或者while在前):只有在While语句中的表达式为True时循环才会再次执行

Do…Loop Until  (或者Until在前): 反复执行一段语句,直到(until)某一条件为True。

尽管While和Until语句有些不同,但是它们的功能是一样的。

可以用Exit Do随时跳出Do循环。

While…Wend有点过时,但是能读懂别人代码中的用法。While…Wend最主要的限制就是它没有等价于Exit For或Exit Do的语句,这意味着不能强行跳出循环。

第六章 错误处理 exception handling

看函数文档有哪些可能的错误并防止;多测试;搜索答案;

1. 三种错误:

语法错误(Syntax error):编译错误,结果终止脚本的执行;比如缺关键字,无法识别的表达式;

运行错误(Runtime error): 运行时错误,最常见。引擎认为语法正确,但运行失败。比如 Option Explicit 引起有关的错误, 不是编译错误是运行错误。

逻辑错误(Logic error): 隐藏的错误,运行每问题,但结果不对。

2. 错误处理:向用户显式错误,记入到文件里,邮件或其他方式通知等;

3.错误对象: Err 对象:有属性 Number(错误代码行数),Source(错误信息),HelpFile, HelpContext和方法Clear(清楚所有属性), Raise(生成自定义的运行时错误);

4.自己处理异常:

捕获错误的三个步骤:在可能错误代码前加On ErrorResume Next;在错误代码后立即检查Err.Number的值,If Err.Number>0 Then 处理代码;最后重启错误机制On Error Go To0。

4.1忽略错误语句,把所有错误忽略:

OnError Resume Next

重新启动错误处理机制:

OnError Go To 0

所以要处理异常,就在这两句话之间加上你要处理的代码。一般用 If Err.Number <>0 来处理。

比如可以用WScript.Quit命令来终止脚本且清空资源。可以多用一些OnError Go To 0

来防止一些分支没有启动这个机制。

4.2自定义错误:比如

               Err.Raise vbObjectError+10000, “source:MyScript.MyFunction”, “errorinformation”

Err.Raise()方法,第一个参数在错误代码前加上vbObjectError,避免和微软官方错误代码冲突。

                               第二个参数是错误的来源。

                               第三个参数是错误描述。

 

 

 

第九章 正则表达式

强大的字符匹配和替换功能。VBS并不支持正则表达式常量(如 /apattern/),而是将文本字符串赋给RegExp对象的Pattern属性。

1.1步骤 --示例: Dim re, s

       新建一个正则表达式对象: Set re = New RegExp

      设置对象的关键属性: re.Pattern = “Frank”

       要搜索的字符串:  s = “Frank is anice man”

      查找和替换功能: re.Replace(s,”He”)

2.RegExp对象是提供正则表达式的对象。

属性

Global  (值为True, False)

默认值为False.

是Ture才会对整个字符串进行查找,否则你最多只能找到一个结果。

e.g. re.Gloal = ture

IgnoreCase (值为True, False)

默认值为False. 大小写敏感。

Pattern

正则表达式 e.g. re.Pattern = “Frank”

方法

Execute (值为需要搜索的字符串)

将正则表达式应用到字符串,并返回Matches集合。检验一个空集会if re.Execute(s).count=0 。e.g.

Set re = new RegExp

Re.Pattern = “\w”

s = “string”

Set colMatches = re.Execute(s)

 

For Each match In colMatches

Msgbox match.value

Next

Replace(值为需要搜索的字符串,代替的字符串)

替换在正则表达式搜索中找到的文本。e.g.

Set re = new RegExp

Re.Pattern = “\w”

re.Replace(string, str)

Test(值为需要搜索的字符串)

判断是否存在正则表达式搜索中找到的文本结果。返回布尔值。e.g.

Set re = new RegExp

Re.Pattern = “\w”

 

If Then re.Test(s) Then

Matches集合和Match对象

Execute方法返回这个Matches集合(Match对象的集合),属性是只读的。

SetcolMatches = re.Execute(s)

属性一:返回集合的元素数量: MsgBox colMatches.count

属性二: Item根据制定的键返回元素: MsgBoxcolMatches.item(0)

 

一个正则表达式执行,会产生0个或多个Match对象。每个对象有三个只读的属性:搜索找到的字符串;字符串长度;找到该匹配位置的索引。

ForEach objMatch in colMatches

 

Next

属性一:搜索找到的字符串objMatch.FirstIndex

属性二:字符串长度 objMatch.Length

属性三:找到该匹配位置的索引objMatch.Value

 

3.正则表达式字符: 大写的字符和小写的字符作用相反:

               e.g.        \b 匹配一个单词边界,

                               \B匹配一个非单词边界。

非数字: re.Pattern = “[\D]”

三种特殊字符用于锚定模式:输入开头(在[]外使用^),输入的结尾($)或是单词边界(\b).

缩短模式的方法就是重复数: e.g.      re.Pattern =”\d{3}”   三个数字。

指定匹配范围或次数:

一次以上: re.Pattern = “\d+”

0次或多次:re.Pattern = “\d*”

0次或者1次:re.Pattern = “\d?”

4.一些例子:

匹配空白: “^[ \t]*$”

 

 

 

Sometips:

1.    

vbCrLf  回车/换行组合符。

vbCr        回车符。

vbLf  换行符。

所以不同的平台对于“换行符”都有一种约定
windows平台是vbCrLf                         UNIX/Linux系统是vbLf                        苹果系统是vbCr

“windows平台是vbCrLf”,这并不是说Windows下的程序遇到vbCr或者vbLf就一定无法正常显示。有的程序不能正常显示,比如记事本.

2.   All characters:

' all the upper case character

For i = 65 To 90

        x = "" &x &chr(i)

Next

Msgbox x

 

' all the lower case character

For j = 97 To 121

        y = ""& y & chr(j)

Next

msgbox y                               

 第七章:脚本运行时对象:

存在于单独的组件中,和VBS解释器是分开的。

创建与销毁对象:

Set objDict = CreateObject(“Scripting.Dictionary”)

Set objDict = Nothing

字典对象:

三种不同的添加方法以及exsit方法:

Set objDict = CreateObject(“Scripting.Dictionary”)

objDict.Add “1234”, “Cat”

objDict.Item(“1234”)= “Cat”

objDict(“1234”)= “Cat”

If objDict.Exisit(“1234”) Then

FileSystemObject库:文件和文件夹的操作

FSO对象模型:

·      FileSystemObject

·      Drive

·      Drives

·      File

·      Files

·      Folder

·      Floders

·      TextStream

可以做这样的操作

推荐阅读
author-avatar
姑娘要上进
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有