热门标签 | 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

可以做这样的操作

推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 【编程游戏】贺岁霓虹灯。(第一名奖励10000可用分)效果图评分参观[目前Firefox中好使,其他浏览器需复制到本地,存为html文件看效果]<html><head>&l ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
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社区 版权所有