第一章 编程快速入门
变量是一断预留用于储存数据的计算机内存。内存是临时的(不像硬盘),内存都有独一无二的地址。不同类型的变量需要的内存数量不同。
自顶向下程序设计:适合面向任务的脚本中自顶向下的设计比较合适。代码从头到尾一行一行执行。
事件驱动程序设计:代码只有在某个特定事件发生时才会被执行。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
可以做这样的操作