男生五分钟入门wmi
作者:lcx
最近看vbs的wmi,发现有许多概念不太好理解。如果完全照教程的讲义去理解研究的话,入门的时间会很长。wmi在VBS里来讲,也算是面向对象的编程了。它的许多概念与别的面向对象的编程语言是相通的。我在这里对男生讲解一下我的理解,相信看完了,你立马就理解了。
第一,什么是命名空间。有部份教程也把当叫作域的。其实命名空间很简单,用一个世界来举例,那么日本、中国、法国这些名字就是命名空间,你把它当作地域就好理解了。
第二,什么是类。从第一继承下来,如果命名空间里有日本的话,那日本人就是一个类了。当然,中国也是一个命名空间,那么中国人也是一个类。
第三,什么是类的实例。日本人是一个类,那么日本女优、日本男优就是类的实例了,或者是类的实例集合。日本女优里的高树玛利亚、或者松岛枫就是单独一个类的实例。
第四,类的实例(也可以说类)的方法和属性。像日本女优都有的属性:她们是女的、都有名字等等。那么日本女优的方法有:KouJ、RuJ、ChaoP等。
WMI的脚本程序流程类似就是在不同的命名空间建立不同的类对象,然后根据类对象再建立类实例集合对 象,最后在类实例集合对象里例举每个实例的方法属性。好比在日本这个命名空间里建立一个的日本人这个类对象,然后根据日本人这个类对象再建立日本女优的类 实例集合对象,最后在这个类集合对象里去查找每个日本女优,看下日本女优的名字、相貌,和做爱的方法等等。
可能有人对我的表达方法有疑义。我再补充一下,命名空间和类这些东东都是抽象的定义,我把它们实例化了。你也可以单独把日本女优做为一个命名空间,那么拍SM的做为一个类,都是可以的。
举一个最简单的例子吧:
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\CIMV2”)
‘建立一个类对象objWMIService,代表日本人 。这个对象是如何建立的呢?就是连接到世界里的日本命名空间。strComputer代表世界,就是你的机器了。root\CIMV2就是命名空间,相当于日本。winmgmts:\\是固定的,要求这么写。
Set colItems = objWMIService.ExecQuery( _
“SELECT * FROM CIM_DataFile”,,48)
‘再建立一个类实例集合对象colItems, 代表日本女优的集合。这个对象就是再在日本人这个类对象(objWMIService)里找日本女优(CIM_DataFile)的集合.。当然如果你查 询语句详细一点或者不用ExecQuery用get,可以直接找到高树玛利亚。就是单独一个类实例了。
For Each objItem in colItems
Wscript.Echo “———————————–”
Wscript.Echo “CIM_DataFile instance”
Wscript.Echo “———————————–”
Wscript.Echo “Caption: ” & objItem.Caption
Next
‘
这个循环就是在类实例集合对象colItems(代表日本女优的集合对象)里例举日本女优的名字、相貌等等。
上一篇主要是讲解了列出类实例的属性。当然类有方法的,日本女优不但有名字,而且她们还有方法。像变换体位,如何从一种体位转成另一种体位呢?好比如何把一个文件改名字,在wmi里也有很多种方法。按第一篇的方法来讲:
strComputer = “.”
Set objWMIService = GetObject _
(“winmgmts:” & “!\\” & strComputer & “\root\cimv2”)
‘建立一个类对象objWMIService ,就是从wmi定义的世界(strComputer)找到日本的命名空间root\cimv2
Set colFiles = objWMIService.ExecQuery _
(“Select * from Cim_Datafile where Name = ” _
& “‘c:\\1.csv'”)
‘建立一个类实例集合对像colFiles,找到属于日本女优的类Cim_Datafile。注意了这是一个单独的类实例,集合里只有一个女优是高树玛利亚(c:\\1.csv)
For Each objFile in colFiles
errResult = objFile.copy(“c:\2.htm”)
Wscript.Echo errResult
Next
‘然后高树玛利亚objFile 有方法,可以变换体位,她可以用copy大法,于是成功变成了2.htm。
============================
上边都是根据我的定义理解来写代码流程的,再来正统一点的写法吧,微软给的工具示例如下:
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\CIMV2”)
‘ 边接到指定的命名空间,得到类对象
Set objShare = objWMIService.Get(“CIM_DataFile.Name=’c:\1.csv'”)
‘得到类实例,想到第一节我讲的get吗?这里是获得单独的类实例
Set objInParam = objShare.Methods_(“Copy”). _
inParameters.SpawnInstance_()
‘Copy方法本身也是对象,实例化输入参数对象,这些语句是固定的,只不过copy之类要换
objInParam.Properties_.Item(“FileName”) = “c:\2.htm”
‘设置要copy的对象参数
Set objOutParams = objWMIService.ExecMethod(“CIM_DataFile.Name=’c:\1.csv'”, “Copy”, objInParam)
‘执行方法’
Wscript.Echo “Out Parameters: ”
Wscript.echo “ReturnValue: ” & objOutParams.ReturnValue
‘得到反回值
==================================================================
这些代码是不是很头大呀,不过如果理解了,你就可以简写了,我简写形式如下:
strComputer = “.”
Set objWMIService = GetObject(“winmgmts:\\” & strComputer & “\root\CIMV2”)
Set objShare = objWMIService.Get(“CIM_DataFile.Name=’c:\1.csv'”)
objOutParams = objShare.copy(“c:\2.htm”)
================================
在以上的连接中,我都是用的winmgmts方法来连接,如果要连到别的机器,以上连接字符串就不行了。
方法如下:
Set objSWbemLocator = CreateObject(“WbemScripting.SWbemLocator”)
‘ip如果是点的话代表本机,\root\CIMV2是命名空间,如果本机的话用户名和密码为空就可以了。
Set objWMIService =objSWbemLocator.ConnectServer(“ip”, “\root\CIMV2”, “用户名”, “密码”)
Set objShare = objWMIService.Get(“CIM_DataFile.Name=’c:\1.csv'”)
objOutParams = objShare.copy(“c:\2.htm”)