VBScript 程序员参考手册 读书笔记01-07
?第一章 編程快速入門
變量是一斷預留用于儲存數據的計算機內存。內存是臨時的(不像硬盤),內存都有獨一無二的地址。不同類型的變量需要的內存數量不同。
自頂向下程序設計:適合面向任務的腳本中自頂向下的設計比較合適。代碼從頭到尾一行一行執(zhí)行。
事件驅動程序設計:代碼只有在某個特定事件發(fā)生時才會被執(zhí)行。Windows程序/web編程都是基于事件驅動模型寫的。
自頂向下和事件驅動結合程序設計。
編程習慣:不要再對個任務中使用同一個變量。
第二章 VBS是什么?
VBS 是VB的子集。
VBS是解釋性語言,沒有被編譯。編譯意味著代碼(如C++)在交付前編譯為擴展名為.exe的可執(zhí)行文件。
?
?
第三章 數據類型 data type
1. 語言分類:
1.1強類型語言(strongly typed language):要求事先聲明變量,還要聲明數據類型。比如編譯型語言。
1.2弱類型語言 (loosely typed language): 不需要聲明變量的數據類型。比如腳本語言,含vbs。
2.運行流程:
普通文本中編寫代碼à執(zhí)行腳本文件à腳本在運行時引擎(runtime engine)在程序運行時編譯代碼à程序運行。
3.程序員的要求:實現需求,沒有bug,遺留代碼方便別人理解閱讀。
4.VBS中唯一的數據類型:Variant.
但是它有很多子類型:比如String, Date, Boolean等。
5. 兩種方式更改變量的子類型:
???????????????隱式更改(implicit type coercion):隱式更改發(fā)生在被賦值之前。在被賦的值賦到這個變量前,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)函數。
區(qū)別:Empty是隱式的,而Null是顯式的。
處理:空字符串和Null連接在一起,結果就是空字符串。所以對取數據庫值的最好處理方式:
???????????????strName = “”+rxCustomers.Fields(“Name”).value
14.含有Object子類型:含有對象引用的變量。對象有屬性和方法。類通常是組件的一部分。
?????生成object: Set obj =WScript.CreateObject(“Scripting.FileSystemObject”)
??Nothing 是一個特殊的值,只針對Object變量。如果這個變量對象被銷毀或者還沒有被初始化,它就是值為Nothing的變量。
????銷毀對象: Set obj = Nothing
????因為對象的變量耗很大的內存。養(yǎng)成習慣,對象用完就要設為 Nothing.
15.數組: 比如 Dim avar(2,4)?? 三行五列!!!
???????????????動態(tài)的數組: Dim avar()
???????????????????????????????????????????????ReDim Preserve avar(2,0)
???????????????????????????????????????????????ReDim Preserve avar(2,1)
注意: Preserve關鍵字只能改變數組最后一個維度的大小,否則會有一個運行的大小。所以使用二維數組,最好把第一維視為列,第二維視為行來設計你的數組。
數組的遍歷:Ubound(arrName,2) 函數來統(tǒng)計行數,2代表2維數組。再用for循環(huán)遍歷。
清除數組:對于靜態(tài)數組,數組元素的數據會被清除,但元素本身依然存在。但對于動態(tài)數組,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 |
其他編碼規(guī)范:
常量:全部大寫或con前綴;
數組:字母a或arr的前綴;
?
第四章 變量與過程
1. 變量不是必須聲明的。比如
???????????????lngFirst = 1
???????????????lngSecond = 2
???????????????lngThird = lngFirst + lgnSecond
這里三個變量都沒有聲明,但都可以用。但是有這個可能,你把lngSecond寫成了lgnSecond,程序默認它是第四個變量,賦值為0。所以lngThird是1。
2. 但是如果要求都是顯式聲明,在所有的代碼前加上Option Explicit 語句,養(yǎng)成習慣
???????????????例: Option Explicit
3. 變量命名規(guī)則:首字符為字母,其他非首字符可以是字母,數字,下劃線。
????????? 必備的技術: 匈牙利命名原則”
4. 函數有返回值,過程沒有返回值。
過程用Sub開始(“subprocedure”的縮寫)。語法:
[Public| private] Sub name ([arg1],[arg2])
[Codeinside the procedure]
EndSub
關鍵字Public | private只有在類內部才使用。但是.vbs文件是個孤島(在Windows腳本宿主文件),其他腳本無法訪問內部的代碼。
命名盡量用動詞-名詞結合,比如:ProcessOrder. 參數可有可無。
?
函數唯一的區(qū)別就是把關鍵字改為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 |
?。這里有一個要時刻記住的重要原則:必須要盡可能地限制變量的生存期和作用域。因為變量會消耗內存,;限制作用域可以減少程序的錯誤,并提高代碼的可理解性和可維護性。只要遵守模塊化的良好原則,設計優(yōu)良的過程和函數自然就會處理好作用域和生存期問題—— 無需任何額外的努力。
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語句。
系統(tǒng)自帶的內建常量:很多以vb前綴來識別。比如vbExclamation
MsgBox “Hello”,vbExclamation
?
第五章 流程控制 control of flow
大部分人都很難理解超過三重或四重的嵌套.
分支:
If… ElseIf…Else…EndIf
Selectcase…case …case else…End Select
循環(huán):
For… Next\For Each ..Next
Do…Loop While (或者while在前):只有在While語句中的表達式為True時循環(huán)才會再次執(zhí)行
Do…Loop Until? (或者Until在前): 反復執(zhí)行一段語句,直到(until)某一條件為True。
盡管While和Until語句有些不同,但是它們的功能是一樣的。
可以用Exit Do隨時跳出Do循環(huán)。
While…Wend有點過時,但是能讀懂別人代碼中的用法。While…Wend最主要的限制就是它沒有等價于Exit For或Exit Do的語句,這意味著不能強行跳出循環(huán)。
第六章 錯誤處理 exception handling
看函數文檔有哪些可能的錯誤并防止;多測試;搜索答案;
1. 三種錯誤:
語法錯誤(Syntax error):編譯錯誤,結果終止腳本的執(zhí)行;比如缺關鍵字,無法識別的表達式;
運行錯誤(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)
?
一個正則表達式執(zhí)行,會產生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系統(tǒng)是vbLf??????????????????????? 蘋果系統(tǒng)是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解釋器是分開的。
創(chuàng)建與銷毀對象:
| 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
可以做這樣的操作總結
以上是生活随笔為你收集整理的VBScript 程序员参考手册 读书笔记01-07的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根据斗破苍穹改编的Java游戏_不仅《斗
- 下一篇: 【camera】【ISP】Lens Sh