跟我从头学WSH(3)–脚本逻辑
作者:qiqinghua
来源:青蛙的梦想
一.VBScript基本规则
Vbscript的基本规则
?大小写不敏感:
WSCRIPT.ECHO
WScript.echo
wscript.echo
虽然对大小写不敏感,但是不应该使用全大写或全小写,这样使得脚本难于阅读
?跳过所有多余的空格
For example:
WScript. Echo "Hello"
is the same as:
WScript.Echo "Hello"
?不规定每行的最大长度
换言之,你可以将多个逻辑行用colon divider连接在一起
WScript.Echo "Test One" : WScript.Echo "Test Two"
?Vbscrip 允许你分割一个长句,可以用一个空格和一个下划线来隔断,这样使得阅读更加容易一点。
WScript.Echo "Message to" _
& vUserName _
& " Please make sure that you remember" _
& " to logoff or lock your workstation" _
& " if you leave it unattended, Thanks"
?名称不能超过255个字符,包括项目定义,变量,constants和procedures
二。 变量,常量和数据类型
(1)变量
变量
?可变化值的容器
nMyAge = nMyAge + 10
WScript.Echo nMyAge
?String Data
strServer = "MyServer"
?Date and time
?时间和日期变量的值要用”#”扩起来
?名称限制
?以字母开头
?不能有间隔
?便不能超过255个字符
?在当前的域中必须唯一
?申明变量
?默认情况下,脚本为第一次读到的变量创建一个值,但这样就会导致出现问题后难于跟踪:
nMyAge = 35
nMyAge = nMiAge + 10 (这里的nMyAge被打成了nMiAge,最后的值变成了10)
WScript.Echo nMyAge
Option Explicit
这样所有的变量使用前需要先申明
你可以使用下面的语句来声明变量:
Dim
Private
Public
Static
你可以用dim来声明变量,使得系统为变量保存一定的内存
Dim nMyAge
Dim nMyAge, nMyName, nMyAddress
(2)常量
就像声明变量,你可以在脚本中声明和使用constants
?在脚本执行的过程中不改变值
?使得脚本更加容易阅读和debug
?在脚本的开始的地方assigned
?Const语句
Constant 可以表示一个字符串,一个数字或算法、比较和逻辑操作符
Const COMP_NAME = "Microsoft“
注意,如果你尝试在脚本中改变常量的值得话,会导致下列错误:
Microsoft VBScript compilation error: Name redefined
Type Library constants
许多类libraries描述的对象模型包含constant values,它能够合法的作为方法参数传递。
比如,在ADSI object model,很多常量被暴露,用于帮助创建新的objects,比如活动目录中的用户和组。
当一个新的组创建,ADSI采用一个creation flag确定组的类型,如果flag的值是2,ADSI知道创建的是Global group,其他的常量值和其他的组类型相称。为了使得阅读容易,这个ADSI type library 使用有意义的名字来expose(暴露)这些常量值,比如:
ADS_GROUP_TYPE_GLOBAL_GROUP
如果要在一个标准的vbscript脚本中使用,常量的值必须在脚本的开头明确说明
CONST ADS_GROUP_TYPE_GLOBAL_GROUP = &H2
&H2代表16进制的2
Intrinsic constants
有一些有用的constants被内置在VBS edition中,,这些constants,提供了一种方便的途径来使用特定的值,而不必记住特定的值。因为那些constants已经被定义在vbscript,不需要明确的声明他们,你可以简单使用他们代表的值
vbCrLf
sMessage = "Welcome to the world of VBScript" & vbcrlf & _
"and all the useful commands that it provides" & _
vbcrlf & "Please press the OK button to continue"
MsgBox sMessage
(3)数据类型
数据类型:
Variants
一个variant可以包括数字,日期和时间,对象,布尔值或字符串,在很多情况下,VBScript会自动检测数据类型。
vDemoA = "My"
vDemoB = "Server"
vAnswer = vDemoA + vDemoB
WScript.Echo vAnswer
VDemoA = 5
vDemoB = 10
vAnswer = vDemoA + vDemoB
WScript.Echo vAnswer
Variant Subtypes
可以将variant数据类型分为子类型
Empty 变量没有初始化
Null 变量没有初始化
Byte: 0-255
Integer:-32768-32767
Long: –2,147,483,648 and 2,147,483,647.
转换函数:
有些时候,你需要将一种数据类型转换成另一种数据类型。(比如你要提取某个数据的第几位数据,你需要用ctsr将其转换成字符,然后用len,left,right等函数提取数据,然后将Cint将其转换成数字)。
CInt Returns a Variant of subtype Integer
CBool Returns a Variant of subtype Boolean
CByte Returns a Variant of subtype Byte
CCur Returns a Variant of subtype Currency
CDate Returns a Variant of subtype Date
CDbl Returns a Variant of subtype Double
CLng Returns a Variant of subtype Long
CSng Returns a Variant of subtype Single
CStr Returns a Variant of subtype String
(4) 命名约定
?并不需要,但最好有良好的命名习惯
?一些命名的约定的建议规则
?采用前缀:
str String
Fn Function
C (or capitalize each letter in the constant name) Constant(常量)
B Boolean (True or False)
d Date
obj An object reference
n A numeric value
函数,方法名在每一个多名字开头的地方用大写字母。比如:
WScript.Echo objMyServer.Name
Sub CheckDateSub()
早期的vbscript没有const命令,所以常量就被定义为变量,并且命名的时候全部采用大写字母:
COMPANY_NAME
DEFAULT_PATH
命名一致性:
你可以不采用匈牙利命名规范,可以自己定义命名规定,但必须贯彻在所有的脚本中,这将帮助排错和阅读。
(5)数组
一个变量可以有多个值
下面的定义的数组可以包含三个离散的值:
Dim MyArray(2)
给数组赋予值
MyArray(0) = 100
输出数组的值:
WScript.Echo MyArray(1)
多维数组:
Dim MyTable(4, 9)
5行10列的一个表格
注意,在vbscrip中你顶多定义60个维度。但注意,出于容易理解和阅读,不应该超过4到5个维度。
数组可以包含不同的数据类型,这经常用在存储相关联的同样对象上。(比如第一个值可以上用户姓名,其他的列为电话等等)。
(6)动态数组
不知道边界或维度的时候,需要动态数组
申明一个数组,但是省略掉边界
Dim MyArray()
初始化这个数组的尺寸:
ReDim MyArray(4)
非常重要的是:redim语句删除在数组中的值。
采用Preserver关键词,则数组中原来的值保持不变。
(注意,如果你resizing从大到小,你就不可避免的要丢失一些数据,不管你用不用preserver关键词)
动态数组也可以使用array语句来实现:
Dim MyArray
MyArray = Array(100, 200, 300, 400, 500)
删除数组:
Erase MyArray
这将删除数组的内容,但数组本身还在,当使用这个命令的时候,数据被删除,动态数组被“非初始化”,如果要使用这个数组,需要redim语句进行重定义。
Ubound函数
在采用动态数组的时候,你经常不知道数组包含了多少元素,可以采用UBound函数来解决这个问题:
UBound(arrayname[, dimension])
Dimension是维数,如果只有一维,则可以省略。
三。操作符
(1)操作符
操作符:
主要的操作符:
算法:
^ 求幂
– 负数
\ 整数除,返回整数值
连操作符:将多个字符串连接成一个 字符串
WScript.Echo "The path is, " & strPath & " on Server B"
或
nAge = InputBox("Please enter your Age.")
nTogo = 65 – nAge
MsgBox "You have " & nTogo & " years until you retire!"
比较符:返回的是真或假
IS 等价
result = value1 operator value2
逻辑操作符:
bNegResult = Not bResult
If the value of bResult is True, the value of bNegResult is set to False.
EQV 等值
IMP 牵连
操作优先级 (多用括号)
^
–
*, /, and \
MOD
+, –
&
=, <>, < >, <=, >=, and IS
NOT
AND
OR
XOR
EQV
IMP
四。条件和循环
(1)条件语句
条件语句
If then
If MyVar = 5 Then WScript.Echo "MyVar = 5"
Else
If MyVar = 5 Then
WScript.Echo "MyVar = 5"
Else
WScript.Echo "MyVar does not equal 5"
End If
Elseif
If MyVar = 0 Then
WScript.Echo "MyVar = 0"
ElseIf MyVar = 1 Then
WScript.Echo "MyVar = 1"
ElseIf MyVar = 2 then
WScript.Echo "MyVar = 2"
Else
WScript.Echo "Sorry value is out of range"
End If
End if
用在执行多个语句的情况下:
If MyVar = 5 Then
WScript.Echo "MyVar = 5"
WScript.Echo "Reseting MyVar"
MyVar = 0
End If
(2)select case语句
条件语句:select case
Select Case MyVar
Case "0"
WScript.Echo "MyVar = 0"
Case "1"
WScript.Echo "MyVar = 1"
Case "2"
WScript.Echo "MyVar = 2"
Case Else
WScript.Echo "Sorry value is out of range"
End Select
(3) for-next
For iCounter = 1 To 10
WScript.Echo "This is loop number " & iCounter
Next
For iCounter = 1 to 10 Step 2
WScript.Echo "Odd number " & iCounter
Next
For iCounter = 10 to 2 Step -2
action(s)
Next
Exit for
vInput = InputBox ("Enter the Value to stop the loop at")
iStop = CInt(vInput)
For iCounter = 1 to 10
WScript.Echo "Current iCounter Value = " & iCounter
If iStop = iCounter Then Exit For
WScript.Echo "Around we go again"
Next
WScript.Echo "Loop exited at value of " & iCounter
For each…next
用于不知道数组中有多少元素的情况
For Each File in objFiles
WScript.echo File.Name
Next
(4)do – loop /while – wend
当不知道要循环几次时,通常采用这种方法
Do While…Loop
Do While vMyVar < 100
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop
Do Until…Loop
Do Until vMyVar >= 100
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop
Do…Loop While (将检查点放置在循环语句的后面)
Do
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop While vMyVar < 100
注意,在检查这个条件的时候,即使条件不符合,也已经执行了一次操作。
Do…Loop Until
Do
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop Until vMyVar >= 100
Exit Do
就像Exit for一样,在中途退出,可以用Exit do
vInput = InputBox ("Enter the Value to stop the loop at")
iStop = CInt(vInput)
Do While iCounter < 10
iCounter = iCounter + 1
WScript.Echo "Current iCounter Value = " & iCounter
If iStop = iCounter Then Exit Do
WScript.Echo "Around we go again"
Loop
WScript.Echo "Loop exited at value of " & iCounter
While…Wend
是早期的vbscript的语法之一,现在也兼容
While vMyVar < 100
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Wend
通常情况下,用do…loop比while … wend好,因为有更好的兼容性和结构性。
五。内置函数
内置函数
日期和时间函数
Now
WScript.Echo Now
This function returns a value like 26/06/2000 15:23:41
其格式由你设置的国家设置决定
Time
WScript.echo Time
This function returns a value such as 15:24:27
Data
WScript.Echo "Today’s Date is : " & Date
This function returns a value such as 26/06/2000
DateDiff
返回两个日前之间的天数
vDate = DateDiff("d", Date, "01/01/3000")
WScript.Echo "Days until the next Millennium: " & vDate
“yyyy” 两年之间的年数
“m” 两个日前间的月数
“h” 两个日期间的小时数
字符操作函数
LCase (小写)
UCase (大写)
vName = InputBox("Please enter your home country?")
vName = LCase(vName)
Select Case vName
Case "uk"
WScript.Echo "Welcome to the UK!"
Case "usa"
WScript.Echo "Welcome to the States!"
Case "germany"
WScript.Echo "Welcome to Germany!"
Case "france"
WScript.Echo "Welcome to France!"
Case Else
WScript.Echo "Sorry, try again! "
End Select
数学函数
Rnd
返回0-1之间的7位小数
要初始化随机数,用randomize语句
Randomize
WScript.Echo Rnd
Randomize
WScript.Echo Rnd * 100
这样产生0-100之间的数值
Round
将数据转化成最近的整数
Randomize
vRnd = Rnd * 100
WScript.Echo Round(vRnd
六。过程
(1)子程序和函数
Sub和函数过程
在visual basic scripting edition中,有两种procedures:子程序和函数
Sub procedure
优点,代码重用
Dim sStausMessage
Call Welcome
sStausMessage = "Starting…"
Call Status
sStausMessage = "Ending…"
Call Status
Call Farewell
Sub Welcome()
WScript.Echo "Hello"
End Sub
Sub Status()
WScript.Echo sStausMessage
End Sub
Sub Farewell()
WScript.Echo "Goodbye"
End Sub
注意,call语句是可选的
Function procedures
和sub很相似,function通常返回一个值
Dim dDate
dDate=Tomorrow
WScript.Echo dDate
Function Tomorrow()
Tomorrow= DateAdd("d",1,Date())
End Function
Exiting a procedure
如果通过if then语句结构,决定要离开procedure,可以通过exit语句来退出。当到达end sub语句的时候,就回到调用的时间点。
传递参数
在子程序的括号中,以逗号分隔。
Function GrossValue(NetValue, TaxRate)
GrossValue=NetValue + (NetValue * TaxRate)
End Function
WScript.Echo "Gross Value is: " & GrossValue(100,0.175)
Byref: 如果你在子程序中改变了参数的值,初始的值也随之改变
Function GrossValue(ByRef NetValue, ByRef TaxRate)
GrossValue=NetValue + (NetValue * TaxRate)
End Function
Byval: 不改变初始的值
Function GrossValue(ByVal NetValue, ByVal TaxRate)
GrossValue=NetValue + (NetValue * TaxRate)
End Function
举例:
Dim iNumber, iResult
iNumber=30
iResult = Doubler(iNumber)
WScript.Echo "Two times " & iNumber & " is " & iResult
Function Doubler(ByRef InputNum)
InputNum = 2 * InputNum
Doubler = InputNum
End Function
结果:“Two times 60 is 60,”
Dim iNumber, iResult
iNumber=30
iResult = Doubler(iNumber)
WScript.Echo "Two times " & iNumber & " is " & iResult
Function Doubler(ByVal InputNum)
InputNum = 2 * InputNum
Doubler = InputNum
End Function
“Two times 30 is 60,”
(2)范围和生命周期
作用域和生存时间
Script-level变量
如果一个变量被在main body中被申明,变量可以在main body或任何procedures中,被称为script-level变量,有secrip-level作用域
可以用dim关键词或private关键词,这两个关键词是同义的关键词。用来定义script-level变量
Public关键词可以定义跨脚本的变量,你只能在一个脚本使用另一个脚本的时候使用,比如.wsf文件。
Script-level变量在整个脚本中必须唯一。
Procedure-level 变量
当一个变量在procedure中被申明,只有在procedure中可以访问或改变变量的值。被称为procedure-level变量。
Procedure-level变量只存在于procedure运行的时候,当procedure结束,这个变量将被删除。
可以有不同的procedure中有相同的变量名称
在procedure-level变量中,只能使用dim来申明变量,不能使用public或private.