WMI 是一种很好的脚本编写技术,但是也有其自身的特性。例如,能否使用脚本创建一个过程呢?当然能;毕竟,WMI 的 Win32_Process 类具有 Create 方法。能否使用脚本创建一个服务?当然能;毕竟,WMI 的 Win32_Service 类具有 Create 方法。能否使用脚本来创建环境变量?当然能,尽管实际上 Win32_Environment 类不具有 Create 方法,但也能够创建环境变量。是很奇怪,但的确是真的!

实际上,此处有一个脚本,此脚本创建一个新的名为 TestValue 的环境变量:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set objVariable = objWMIService.Get("Win32_Environment").SpawnInstance_

objVariable.Name = "TestValue"
objVariable.UserName = "System"
objVariable.VariableValue = "This is a test"
objVariable.Put_

我们知道:这看起来与大多数 WMI 脚本都不一样。但是不要担心,我们将一步一步地分析该代码。

我们的环境变量脚本开始时同大多数的 WMI 脚本一样:首先都会连接到 WMI 服务。连接到 WMI 服务之后,您通常会调用 ExecQuery 来返回各个项的集合。不过,在此脚本中,我们不打算这样做。我们使用“SpawnInstance_”方法创建一个“空白”环境变量,该环境变量只存在于内存中。(我们使用“空白”这个词是因为 SpawnInstance_ 创建的环境变量具有环境变量所应具有的所有属性;但是在创建时,这些属性均没有被赋值。因此是一个“空白”实例。)

以下这行代码创建了一个对象引用 (objVariable),该对象引用指向新的环境变量(创建时也只存在于内存中):

Set objVariable = objWMIService.Get("Win32_Environment").SpawnInstance_

不,这里并没有印刷错误:该名称的确是“SpawnInstance_”,在末尾处带有下划线。在本专栏文章中,您将看到许多下划线。

我们现在需要执行的操作就是填充环境变量的属性。具体地说,我们需要指定三个值:

Name。这仅仅指环境变量的名称。在此示例脚本中,我们使用了一个巧妙的名称,“TestValue”。

UserName。这是指环境变量的所有者。若要使其成为一个系统变量,请将 UserName 设置为“System”;若要使其成为一个特定于用户的环境变量,请将 UserName 设置为用户帐户名(例如“fabrikam\kenmyer”)。

VariableValue。赋予环境变量的值。我们再一次为自己的聪明才智着迷,将值“This is a test”(这是一个测试)赋予 TestValue。

是的,这就是脚本专家能挣大钱的原因。

分配完这三个属性值之后,我们将调用“Put_”方法,此方法实际上将编写操作系统的新的环境变量。任务完成了。

您说“您确定吗”是什么意思?如果您不相信我们,一个快速验证创建的方法就是使用一个类似于以下脚本的脚本。此脚本使用了一个 WQL 查询来选择名为“TestValue”的所有环境变量,然后将该变量的属性值回显到屏幕:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_Environment Where Name = 'TestValue'")

For Each objItem in colItems
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "User Name: " & objItem.UserName
    Wscript.Echo "Variable Value: " & objItem.VariableValue
    Wscript.Echo
Next

当然,如果您从没有使用过标记为新的、进行了自定义的环境变量,您又怎么能享受拥有它的乐趣呢?如果您想更改新的环境变量的值,只需连接到该变量(使用我们刚才展示给您的 WQL 查询)并将新值赋予“VariableValue”属性即可。调用“Put_”方法编写对操作系统的更改,您的环境变量将采用新值。例如,此示例脚本将 TestValue 的值更改为 New value

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_Environment Where Name = 'TestValue'")

For Each objItem in colItems
    objItem.VariableValue = "New value"
    objItem.Put_
Next

易如反掌!

但是,如果您想删除环境变量该怎么办呢?(是的,甚至是您在完成了所有创建环境变量的工作之后也可以进行删除。)这非常简单:我们只需采用在修改环境变量的值时使用的基本方法即可。不过,我们这次不将新值赋予 VariableValue 属性,而只是调用“Delete_”方法删除该变量:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_Environment Where Name = 'TestValue'")

For Each objItem in colItems
    objItem.Delete_
Next

请再次注意该方法名称末尾的下划线:Delete_

当然,还有一个未答复的问题:如何辨别 Win32_Environment 类是否支持 SpawnInstance_ 和 Delete_ 方法呢?在此例中,我们使用 Wbemtest.exe. Call up Wbemtest 并查看 Win32_Environment 类:

Wbemtest


看一看屏幕的顶部(在“Qualifiers”标题下),您将会看到“CreateBy”和“DeleteBy”限定符,后面是用于创建新实例的方法 (PutInstance) 和删除现有实例的方法 (DeleteInstance)。我们就是这样辨别 Win32_Environment 是否支持 SpawnInstance_ 和 Delete_ 的。

posted on 2010-07-30 14:15  yangjie  阅读(668)  评论(0编辑  收藏  举报