2025-02-27 22:25:34 +08:00

2784 lines
116 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Msgbox是VBS内建的函数每一个函数都可以完成一定的功能你只需要按照语法要求在函数的相应部分填写相应的内容就可以了这部分内容我们称为参数当然函数执行的结果我们称为返回值一个函数可以有返回值也可以没有可以有参数也可以没有。你不用了解函数是怎么运作的只要了解这个函数能干什么就行了。
Msgbox语法msgbox "对话框内容", , "对话框的标题"
你不妨用记事本打开刚才的文件在编辑窗口中输入:
msgbox "Hello World!" , , "系统提示"
执行一下,看看效果和位置。
说明之三:如果执行失败,看看你的标点符号,所有的标点符号必须是在英文状态下输入的。
当然,这个脚本实在是太简单了,甚至连最简单的交互都没有,所以你可以把脚本这样修改一下:
Dim name
name=Inputbox("请输入你的名字:","名称")
Msgbox name, , "您的名字是"
保存执行一下,看到弹出的对话框了么?填入你的名字,点确定,看到结果了吗?
说明之一第一句是定义变量dim是定义变量的语句
其格式为dim 变量1,变量2……
Vbs只有一种变量类型所以不用声明变量类型。系统会自动分辨变量类型。
说明之二inputbox是VBS内建的函数可以接受输入的内容其语法格式为
Inputbox("对话框内容","对话框标题")
第二句的意思是接受用户的输入并把输入结果传递给变量name。
好了,到此脚本基本的输入输出函数都有了,已经可以完成一些比较简单的功能了,你可以编写一个简单的脚本,然后拷贝的“程序”—>“启动”中,然后重新启动计算机看看结果。
VBScript基础知识
一、变量
1、所有单引号后面的内容都被解释为注释。
2、在VBScript中变量的命名规则遵循标准的命名规则需要注意的是在VBScript中对变量、方法、函数和对象的引用是不区分大小写的。在申明变量时要显式地申明一个变量需要使用关键字DIm来告诉VBScript你要创建一个变量并将变量名称跟在其后。申明多个同类型变量可以用逗号分隔。注意VBScript中不允许在申明变量的时候同时给变量赋值。但是允许在一行代码内同时对两个变量进行赋值中间用冒号分隔。
3、你可以使用OptionExplicit来告诉宿主变量必须先声明后使用。
4、VBScript在定义时只有一种变量类型在实际使用中需要使用类型转换函数来将变量转换成相应的变量类型。
Cbool函数将变量转换成布尔值
Cbyte函数将变量转换为0到255之间的整数。
Ccur函数、Cdbl函数和Csng函数将变量转换为浮点数值前者只精确到小数点后四位后两者要更加精确数值的范围也要大的多。
Cdate函数将变量转换为日期值。
Cint函数和Clng函数将变量转换为整数后者的范围比前者要大的多。
Cstr函数将变量转换为字符串。
二、数组
数组的定义与变量非常类似只需要在变量后描述这个数组的个数和维数。需要注意的是数组的下标总是从0开始而以数组定义中数值减一结束。也就是说你以要定义一个有十个数据的数组将这样书写代码dImarray9同样当你要访问第五个元素时实际的代码是array(4)。当然你可以通过不指定数组的个数和维数来申明动态数组。等到数组的个数和维数固定后使用关键字redim来改变数组。注意在改变数组的大小时数组的数据会被破坏使用关键字preserve来保护数据。例如
RedIm空格preserve空格array括号个数逗号维数括号
三、操作符
在VBScript运算符中加减乘除都是我们常用的符号乘方使用的是 ^ 取模使用的Mod。
在比较操作符中,等于、小于、大于、小于等于、大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用。
逻辑运算符为:和操作—>AND 非操作—>NOT 或操作—>OR
你可以使用操作符 + 和操作符 & 来连接字符串,一般使用&操作符;
另外还有一个比较特殊的操作符Is用来比较对象例如按钮对象如果对象是同一类型结果就是真如果对象不是同一类型结果就是假。
四、条件语句主要有if……then语句和selectcase语句两种形式
在if……then语句中其基本形式为
If 条件 then
处理条件的语句;
……
Endif
基本形式只能对单个条件进行验证如果有两个条件则需要在基本形式中添加单行语句else如果还有更多的条件需要验证则需要添加语句
Elseif 条件 then
处理条件语句
在selectcase语句中其基本形式为
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文件中。
现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad”
同样,保存执行。那么看到了一个什么样的结果呢?在桌面上又打开了一个记事本。
说明之一Set是Vbs指令凡是将一对象引用赋给变量就需要使用set关键字。那么什么是对象引用呢凡是字符串、数值、布尔值之外的变量都是对象引用。Objshell是变量名可以随意修改。
说明之二:反是正确引用的对象,其本身内置有函数和变量,其引用方法为在变量后加“. ”后紧跟其实现功能的函数就可以了。Objshell.run
的意思就是调用Wscript.shell中的运行外部程序的函数——runnotepad是记事本程序的文件名。当然你也可以改成“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对象他有两个方法clearraise5个属性descriptionhelpcontexthelpfilenumbersource
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("HKEY_LOCAL_MACHINE"SOFTWARE"Microsoft"Windows"CurrentVersion"Run"nwiz")
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
删除关键字和值
使用regdelete方法把完整的路径传递给regdelete就可以了
例如
val=ws.regdel(path)
注意,如果要删除关键词的值的话一定要在路径最后加上“"”,如果不加斜线,就会删除整个关键词。
当然从现在的角度看还是使用WMI的注册表处理功能也许更好些。
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
拷贝:
注意如果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
一般指的就是系统文件夹:"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
这个方法使用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)'返回临时目录
当然还有简单的方法那就是使用getspecialfolder() 3、特殊文件夹
set fs=wscript.createobject(“scripting.filesystemobject”)
fs.copyfolder “c:"data” “d:"data”
set fs=wscript.createobject(“scripting.filesystemobject”)
fs.deletefolder(“c:"windows”)
删除:
Vbs脚本编程简明教程之九—妙用SendKeys简化重复操作
每次开机的时候你想自动登陆你的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 — %
如要发送的组合按键是同时按下CtrlE需要用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"
代码的含义为按下CtrlEsc组合键相当于按Win键打开“开始”菜单接着按U键打开“关机”菜单。
例二让VBS脚本自动在记事本中输入一行文字“hello, welcome to cfan”。
Dim WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad"
WScript.Sleep 2000
//本行的含义为是脚本暂停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”注意关闭记事本可以直接使用组合按键AltF4来实现。
例三:制作能自动定时存盘的记事本
我们最常用的记事本没有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以后要使用记事本时都通过双击这个脚本文件来打开。
程序说明这个脚本的基本思路是定时向记事本发送CtrlS这个存盘组合键。
第一部分定义了脚本中需要用到的变量和对象。“AutoSaveTime”变量用来设置自动存盘间隔单位为毫秒这里设置为5分钟。“TXTFileName”变量通过输入框取得你要创建的文本文件名称。
第二部分运行记事本对于Windows本身提供的程序比如计算器等可直接在“WshShell.Run”后输入程序名称如"calc"对于非系统程序则可输入完全路径但要注意使用8.3格式输入,比如“"D:"Progra~1"Tencent"QQ.exe"”。
第三部分这里用SendKeys命令执行了这样的操作流程请注意每个操作之间延时命令的使用在记事本中按CtrlS组合键→弹出保存文件的窗口→输入文件名→按AltS组合键进行保存默认保存在“我的文档”目录
第四部分定时存盘的关键通过“While……Wend”这个当条件为“真”时循环命令实现自动存盘代码“WshShell.SendKeys
"^s"”和定时代码“WScript.Sleep
AutoSaveTime”的重复执行。因为不能让这个定时存盘循环一直执行退出记事本后必须自动退出脚本并结束循环所以设计了一个循环判断条件“WshShell.AppActivate
TXTFileName=True”当记事本运行中时可以激活记事本窗口这个条件运行结果为“True”定时存盘循环一直执行退出记事本后脚本无法激活记事本窗口就会跳出循环执行“Wend”后面的“WScript.Quit”退出脚本。
例四:关机菜单立刻显身
打开记事本输入以下命令并将其保存为1.vbs
set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^{ESC}u"
双击运行它,你会发现关机菜单立刻出现了。
将“WshShell.SendKeys "^{ESC}u"”改为“WshShell.SendKeys "^+{ESC}"”,运行一下看看是否打开了任务管理器。
让我们举个例子利用SendKeys自动上网并登陆博客
将下面的脚本复制到一个文本文件中,并将其文件名命名为:自动登陆.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网址之家---实用网址,搜索大全,尽在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}"
Vbs脚本编程简明教程之十 —— Vbs脚本编程常用的编辑器
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脚本编程简明教程之十三 —使用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脚本编程简明教程之十四—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 函数;返回一个字符串在另一个字符串中出现的位置,但是从字符串的尾部算起。
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。
Sgn 函数:返回反映数的符号的整数。
Sin 函数:返回角度的正弦值。
Space 函数:返回由指定数量的空格组成的字符串。
Split 函数:返回下限为 0 的、由指定数量的子串组成的一维数组。
Sqr 函数:返回数的平方根。
StrComp 函数:返回反映字符串比较结果的数值。
String 函数:返回指定长度的重复字符串。
StrReverse 函数:返回一字符串,其中字符的顺序与指定的字符串中的顺序相反。
Tan 函数:返回角度的正切值。
Time 函数:返回表示当前系统时间的“日期”子类型的“变体”。
Timer 函数:返回时经子夜 1200 AM 后的秒数。
TimeSerial 函数:返回含有指定时分秒时间的日期子类型的变体。
TimeValue 函数:返回含有时间的日期子类型的变体。
Trim 函数:返回去掉前导空格或尾部空格的字符串副本。
TypeName 函数:返回一字符串,它提供了关于变量的变体子类型信息。
UBound 函数:返回指定维数数组的最大有效下标。
UCase 函数:返回的字符串已经被转换为大写字母。
VarType 函数:返回标识变体子类型的数值。
Weekday 函数:返回表示星期几的数值。
WeekdayName 函数:返回表示星期几的字符串。
Year 函数:返回表示年份的数值。
Vbs脚本编程简明教程之十五——响应事件
什么是事件?在我看来,事件就象我们手机上的闹钟,闹钟一响,我们就要去做某些特定的事情。或者这样说,事件就像警钟,当程序运行时,有特殊的事情发生,就会激发事件,事件本身就是一条消息,如果你编写的脚本要对事件进行处理,就需要一个特殊的过程或者函数来接受和处理事件。那么这个特殊的过程或者函数在程序运行时,就不断的监听,看系统是否传来了相应的事件,一旦接受到事件,脚本对此作出反应。
那么事件是从那里来的呢是否需要我们在脚本中对事件进行编写呢一般情况下事件是某个程序在运行中的特殊状态发出的我们不需要对事件进行编写只需要编写处理事件的函数。比如说我们用vbs建立了ie的一个实例那么当ie的窗口被关闭的时候就会激发出一个叫做OnQuit的事件。
是不是脚本自然而然就能接受事件并进行处理呢我们说不是的在创建对象的时候我们将使用WSH的createobject命令例如
Set objie=Wscript.createobject(“internetexplorer.application”,”event_”)
注意到了吗多了一个参数这个参数的作用是什么呢它叫做事件接收端当脚本连接的对象包含事件时如果对象调用的事件是OnBegin那么WSH将会在脚本中调用一个event_OnBegin的事件处理程序。当然事件接受端并不是固定的如果对象将其定义为MyObj_的话那么事件处理程序将是MyObj_OnBegin。
是否很熟悉在打造个性化QQ一讲中曾经出现过Window_OnSize(cx,cy)函数,它其实就是一个事件处理程序。
让我们来举个实际的例子完整的看看事件的处理过程:
Set objie=WScript.CreateObject("InternetExplorer.Application","event_")
objie.Visible=True
MsgBox "请关闭浏览器窗口看看效果!",vbSystemModal
Wscript.sleep 6000
MsgBox "现在已经正常关闭了"
Sub event_onquit()
MsgBox "您确定要关闭浏览器吗?",vbSystemModal
End Sub
这段脚本打开了一个IE窗口然后要求你关闭IE窗口当你关闭窗口的时候自动调用事件响应程序。
Vbs脚本编程简明教程之十六——访问ADO数据库
ADO是Microsoft提供和建议使用的新型数据访问接口它是建立OLEDB之上的一个抽象层。微软公司在操作系统中默认提供了 Access 的 ODBC 驱动程序以及 JET 引擎,
一、对ADO对象的主要操作一般包括6个方面
1.连接到数据源。通常使用ADO的Connection对象。一般使用相应的属性打开到数据源的连接设置游标的位置设置默认的当前数据库设置将使用的OLEDBProvider直接提交SQL脚本等。
2.向数据源提交命令。通常涉及ADO的Command对象。可查询数据库并返回结果在Recordset对象中。
3.执行SELECT查询命令。在提交SQL脚本的任务时不用创建一个Command对象就可完成查询。
4.可以通过ADO的Recordset对象对结果进行操作。
5.更新数据到物理存储。
6.提供错误检测。通常涉及ADO的Error对象。
二、ADO中主要对象的功能
Recordset对象用来封装查询的结果。
Field对象用来表达一行结果中各子段的类型和值。
Error对象用来检测和判断在数据库操作中出现的错误比如连接失败。
在ADO中许多对象名后多了一个"s"比如Error->ErrorsField->Fields等等。添加"s"意味着是相应对象的Collection集合对象比如Errors是Error对象的Collection对象。Collection有点像数组Array但不同的是Collection可以以不同类型的数据或对象作为自己的元素而数组中的各元素通常都是相同类型的。所以在看到一个对象名最后是"s"通常表明这是一个Collection对象比如Errors中的各元素是由Error对象的实例组成的。
三、具体应用
1、创建mdb数据库
ADOX 是ADO 对象的扩展库。它可用于创建、修改和删除模式对象,如数据库和表格等。
其常用的对象有Catalog—>创建数据库。Column—>表示表、索引或关键字的列。
Key—>表示数据库表中的关键字。
常用的方法有: Append 将对象添加到其集合。Delete 删除集合中的对象。
set cat= createobject("ADOX.Catalog")
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:"shujuku.mdb"
Set tbl=createobject("ADOX.Table")
tbl.Name ="MyTable"
tbl.Columns.Append "姓名", 202 'adInteger
tbl.Columns.Append "性别", 3 'adInteger
tbl.Columns.Append "工作单位", 202 ,50 'adVarWChar
cat.Tables.Append tbl
不过你要操纵数据库就连一个数据库也不建,未免懒惰了点,用代码虽然可以完成,但是我觉得对数据约束完成的比较困难,本代码也就是示范个例子,并不推荐使用此类方法。
2、打开数据库
Provider=″Provider=Microsoft.Jet.OLEDB.4.0 ; Data Source="
Set Objconn = createobject("ADODB.Connection")
Objconn.Open Provider & "数据库名称"
3、创建记录集
Set Objrs = CreateObject("ADODB.Recordset")
4、执行SQL查询语句
Sql="SQL查询语句" '例如Select count(*) from table1
Set objrs = objconn.execute(sql)
一般情况下我们将绝大多数的操作转化为SQL语句完成。
常用的SQL语句
在学习SQL语句之前让我们先来对数据库做一个基本的了解。一个数据库中可能包含了很多个基本单位叫做表。表格被分为“行”和“列”。每一行代表表的一个单独组成部分每一列代表相同性质的一组数据。举例来说如果我们有一个记载顾客资料的表格行包括姓、名、地址、城市、国家、生日等。而一列则代表了所有的地址或者国家等。
一、建立数据表我们前边说过利用ADOX.Catalog建立数据库和数据表的方法但是用的似乎不是很多一般情况下如果我们需要在数据库中动态建立一个表我们将工作交给SQL语句来做其基本语法是
CREATE TABLE [表格名]([列名1] 数据类型 , [列名2] 数据类型,... )
例如我们要建立一个基本顾客表:
Create table [顾客表]([姓名] text8, [性别] text2[住址] text(30))
二、插入数据项
insert into [数据表名称] (数据项1,数据项2,...) values (值1,值2,...)
insert into语句用来添加新的数据到数据库中的指定表。通过(数据项1,数据项2,...) values (值1,值2,...)来为新添加的数据赋初值。
三、删除数据项
delete from [数据表名称] where [数据项1] like [值1] and/or [数据项2] like [值2]
...
四、更新数据项
update [数据表名称] set 数据项1=值1,数据项2=值2,... where [数据项1] like [值1] and/or [数据项2] like
[值2] ...
该语句可以修改数据库中指定数据表内的指定数据如果不是用where限定条件就表示修改该表内所有的数据条目。
五、查询数据项
select [数据内容] from [数据表名称] where [数据项1] like [值1] and/or [数据项2] like [值2] ...
order by [数据项] asc/desc
[数据内容]部分表示所要选取的表格中的数据项,使用*表示选取全部。[数据表名称]表示要从哪一个表格中选取如果你没有接触过数据库可能很难了解什么是数据表格没关系我将在后面用到它的时候再说明。where表示选取的条件使用like表示相等也支持>=这样的判断符号同时使用多个条件进行选取时中间要使用and进行连接。order
by决定数据的排列顺序asc表示按照[数据项]中的数据顺序排列desc表示倒序默认情况为顺序。select语句中除select和from之外其它均为可选项如果都不填写表示选取该数据表中的全部数据。例如下面的语句查询某数据库中表名称为testtable中姓名为“张三”的nickname字段和email字段。
SELECT nickname,email FROM testtable WHERE name='张三'
(一) 选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。
1、选择所有列
例如下面语句显示testtable表中所有列的数据
SELECT * FROM testtable
2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如SELECT nickname,email FROM testtable
3、更改列标题
在选择列表中,可重新指定列标题。定义格式为:列标题=列名
列名列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:
SELECT 昵称=nickname,电子邮件=email FROM testtable
(二) FROM子句指定SELECT语句查询的表。
最多可指定256个表它们之间用逗号分隔。如果选择列表中存在同名列这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列在查询两个表中的cityid时应加以限定。
(三) WHERE子句设置查询条件
WHERE子句设置查询条件过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据
SELECT * FROM usertable WHERE age>20
WHERE子句可包括各种条件运算符
比较运算符(大小比较)>、>=、=、<、<=、<>、!>、!<
范围运算符(表达式值是否在指定的范围)BETWEEN…AND…
NOT BETWEEN…AND…
列表运算符(判断表达式是否为列表中的指定项)IN (项1,项2……)
NOT IN (项1,项2……)
模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
空值判断符(判断表达式是否为空)IS NULL、NOT IS NULL
逻辑运算符(用于多条件的逻辑连接)NOT、AND、OR
1、范围运算符例age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2、列表运算符例country IN ('Germany','China')
3、模式匹配符例常用于模糊查找它判断列值是否与指定的字符串格式相匹配。可用于char、
varchar、text、ntext、datetime和smalldatetime等类型查询。
可使用以下通配字符:
百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。
下划线_匹配单个任意字符它常用来限制表达式的字符长度。
方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
例如:
限制以Publishing结尾使用LIKE '%Publishing'
限制以A开头LIKE '[A]%'
限制以A开头外LIKE '[^A]%'
4、空值判断符例WHERE age IS NULL
5、逻辑运算符优先级为NOT、AND、OR
最后,让我们用一个简单的例子结束这篇教程:
Objku = InputBox("请输入单位数据库的路径","默认位置","d:"jbqk.mdb")
Set Objconn = createobject("adodb.connection")
Objconn.open ="provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Objku
sql = "CREATE TABLE [单位资料](ID Autoincrement PRIMARY KEY,[姓名] text(8),[性别]
text(2),[科室] text(6),[住址] text(30))"
Objconn.execute(sql)
sql = "INSERT INTO [单位资料]([姓名],[性别],[科室],[住址]) VALUES('张三','男','行管科','解放路12号')"
Objconn.execute(sql)
sql = "INSERT INTO [单位资料]([姓名],[性别],[科室],[住址]) VALUES('李斯','女','市场科','五一路12号')"
Objconn.execute(sql)
sql = "DELETE FROM [单位资料] WHERE [姓名] = '张三' "
Objconn.execute(sql)
sql = "UPDATE [单位资料]"
sql = "SELECT COUNT(ID) FROM [单位资料]"
Vbs调用MsAgent组件很有趣
Microsoft Agent是微软公司发布的一项代理软件开发技术我们知道在Office帮助系统中有一种叫作Office助手的代理软件但其只允许Office各个组件调用Agent动画人物可由任何Windows程序调用
Agent支持文字气球和输入提示条在输出语音的同时把文字输出至一个卡通式文字气球中。如果电脑系统中安装有Agent语音识别引擎当用户可以通过声卡、麦克风与用户交谈。下午无事就尝试着写了一段简单的代码调用MsAgent
GenieID = "Genie"
GenieACS = "genie.acs"
ScriptComplete=0
Set AgentControl = WScript.CreateObject("Agent.Control.2","agent_")
AgentControl.Connected = True'连接控件
AgentControl.Characters.Load GenieID,GenieACS
Set Genie = AgentControl.Characters(GenieID)
Genie.LanguageID = &H409
Genie.MoveTo 900, 600
Genie.Show
Genie.MoveTo 900, 0
timespeak="good " & GetTimeOfDay()
Genie.Speak(timespeak)
Genie.Play "Acknowledge" '承认
Genie.Speak("眨眼")
Genie.Play "Blink" '眨眼
Genie.Speak("i love you")
Genie.Speak("回复动作")
genie.Play("RestPose") '回復动作
Genie.Speak("向上")
genie.Play("GestureUp") '向上
Genie.Speak("向下")
genie.Play("GestureDown") '向下
Genie.Speak("伸出左手")
genie.Play("GestureLeft") ' 伸出左手
Genie.Speak("伸出右手")
genie.Play("GestureRight") ' 伸出右手
Genie.Speak("叹气")
genie.Play("Sad") '嘆气
Genie.Speak("惊奇")
genie.Play("Surprised") '惊奇
Genie.Speak("握掌")
genie.Play("Pleased") '握掌
Genie.Speak("喇叭")
genie.Play("Announce") '喇叭
Genie.Speak("眯眼")
genie.Play("Blink") '瞇眼
Genie.Speak("无奈")
genie.Play("Decline") '无奈
Genie.Speak("抓头")
genie.Play("Confused") '抓头
Genie.Speak("鼓掌")
genie.Play("Congratulate") '奖盃
Genie.Speak("回手")
genie.Play("Wave") '挥手
Genie.Speak("惊讶")
genie.Play("Alert") '惊讶
Genie.Speak("魔术棒1")
genie.Play("DoMagic1") '魔术棒-1
Genie.Speak("魔术棒2")
genie.Play("DoMagic2") '魔术棒-2
Genie.Speak("摊手")
genie.Play("Explain") '摊手
Genie.Speak("敲门")
genie.Play("GetAttention") '敲门
genie.Play("GetAttentionContinued") '敲门-敲
genie.Play("GetAttentionReturn") '敲门-放下
genie.Play("Greet") '弯腰
genie.Play("Idle2_1") '观察魔术棒
genie.Play("Idle2_2") '两手在腹前交叉
genie.Play("Idle3_1") '打呵欠
Genie.Speak("向上看")
genie.Play("LookUp") '上看
genie.Play("LookDown") '下看
genie.Play("LookLeft") '左看
genie.Play("LookRight") '右看
genie.Play("MoveUp") '上移
genie.Play("MoveDown") '下移
genie.Play("MoveLeft") '左移
genie.Play("MoveRight") '右移
genie.Play("Process") '魔法调配
genie.Play("Read") '阅读
Do '此处存疑,高手请看最后
WScript.Sleep 1000
Loop Until ScriptComplete
Function GetTimeOfDay()
Dim TimeOfDay
Dim h
h = Hour(Now())
If h < 12 Then
TimeOfDay = "Morning"
ElseIf h < 17 Then
TimeOfDay = "Afternoon"
Else
TimeOfDay = "Evening"
End If
GetTimeOfDay = TimeOfDay
End Function
Sub agent_dblclick(ByVal CharacterID, ByVal Button, ByVal Shift, ByVal X, ByVal
Y)
Genie.StopAll
MsgBox "白白,再见了!"
WScript.Quit
End Sub
本来代码写的就没有什么难度,可是写完之后,每次可爱的小人总是一闪而过,屏幕上什么也看不见,在网络上查找也找不出原因,我实验了好多次,终于发觉了加红的那段代码必不可少,程序异步执行,没有最后的代码,程序没有执行完就退出了
Vbs脚本编程简明教程补充读物初窥WMI转载
今天我沼泽将给大家介绍个朋友它就是Microsoft Windows Management Instrumentation
(WMI)。中文名字叫Windows管理规范。从Windows 2000开始WMIWindows
管理规范就内置于操作系统中并且成为了Windows系统管理的重要组成部分。所以大家很容易就能见到它的因为我们至少也应该是个Windows
2000的使用者了。下面我将详细介绍它的每个细节让你从不认识它到喜欢上它。
WMI能做什么
WMI不仅可以获取想要的计算机数据而且还可以用于远程控制。远程控制计算机可是大家都喜欢的东西。很多远程监视控制类软件通常的做法是在远程计算机上运行服务端后台程序在本地计算机上运行一个客户器端控制程序通过这二个程序的勾结来实现对计算机的远程控制。这种作法的缺点是十分明显的当服务端程序关了这种远程监控就无法实现了因为没有内线了。而WMI实现的远程监视和控制完全不需要另外装什么服务端的东西系统默认就将WMI服务给开了。具体说来WMI的本领如下
1获取本地和远程计算机的硬件软件信息。
2监视本地和远程计算机的软件和服务等运行状况。
3控制本地和远程计算机的软件和服务运行。
4高级应用。
如何访问WMI
当我们知道WMI的某些本领后我们已经很想知道如何认识他并利用他了。利用WMI有许多途径简单说来有三种了
1通过微软给我们提供的各种工具来实现普通查询和操作。主要包括命令提示符下面的WMIC还有就是微软给我们提供的WMI
TOOL大家可以到微软的网站上免费下载当然我也可以给大家免费提供。
2通过自己编写脚本来实现更灵活操作。要想真正灵活实用对WSH脚本的熟悉是必须的当然如果你不熟悉也没有关系稍后我会给大家详细解释的。
3. 通过编写我们自己的程序来访问并操作它。什么语言都行。如果用.NET类程序要简单些了如果用VC等要复杂些了起码我是这么认为的。
4还有个访问它的方法就是到它的一个巢穴。在C:"WINDOWS"system32"wbem目录中的东西都和它有密切联系有日志和各种工具在里面你可以找到很多答案的。不过这些东西一般都不适合我们新手玩了感觉有点吓人。
我们今天的任务?
今天我们的任务有五个:
任务一利用WMIC列出远程计算机上的所有进程。
任务二利用WMIC关闭本地进程。
任务三通过WMIC把远程主机的进程信息保存在一个网页中
任务四:利用脚本实时监视对方进程
任务五:利用脚本给对方开放共享
查看和监视进程还要把进程给杀掉最后还要给对方开个共享我们这位朋友快把坏事做尽了。明白了我们的任务我们就可以上路了。这次我们将主要借助WMIC和脚本来实现我们的任务所以我们将主要分为两大部分来讲解。在五个任务的实战中我们将更加深入地理解它没有基础没有关系我将尽力去解释所有的所谓的基础让大家能很轻松地和这位朋友交流。
第一部分利用WMIC来认识WMI
WMIC是Windows Management Instrumentation
Commandline的简称WMIC扩展WMI提供了从命令行接口和批命令脚本执行系统管理的支持。为WMI名称空间提供了一个强大的、友好的命令行接口。有了WMICWMI就显的平易近人了。
执行“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会话的选项。
2Process是个别名执行了一个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这次我们是用交互式的方法来执行任务具体界面我就不多说了图上画的比我说的好多了。
2Call也是个动词这个动词可是厉害了控制类的没有不用它的它就是可以调用各种类的各种方法的大将。这里我们调用了terminate方法。从字面上你就可以看出是恶狠狠的。
3Where能够让你查询和筛选。在超级多的实例中找到你想要的。实例就是指每个类的具体实现了。前面的例子中看到的各个进程都分别算是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地址strUserstrPwd当然就是用户名和密码了我们说过这个用户必须是具有管理员权限的才可以。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的万分之一都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学那么奇迹就会产生。
WMI轻松入门之一
一、基本概念
其实我给文章起这样的名字绝对没有轻视WMI的意思事实上就连微软也有“WMI非常难于学习而且更难于使用”的说法在近日的学习过程中更感觉到了WMI检索功能的强大之所以起个“轻松入门”的名字我只是有感于外国人写教程在思路上和国人不太一致西方式的幽默看起来困难无比再加上一上手就在类的基本结构上展开讨论吓跑了无数Vbs的爱好者想从国人常见的角度出发来说说怎么学习WMI而已。百度空间的长度限制太讨厌了一次发不完只好分割成三部分题目只能大致起了见谅。
一、什么是WMI微软有很多说法大家可以到脚本中心查阅我这样理解WMI是一个用于管理Windows系统资源的对象其内部应是一个树状的数据库数据库中包含了很多个分支每个分支被称作命名空间每个命名空间包含了很多个对托管资源的抽象定义这种定义叫做类。在很多计算机教材中喜欢把类比作建筑蓝图依据蓝图建造的楼宇叫做类的实例我更喜欢将类和其实例的关系比作表格类就是表格的字段定义而表中的数据就是一个个的类的实例也许我这样说会让很多朋友更加糊涂但是依此类推WMI中最终存在的是各种软硬件资源的抽象定义我们利用WMI就是要按图索骥通过类定义获得类实例检索出符合要求的属性调用其内置的方法实现我们的目标。相信很多朋友已经发现我将WMI等同于CIM库了我清楚他们不是一回事但我相信这样更容易理解。如图
二、WMI的基本结构
严格说来WMI由四部分组成
1、 公共信息模型对象管理器——CIMOM
2、 公共信息模型——CIM
3、 WMI提供程序
4、 WMI脚本对象库
其中其第1、2、3三个部分在使用中很少加以区别我们一般统称为CIM库。
所以我们可以认为WMI实际是由两部分组成CIM库和WMI脚本对象库。在具体使用过程中我们是通过WMI脚本对象库去访问CIM库管理托管的资源。也就是说在我们编写脚本的过程大致可以分为这么几步
1、 创建WMI对象脚本库的指针实例
2、 调用其实例的方法连接到CIM库并指明需要访问的资源的逻辑位置
3、 获得托管资源也就是类的实例的集合;
4、 枚举实例,完成工作。
这几个步骤在我们将来编写的代码中可以明确的反映出来。
三、常用的命名空间
命名空间是个很复杂的概念,相信在微软的网站上一定有很多的篇幅介绍这个概念,据我个人理解,命名空间是对类所处逻辑位置的一个约定。打个比方说:张家也有个孩子叫小强,李家也有个孩子小强。大家站在一起,你大声叫"小强",你说这到底是叫哪一个小强呢?张家,李家都是一个姓,一个人的姓实际上就是现实中的一种名字空间。好了,现在你大声叫“张小强”,我们就明确的知道你到底是叫哪一个小强了。这就好比在变量名前加上名字空间前缀。所以可以通俗的说,名字空间就是一个变量的姓氏。问题是这样我们还会碰到一个问题,世界上有很多姓张的,也有可能有很多的张小强,这怎么办呢?这时候我们可以这样说"张老三家的小强",张是一个名字空间,张老三又是张下面的二级名字空间.
张.老三的家.小强 = 110
张.三丰的家.小强= 119
也许说的更糊涂,但大致就这样吧,我本来也就不是说明这个的。
据微软称WMI的命名空间共有16个不过不用担心我们常用的只有两个
1、 root"cimv2 在这个命名空间里包括了绝大多数与计算机、操作系统相关联的类。
2、 root"default 管理注册表的类
在使用中,我们用一个字符串表示命名空间,就像文件路径一样。
四、常用的脚本对象库
WMI脚本对象库由24个对象组成在脚本中心有一副脚本库对象模型的图有兴趣的朋友可以参考一下作为入门我们一般只用到其中的四个对象其继承和层级关系如下
SwbemLocator教本库对象→SwbemServicesWMI服务对象→SwbemObjectSet类实例集合对象→SwbemObject类的实例
好了,现在让我们来举个例子,详细说明一下这四个对象在脚本中的应用方法:
例一:用来检索计算机上安装的光驱:
strComputer = "."
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer
Set colItems = objSWbemServices.ExecQuery("Select * from Win32_CDROMDrive")
For Each objItem in colItems
WScript.Echo "光盘驱动器的类型: " & objItem.Caption
WScript.Echo "盘符是: " & objItem.Id
Next
例二用来检索CPU型号
strComputer = "."
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer
Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Processor")
For Each objSWbemObject In objSWbemObjectSet
Wscript.echo "CPU的型号为" & objSWbemObject.name
Next
请注意这两个脚本虽然简单却代表了WMI脚本设计中最普遍的东西可以说是很典型的脚本。让我们来仔细观察一下这两个脚本讨论讨论一下脚本访问WMI的基本方法我们可以看到整个脚本的执行过程基本相同
①定义了SwbemLocator的实例SwbemServices、SwbemObjectSet、SwbemObject对象创建了SwbemLocator的实例②通过SwbemLocator的ConnectServer方法连接到WMI获得SwbemServices的实例集合③枚举集合中的每个实例④显示各实例的一些属性。
让我们来详细说明一下各行代码的详细含义并请仔细回想我们第二部分WMI基本结构中谈到的编写WMI脚本的基本步骤注意考虑到脚本的简易我们编写的脚本一般只在本地计算机进行检索我们只介绍涉及本地的这一部分涉及到访问远程计算机的部分我们就省略了其实随着计算机安全技术的发展仅凭WMI访问远程计算机的可行性是越来越小了
1、连接到指定的CIM命名空间
要用WMI对象编程必须首先创建WMI对象脚本库的实例连接到目标计算机的CIM命名空间。
方法一:
步骤一、建立SwbemLocator对象的实例。代码为
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
然后用SwbemLocator对象的ConnectServer方法SwbemLocator对象只有1个只读属性Security_和1个方法ConnectServer建立WMI服务的连接返回一个命名空间的连接SwbemServices对象代码为
Set objSWbemServices = objSWbemLocator.ConnectServer()
ConnectServer方法共有8个参数所有参数都是可选的其参数格式如下
ConnectServer([strComputName],[strNamespace],[strUser],[strPassword],[strLocale],[strAuthority],[iSecurityFlags],[objwbemNamedValueSet])
考虑到WMI的复杂性在使用中我们如果只是在本地计算机上进行检索和查询那么我们只需要设置第1、2个参数其它参数都可以省略如果想连接到远程计算机一般需要对前4个参数进行设置我们也只对此做个简单的介绍。
strServer——计算机名缺省为本机本机也可以用”.”
strNamespace——需要登录的CIM命名空间例如"root"CIMV2",缺省为"root"CIMV2"。
方法二用moniker名字法建立WMI服务的连接这也是微软推荐的连接方法
moniker名字法是利用GetObject函数直接建立WMI服务的连接它的要点就是通过编写一个moniker字符串作为GetObject函数的参数然后返回一个SwbemServices对象。
关于moniker字符串的完整格式如下
"winmgmts:[{SecuritySettings}!][""ComputerName]["Namespace][:ClassName][.KeyProperty='Value']"
"winmgmts:"是前缀,
表示为WMI服务必须使用第二部分用来验证权限和假冒级别的省略。第三部分为计算机名字""".""是计算机名字默认可省略其余同上第四部分CIM命名空间缺省的命名空间为"root"CIMV2",默认可省略。
第五部分为类名。第六部分为属性值。注意当该moniker字符串不包括最后2项时即为"winmgmts:[""ComputerName]["Namespace]"则GetObject(moniker字符串)返回的是一个命名空间的已验证的连接SwbemServices对象当不包括最后1项时返回的是一个CIM类SWbemObject对象当包括最后2项时返回的是一个类的单独实例SWbemObject对象
2.获得类的实例
我们有4种方法获得类的实例其中方法1和方法2是通过SwbemServices对象的InstancesOf方法和ExecQuery方法来获得某个类的多个实例组成的集合对象。方法3和方法4则是返回单独的类的实例即返回的是一个SWbemObject对象。
1InstancesOf方法获得类的实例集合
InstancesOf方法的语法参数格式如下
SwbemServices.InstancesOf(strClass)
strClass为类名例如"Win32_Service"
回顾例二就是用语句Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Processor
") 来获得"Win32 Processor "类的所有实例集合,然后我们可以用
For Each objSWbemObject In objSWbemObjectSet
……
Next
语句获得每一个类的实例SWbemObject对象然后就可以根据我们的需要进行相应的操作。
2ExecQuery方法获得类的实例集合
与InstancesOf方法不一样的是ExecQuery方法可以通过查询语句只返回匹配部分实例和属性。ExecQuery方法的语法参数格式如下
SwbemServices.ExecQuery(strQuery)
strQuery为WMI查询语言(WQL)构造的一个查询语句字符串。
例如:
Set objSWbemObjectSet = objSWbemServices.ExecQuery("select ProcessorId from
Win32_Processor where DeviceID='cpu0'")
3Get方法获得一个类的实例SWbemObject对象
此方法也就不必再用 For Each objSWbemObject In objSWbemObjectSet ……Next
语句从SWbemObjectSet对象中获得每一个类的实例SWbemObject对象Get方法的语法参数格式如下
SwbemServices.Get([strObjectPath][.KeyProperty='Value'])
strObjectPath是类的名字
KeyProperty是主键属性名
Value是指定的主键属性值
这里要注意的是如果要获得一个类的实例则strObjectPath.KeyProperty='Value'中的任何一项都不能省略,例如:
Set objSWbemServices = GetObject("winmgmts:")
Set objSWbemObject = objSWbemServices.Get("Win32_Processor.DeviceID='cpu0'")
Wscript.echo “CPU的型号为”" & objSWbemObject.ProcessorId
看,结果一样,脚本却简化了不少。
4直接用moniker名字法获得一个类的实例
在说明Moniker名字法的时候我们说过当包括最后2项时返回的是一个类的单独实例Set objSWbemObject =
GetObject("winmgmts:Win32_Processor.DeviceID='cpu0'")
Wscript.echo "首枚CPU序列号" & objSWbemObject.ProcessorId
是不是更加简单仅仅2条语句就获得了CPU的序列号。
3.读取类的实例属性,调用类的方法
实在是太多了你可以参照C:/WINDOWS/system32/wbem/cimwin32.mfl文件中对所有类的属性和方法的描述。也可以用下列代码查询虽然看起来有点困难不过看的多了也就明白了。strClass=inputbox("请输入你要查询的类")
strComputer = "."
strNameSpace = "root"cimv2"
Const wbemFlagUseAmendedQualifiers = &h20000
Set objWMIService = GetObject("winmgmts:""" & strComputer & """ & strNameSpace)
Set objClass = objWMIService.Get(strClass, wbemFlagUseAmendedQualifiers)
strMOF = objClass.GetObjectText_
WScript.Echo strMOF
WMI轻松入门之二
解析类定义
在上一篇文章中我们说过WMI中用类对托管资源进行抽象定义和和管理那么什么是类
类的定义相信在很多面向对象的计算机教材中都能找到我的理解是是包含了一组独立功能的模块这个模块由数据和功能组成其中数据叫做类的属性完成功能的部分叫做类的方法。我认为类的优点是类完全可以由张三进行设计李四可以拿来直接使用在使用的时候李四不需要知道类是如何设计、如何实现的只要知道这个类可以实现什么样的功能这个类包含有什么样的方法和属性就可以了。更加重要的是类还可以进行继承就像父亲亡故儿子继承了父亲所有的财产一样如果我们发现某个类A已经完成了我们需要的大部分功能我们再去重新设计一个新类来完成我们所有的功能未免费时费力根据类可以继承的特性我们只要声明一个类继承了类A然后按照需要添加需要的新的数据元素、扩展现有的功能模块相信工作会简单很多。我看到很多书里都在说代码重用我不是程序员不知道所谓的代码重用具体是如何实现的但是相信类应该在其中起了很重要的作用。
在微软的教程中,对类从功能和继承关系上进行了详细的说明,我不再赘述,仅仅做一个摘要:
任何资源如果要求WMI进行托管至少需要两个文件提供程序和托管对象格式 (MOF) 文件。提供程序是一个中间件,通过调用托管资源的本地 API 来响应 WMI 请求。
每一个WMI托管的硬件和软件资源均有一个类来定义反过来说一个CIM类就是一个WMI托管资源的模板而且资源的所有实例都使用这个模板。这些模板是由属性、方法和限定符组成的。这些属性、方法和限定符都定义在MOF文件中。方法和属性是我们经常遇到的那么什么是限定符呢限定符是关于类、属性或方法类型的附加修饰符类是静态的、抽象的、还是关联的属性是只读的还是可写的方法的返回参数等都定义在其中那么我们如何知道某个类有那些限定符呢如下代码可以帮助我们方便的获得类的属性、方法和限定符的信息。
Code
strComputer = "."
strNameSpace = "root"cimv2"
strClass=inputbox("请输入你要查询的类")
Set objClass = GetObject("winmgmts:""" & strComputer & _
""" & strNameSpace & ":" & strClass)
WScript.Echo strClass & " 的类限定信息如下:"
WScript.Echo "------------------------------"
i = 1
For Each objClassQualifier In objClass.Qualifiers_
If VarType(objClassQualifier.Value) = (vbVariant + vbArray) Then '常数 VBVariant 只与 VBArray 一起返回以表明VarType 函数的参数是一个 Variant 类型的数组。
strQualifier = i & ". " & objClassQualifier.Name & " = " & _
Join(objClassQualifier.Value, ",")
Else
strQualifier = i & ". " & objClassQualifier.Name & " = " & _
objClassQualifier.Value
End If
WScript.Echo strQualifier
strQualifier = ""
i = i + 1
Next
WScript.Echo
WScript.Echo strClass & " 类的属性和属性限定信息"
WScript.Echo "-------------------------------------------------"
i = 1 : j = 1
For Each objClassProperty In objClass.Properties_
WScript.Echo i & ". " & objClassProperty.Name
For Each objPropertyQualifier In objClassProperty.Qualifiers_
If VarType(objPropertyQualifier.Value) = (vbVariant + vbArray) Then
strQualifier = i & "." & j & ". " & _
objPropertyQualifier.Name & " = " & _
Join(objPropertyQualifier.Value, ",")
Else
strQualifier = i & "." & j & ". " & _
objPropertyQualifier.Name & " = " & _
objPropertyQualifier.Value
End If
WScript.Echo strQualifier
strQualifier = ""
j = j + 1
Next
WScript.Echo
i = i + 1 : j = 1
Next
WScript.Echo
WScript.Echo strClass & " 类的方法和方法限定信息"
WScript.Echo "-------------------------------------------------"
i = 1 : j = 1
For Each objClassMethod In objClass.Methods_
WScript.Echo i & ". " & objClassMethod.Name
For Each objMethodQualifier In objClassMethod.Qualifiers_
If VarType(objMethodQualifier.Value) = (vbVariant + vbArray) Then
strQualifier = i & "." & j & ". " & _
objMethodQualifier.Name & " = " & _
Join(objMethodQualifier.Value, ",")
Else
strQualifier = i & "." & j & ". " & _
objMethodQualifier.Name & " = " & _
objMethodQualifier.Value
End If
WScript.Echo strQualifier
strQualifier = ""
j = j + 1
Next
WScript.Echo
i = i + 1 : j = 1
Next
如果我们执行上述代码来查找win32_service类的限定符一般情况下可以得到如下信息
win32_service 的类限定信息如下:
------------------------------
1. dynamic = True
2. Locale = 1033
3. provider = CIMWin32
4. SupportsUpdate = True
5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7}
win32_service 类的属性和属性限定信息
------------------------------------------------------
1. AcceptPause
1.1. CIMTYPE = boolean
1.3. read = True
……
win32_service 类的方法和方法限定信息
-------------------------------------------------
1. StartService
1.1. MappingStrings = Win32API|Service Functions|StartService
1.2. Override = StartService
1.3. ValueMap = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,..
……
返回的信息很多,我省略了其中的绝大部分,只保留了一部分典型的来说明我们应该如何读懂类的限定信息。
返回信息的第一部分表明了对于此类的限定信息:
1. dynamic = True Abstract——抽象类Dynamic——动态类Association——关联类表明win32_service类是动态类。
2. Locale = 1033 代表着区域设置或者叫本地化编码,是一组与用户的语言、国家/地区以及文化传统有关的用户首选信息,确定诸如:键盘布局、字母的排序顺序,以及日期、时间、数字、货币等的格式,一般不用管它。
3. provider = CIMWin32 Provider代表的是类的提供程序说明win32_service类是由CimWin32.dll提供的。
4. SupportsUpdate = True 指出类是否支持实例的修改。
5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7} 代表本地计算机上的全球通用唯一的标识符,我不知道有什么用处。
返回信息的第二部分代表了类的属性限定符
1. AcceptPause
这第一行表明检索到的类的属性名是AcceptPause
1.1. CIMTYPE = boolean CIMType代表属性的数据类型说明这个属性是布尔型。
1.3. read = True read代表属性可读而Write则代表属性的值是否可以修改如果属性没有定义Write限定符代表什么意思呢它代表从该类获得的实例的那个属性是不可以改写的也就是说不能给这个属性赋值。这其实解决了一个困惑我很久的一个问题为什么我在对很多类的属性进行了赋值后用Put_方法对修改进行了提交可是事实上却什么也没有改变。此外还有Key限定符指出该属性是类的键用于识别在相同资源集合中的托管资源的唯一实例。
返回信息的第三部分代表了类的方法及方法的限定符。现在我们能用到的还不多就不介绍了有兴趣的朋友可以参照http://msdn2.microsoft.com/en-us/library/aa393650.aspx
需要说明的是,不是在每一个类定义或者属性、方法定义中,这所有的限定符都要出现的,可能只出现了其中的一部分。
当然我们也可以从system32"wbem"cimwin32.mof以及system32/wbem/cimwin32.mfl两个文件中读取整个托管资源的类定义和类描述以及对每个类的属性、方法和限定符的描述其中包含的信息很多也包含了更多的类限定符阅读起来有一定的难度。将上面的例子的代码和vbsedit中包含的Object Browser联合起来可以得到我们需要的绝大部分的信息。
WMI轻松入门之三——获得类的实例
2.获得类的实例
我们有4种方法获得类的实例其中方法1和方法2是通过SwbemServices对象的InstancesOf方法和ExecQuery方法来获得某个类的多个实例组成的集合对象。方法3和方法4则是返回单独的类的实例即返回的是一个SWbemObject对象。
1InstancesOf方法获得类的实例集合
InstancesOf方法的语法参数格式如下
SwbemServices.InstancesOf(strClass)
strClass为类名例如"Win32_Service"
回顾例二就是用语句Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Processor ") 来获得"Win32 Processor "类的所有实例集合,然后我们可以用
For Each objSWbemObject In objSWbemObjectSet
……
Next 作者:临汾市外事旅游局薛靖澜,转载请注明
语句获得每一个类的实例SWbemObject对象然后就可以根据我们的需要进行相应的操作。
2ExecQuery方法获得类的实例集合
与InstancesOf方法不一样的是ExecQuery方法可以通过查询语句只返回匹配部分实例和属性。ExecQuery方法的语法参数格式如下
SwbemServices.ExecQuery(strQuery)
strQuery为WMI查询语言(WQL)构造的一个查询语句字符串。
例如:作者:临汾市外事旅游局薛靖澜,转载请注明
Set objSWbemObjectSet = objSWbemServices.ExecQuery("select ProcessorId from Win32_Processor where DeviceID='cpu0'")
3Get方法获得一个类的实例SWbemObject对象
此方法也就不必再用 For Each objSWbemObject In objSWbemObjectSet ……Next 语句从SWbemObjectSet对象中获得每一个类的实例SWbemObject对象Get方法的语法参数格式如下
SwbemServices.Get([strObjectPath][.KeyProperty='Value'])
strObjectPath是类的名字
KeyProperty是主键属性名
Value是指定的主键属性值
这里要注意的是如果要获得一个类的实例则strObjectPath.KeyProperty='Value'中的任何一项都不能省略,例如:
Set objSWbemServices = GetObject("winmgmts:")
Set objSWbemObject = objSWbemServices.Get("Win32_Processor.DeviceID='cpu0'")
Wscript.echo “CPU的型号为”" & objSWbemObject.ProcessorId
看,结果一样,脚本却简化了不少。
4直接用moniker名字法获得一个类的实例
在说明Moniker名字法的时候我们说过当包括最后2项时返回的是一个类的单独实例Set objSWbemObject = GetObject("winmgmts:Win32_Processor.DeviceID='cpu0'")
Wscript.echo "首枚CPU序列号" & objSWbemObject.ProcessorId
是不是更加简单仅仅2条语句就获得了CPU的序列号。
3.读取类的实例属性,调用类的方法
实在是太多了你可以参照C:/WINDOWS/system32/wbem/cimwin32.mfl文件中对所有类的属性和方法的描述。也可以用下列代码查询虽然看起来有点困难不过看的多了也就明白了。作者临汾市外事旅游局薛靖澜转载请注明
strClass=inputbox("请输入你要查询的类")
strComputer = "."
strNameSpace = "root"cimv2"
Const wbemFlagUseAmendedQualifiers = &h20000
Set objWMIService = GetObject("winmgmts:""" & strComputer & """ & strNameSpace)
Set objClass = objWMIService.Get(strClass, wbemFlagUseAmendedQualifiers)
strMOF = objClass.GetObjectText_
WScript.Echo strMOF
WMI轻松入门之四——解析类定义
在上一篇文章中我们说过WMI中用类对托管资源进行抽象定义和和管理那么什么是类
  类的定义相信在很多面向对象的计算机教材中都能找到我的理解是是包含了一组独立功能的模块这个模块由数据和功能组成其中数据叫做类的属性完成功能的部分叫做类的方法。我认为类的优点是类完全可以由张三进行设计李四可以拿来直接使用在使用的时候李四不需要知道类是如何设计、如何实现的只要知道这个类可以实现什么样的功能这个类包含有什么样的方法和属性就可以了。更加重要的是类还可以进行继承就像父亲亡故儿子继承了父亲所有的财产一样如果我们发现某个类A已经完成了我们需要的大部分功能我们再去重新设计一个新类来完成我们所有的功能未免费时费力根据类可以继承的特性我们只要声明一个类继承了类A然后按照需要添加需要的新的数据元素、扩展现有的功能模块相信工作会简单很多。我看到很多书里都在说代码重用我不是程序员不知道所谓的代码重用具体是如何实现的但是相信类应该在其中起了很重要的作用。
  在微软的教程中,对类从功能和继承关系上进行了详细的说明,我不再赘述,仅仅做一个摘要:
  
  任何资源如果要求WMI进行托管至少需要两个文件提供程序和托管对象格式 (MOF) 文件。提供程序是一个中间件,通过调用托管资源的本地 API 来响应 WMI 请求。
  每一个WMI托管的硬件和软件资源均有一个类来定义反过来说一个CIM类就是一个WMI托管资源的模板而且资源的所有实例都使用这个模板。这些模板是由属性、方法和限定符组成的。这些属性、方法和限定符都定义在MOF文件中。方法和属性是我们经常遇到的那么什么是限定符呢限定符是关于类、属性或方法类型的附加修饰符类是静态的、抽象的、还是关联的属性是只读的还是可写的方法的返回参数等都定义在其中那么我们如何知道某个类有那些限定符呢如下代码可以帮助我们方便的获得类的属性、方法和限定符的信息。
Code
strComputer = "."
strNameSpace = "root"cimv2"
strClass=inputbox("请输入你要查询的类")
Set objClass = GetObject("winmgmts:""" & strComputer & _
""" & strNameSpace & ":" & strClass)
WScript.Echo strClass & " 的类限定信息如下:"
WScript.Echo "------------------------------"
i = 1
For Each objClassQualifier In objClass.Qualifiers_
If VarType(objClassQualifier.Value) = (vbVariant + vbArray) Then '常数 VBVariant 只与 VBArray 一起返回,以表明 VarType 函数的参数是一个 Variant 类型的数组。
strQualifier = i & ". " & objClassQualifier.Name & " = " & _
Join(objClassQualifier.Value, ",")
Else
strQualifier = i & ". " & objClassQualifier.Name & " = " & _
objClassQualifier.Value
End If
WScript.Echo strQualifier
strQualifier = ""
i = i + 1
Next
WScript.Echo
WScript.Echo strClass & " 类的属性和属性限定信息"
WScript.Echo "-------------------------------------------------"
i = 1 : j = 1
For Each objClassProperty In objClass.Properties_
WScript.Echo i & ". " & objClassProperty.Name
For Each objPropertyQualifier In objClassProperty.Qualifiers_
If VarType(objPropertyQualifier.Value) = (vbVariant + vbArray) Then
strQualifier = i & "." & j & ". " & _
objPropertyQualifier.Name & " = " & _
Join(objPropertyQualifier.Value, ",")
Else
strQualifier = i & "." & j & ". " & _
objPropertyQualifier.Name & " = " & _
objPropertyQualifier.Value
End If
WScript.Echo strQualifier
strQualifier = ""
j = j + 1
Next
WScript.Echo
i = i + 1 : j = 1
Next
WScript.Echo
WScript.Echo strClass & " 类的方法和方法限定信息"
WScript.Echo "-------------------------------------------------"
i = 1 : j = 1
For Each objClassMethod In objClass.Methods_
WScript.Echo i & ". " & objClassMethod.Name
For Each objMethodQualifier In objClassMethod.Qualifiers_
If VarType(objMethodQualifier.Value) = (vbVariant + vbArray) Then
strQualifier = i & "." & j & ". " & _
objMethodQualifier.Name & " = " & _
Join(objMethodQualifier.Value, ",")
Else
strQualifier = i & "." & j & ". " & _
objMethodQualifier.Name & " = " & _
objMethodQualifier.Value
End If
WScript.Echo strQualifier
strQualifier = ""
j = j + 1
Next
WScript.Echo
i = i + 1 : j = 1
Next
如果我们执行上述代码来查找win32_service类的限定符一般情况下可以得到如下信息
win32_service 的类限定信息如下:
------------------------------
1. dynamic = True
2. Locale = 1033
3. provider = CIMWin32
4. SupportsUpdate = True
5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7}
win32_service 类的属性和属性限定信息
------------------------------------------------------
1. AcceptPause
1.1. CIMTYPE = boolean
1.3. read = True
……
win32_service 类的方法和方法限定信息
-------------------------------------------------
1. StartService
1.1. MappingStrings = Win32API|Service Functions|StartService
1.2. Override = StartService
1.3. ValueMap = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,..
……
  返回的信息很多,我省略了其中的绝大部分,只保留了一部分典型的来说明我们应该如何读懂类的限定信息。
  返回信息的第一部分表明了对于此类的限定信息:
  1. dynamic = True Abstract——抽象类Dynamic——动态类Association——关联类表明win32_service类是动态类。
  2. Locale = 1033 代表着区域设置或者叫本地化编码,是一组与用户的语言、国家/地区以及文化传统有关的用户首选信息,确定诸如:键盘布局、字母的排序顺序,以及日期、时间、数字、货币等的格式,一般不用管它。
  3. provider = CIMWin32 Provider代表的是类的提供程序说明win32_service类是由CimWin32.dll提供的。
  4. SupportsUpdate = True 指出类是否支持实例的修改。
  5. UUID = {8502C4D9-5FBB-11D2-AAC1-006008C78BC7} 代表本地计算机上的全球通用唯一的标识符,我不知道有什么用处。
  
  返回信息的第二部分代表了类的属性限定符
  1. AcceptPause
  这第一行表明检索到的类的属性名是AcceptPause
  1.1. CIMTYPE = boolean CIMType代表属性的数据类型说明这个属性是布尔型。
  1.3. read = True read代表属性可读而Write则代表属性的值是否可以修改如果属性没有定义Write限定符代表什么意思呢它代表从该类获得的实例的那个属性是不可以改写的也就是说不能给这个属性赋值。这其实解决了一个困惑我很久的一个问题为什么我在对很多类的属性进行了赋值后用Put_方法对修改进行了提交可是事实上却什么也没有改变。此外还有Key限定符指出该属性是类的键用于识别在相同资源集合中的托管资源的唯一实例。
  
  返回信息的第三部分代表了类的方法及方法的限定符。现在我们能用到的还不多就不介绍了有兴趣的朋友可以参照http://msdn2.microsoft.com/en-us/library/aa393650.aspx
  需要说明的是,不是在每一个类定义或者属性、方法定义中,这所有的限定符都要出现的,可能只出现了其中的一部分。
  当然我们也可以从system32"wbem"cimwin32.mof以及system32/wbem/cimwin32.mfl两个文件中读取整个托管资源的类定义和类描述以及对每个类的属性、方法和限定符的描述其中包含的信息很多也包含了更多的类限定符阅读起来有一定的难度。将上面的例子的代码和vbsedit中包含的Object Browser联合起来可以得到我们需要的绝大部分的信息。
简单WSC组件的基本结构
WSC是微软公司提供的使用脚本语言来创建 COM 部件的便利途径,它可以应用于支持 COM 部件的应用程序。WSC采用XML语言编写。一个标准的WSC组件本身涉及到XML标记相当复杂但幸好它的结构非常规范了解结构填入代码一个WSC脚本部件就可以工作了。
就我个人而言把WSC部件分成三个部分注册部分定义属性、方法、事件部分和实现部分。
1、注册部分
主要包含了向注册表注册部件时需要填写的信息。一般包含了部件描述、版本信息、progid、clsid等四个内容。基本格式如下
<registration
description="部件描述的信息"
version="部件的版本号"
progid="XXXX.XXX" /程序ID
clsid="xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx"/>
需要说明的是:
①registration是XML标记。
②progid是VBS通过CreateObject函数通过绑定组件创建实例时的标志一个组件如果没有ProgId几乎是无法使用的。例如
Set obj=CreateObject("scripting.filesystemobject")
代码中的scripting.filesystemobjec就是ProgId。
③Clsid是部件在注册表项中的唯一标志系统注册时把有关部件的信息放在注册表中应用时通过读取注册信息应用程序可以找到并载入该部件。可以使用Uuidgen.exe 的程序随机生成。当然如果你不指定Clsid系统注册时regsvr32会为它自动创建一个但正常情况下应该指定一个。由于我的计算机上没有安装VC所以Uuidgen.exe和GUIDGen.exe文件Clsid从一直是我极为头疼的问题幸好UMU给出了一个脚本产生现把代码抄录如下
Dim objSLTL
Set objSLTL = CreateObject( "Scriptlet.TypeLib" )
Wscript.echo objSLTL.GUID
Set objSLTL = Nothing
2、定义属性、方法、事件部分
在这个部分定义了用户在脚本中可以使用的属性、方法、事件,其基本结构如下:
<Public>
<property name="属性一" >
<get/>
<Put/>
</property>
<method name="方法一">
<parameter name="参数一"/>
</method>
<event name="事件一">
<parameter name="参数一"/>
</event>
</Public>
其中Public是XML的标记property、method、event标记分别定义了部件属性、方法、事件。Name标记定义了其名称Parameter标记定义了其参数。作为property标记来说本身带有两个子标记它们分别是<get/><put/>它们两个分别定义了读写属性的方式。当需要读写属性的时候就会自动执行它们中的一个。在实现部分中它们会以Put_属性名 或者 Get_属性名的形式出现。如果忽略了<get/>标记,则此属性是只可写的,忽略了<Put/>标记说明此属性是只读的。作为vbs脚本在脚本中响应事件的机会是比较少的对此也就不再详细的说明。
3、实现部分
在上一部分定义的所有的属性、方法、事件的实现函数都必须包含在<Script>标记中。结构如下:
<script language="VBScript">
<![CDATA[
定义公用变量
进行初始化
Function 函数名称()
函数实现
End funciton
]]>
</script>
抛开XML的标记不管我们只需要有关的部分进行修改就可以了。在Public部分定义的属性和方法在本部分必须定义相应的变量和函数。
当然WSC作为一个XML格式的文件一些基本的标记还是需要知道的下面有关标记说明摘自微软。
<component>和<package>元素:<component> 元素包含的是一个完整的脚本部件定义。在同一个 .wsc 文件中可以出现多个 <component> 元素,但这些元素应包含在一个 <package> 元素内。
<registration>元素:包括用来将脚本部件注册为 COM 部件的信息。
<public>元素:包含脚本部件所说明的属性、方法和事件的定义。这些定义指向定义在独立的 <script> 块中的变量或函数。
<implements>元素:给脚本部件指定COM接口处理程序这将确定该脚本部件属于哪种COM部件类型。例如通过指定 <implements type=ASP>,就可以实现 ASP 接口处理程序并因此在脚本部件中可以访问ASP对象模型。
<public>元素:指定了脚本部件将实现 COM Automation 接口处理程序。因此,对 Automation 处理程序无需创建<implements>元素。
<script>元素:包含用来实现脚本部件逻辑的脚本这取决于所创建的COM部件类型。例如如果要创建的是 COM Automation 部件,则可以在
<public> 元素中声明属性、方法和事件,然后用一个或多个 <script> 元素编写脚本来定义这些内容。
<object>元素:包含脚本中所使用的某个对象的信息,如另一个 COM 部件的信息。
<resource>元素:包含不应被硬编码到脚本部件代码中的值。资源元素可能包括在各个版本间可能更改的信息,可能需要翻译的字符串以及其他值。
<reference>元素:引用在脚本中需要使用的类型库。
<comment>元素:包含在分析和执行该脚本部件时将被忽略的文字,说明或者注释。
了解了这些知识,让我们来看一个最最简单的例子:
<?XML version="1.0"?>
<package>
<component id="test">
<registration
progid="ID"
description="description"
version="1"
clsid="{A66E243C-CF13-42AC-BE67-558F2FA82B39}"/>
<public>
<property name="du"/>
<get/>
<method name="xie"/>
</public>
<script language="VBScript">
<![CDATA[
dim du
function get_du()
du=get_du
End function
Function xie()
msgbox du
End Function
]]>
</script>
</component>
</package>
用代码调用
Set test=CreateObject("ID")
test.du=5
test.xie
显示正常
使用脚本部件向导简化WSC设计
尽管XML语言被设计成为一种相对精简的标记语言符合XML格式的WSC部件也设计的极为规范但就我而言在具体的设计过程中出错最多的仍然在XML的各种标记上幸好微软推出了专门生成WSC部件代码的工具Windows Script Component Wizard这个工具可以迅速的为我们搭建好WSC部件的框架极大的方便了我们对WSC部件的编写此向导除了在微软的网站上下载外在我的网盘上也有一份拷贝。
它的使用方法也极为简单就连诸如我之流E文程度极差者也能使用。
如上例,生成如下代码:
<?xml version="1.0"?>
<component>
<?component error="true" debug="false"?>
<registration
description="测试用的WSC部件"
progid="test.WSC"
version="1.00"
classid="{155642f0-fbad-4f98-90cb-b38b7a3cf428}"
>
</registration>
<public>
<property name="start">
<get/>
</property>
<property name="end">
<get/>
<put/>
</property>
<method name="print">
<PARAMETER name="para1"/>
<PARAMETER name="para2"/>
</method>
<method name="list">
<PARAMETER name="para3"/>
</method>
</public>
<implements type="Behavior" id="Behavior"/>
<script language="VBScript">
<![CDATA[
dim start
dim end
function get_start()
get_start = start
end function
function get_end()
get_end = end
end function
function put_end(newValue)
end = newValue
end function
function print(para1,para2)
print = "Temporary Value"
end function
function list(para3)
list = "Temporary Value"
end function
]]>
</script>
</component>
呵呵该有的东西全有了属性对应的变量也定以来我们只要对其中实现部分稍加修改就可以注册应用了需要注意的是如果在WSC编码设计中出现汉字则必须在第一行添加encoding="gb2312"标记,既第一行为:
<?xml version="1.0" encoding="gb2312" ?>
才能正常通过注册。