2024年6月8日发(作者:)

维普资讯

脚本开发 

熟悉V B S cri pt之六部曲 

内置函数及用户自定义函数 

作者/S博士译者/朱其胜 

上一期介绍了一些基本的VBScript语句,使用这些语句,我们已 

经可以进行一些管理工作。在这一期中,我们要利用前面所介绍的概 

念,写一个简单的应用。此外,我们还要介绍几个最基本的VBScript 

函数,以及自定义函数的方法。 

W i n d 0 W S管理架构一一W M l 

是Windows Management Instrumentation的缩写 

WMI是Windows 2000中内置的服务,通过WMI, 

专业开发人员可以使用各种开发上具,将企业网络管理 

(微软Windows2000中文帮助中将“Windows Management 

Instrumentation”译为“Windows管理规范”,国内也 

功能轻松整合入所开发的应用程序中,而不需要大费周 

折地去研究整个Windows ̄务的底层架构。提供服务的 

软件设计人员,也可以通过wMI将服务内容封装起 

来,让用户更容易对被管理对象进行管理作业。至于一 

有刊物译为“Windows管理设备”,但相比而言,我 

觉得译为“Windows管理架构”更贴切一些,更能体 

现出这一技术的特点。一一译者注),是一项相当有成 

力的技术。简单来说,WMI就是Windows平台的管理 

架构,它通过统一的标准的方式,让开发人员和管理人 

员能够很轻松地访问Windows的管理服务,进行企业内 

部管理。 

般没有程序开发经验的管理人员,要如何利用这一管理 

接口呢?当然就是通过VBScript,操作WMI对象进行 

网络管理哕! 

由于WMI是一种管理服务架构,是Windows组件对 

象模型的一个实际应用,因此我们可以利用VBScfipt的 

VBScri pt 

●ls 

维普资讯

脚本开发 

一 

圈2:利用MsgBOX函数显示信息 

圈1:取得当前计算机中所执行的服务名称 

脚本一开始我们使用了Option Explicit关键字,强 

迫VBSC riPt对程序中使用的变量进行检查,因为 

GetObject函数连接wMI服务,然后使用特定的服务名称 

访问各种不同的服务。例如,Win32一Service代表当前 

Windows环境中的各项服务,Win32Printer代表当前计 

VBScript允许用户可以不声明就使用变量。使用Option 

Explicit关键字后,如果用户使用的变量没有事先声明, 

程序就会报错而中止执行,这样做的目的是为了避免我 

算机所连接的所有打印机。那我们如何取得这些服务的 

们不小心拼错了变量的名称。接着我们声明了变量,然 

后通过GetObject函数连接到WMI服务,服务起点的名 

称为“WinMgmts:”。 

接下来,我们利用InstancesOf方法,取得Windows 

的服务集合,这个集合中包含了所有执行中的服务对 

进入点呢?通过WMI对象的InstancesOf方法,就可以取 

得对应服务的进入点。让我们来看下面这一段程序: 

’WMITest.VBS 

Option Explicit 

Dim wmiObject,wmiServices 

象。由于返回的结果是一个集合,所以我们要使用上一 

期提到的For…Each语句来从集合中依序取得各个服务对 

Set wmiObject=GetObject(”WinMgmts:”、 

象,将该对象的说明加入到字符串变量中,并使用 

显示所有的服务 

Set WmiServiCes=wmiObject.In stances0f 

(”Win32一Service”) 

intCount变量记录服务的个数,最后我们把服务的名称 

及个数显示出来。为了使显示出来的信息具有换行的效 

果,我们在程序中使用了VBScript内置常数“vbCrLf” 

来代表换行的字符符号。执行的结果如图1。 

由于本文的重点不是WMI,所以这里对WMI技术 

不做细节讨论。但我们可以从这个例子中看出,只要某 

Dim strServices,objService,intCount 

For Each objService In wmiServices 

strServices=strServices& 

objService.Description&”:” 

intCount=intCount+1 

Next 

个服务能通过对象的方式取得并操控,我们就可以很简 

单地建立一段VBScript,进行一些重复性高或是操作较 

复杂的工作,而所用的技巧都不会超出我们之前所介绍 

的知识范围。 

一 

strServices=strServices&vbCrLf&vbCrLf&

”总共”&intCount&”个服务执行中l 

WScript.Echo strServices 

● ●I● 

维普资讯

— 0 .一: 00 ll0■ 

赫 盎躐 

MsgBox按钮常奴 说啊 

vbYesNoCanceI 

vbYesNo 

vbRetryCancel 

显示是、否及取消按钮,用户可以按下取消按钮或是ESC按键取消对话框。 

显示是、否按钮,用户无法取消对话框。 

显示重试及取消按钮,用户可以按下取消按钮或是Esc按键取消对话框。 

MSgBOX函数 

在上面的例子中,我们是利用Windows Scripting 

Host的内建对象wSCript来显示执行的结果。由于 

VBScript本身就是在WSH的环境中执行,所以并不需要 

1中提供的是您可以使用的按钮常数及对应的说明。 

当您的函数中指定了一个以上的按钮时,您可能会 

希望安排好适当的默认按钮。以“确定”及“取消” 

两个按钮为例,大多数的时候,我们可能会期望用户都 

是按下“确定”,但是如果您要做的动作涉及到数据的 

变动或是销毁,可能就要让用户好好考虑了,因为一旦 

做了很可能是无法后悔的,所以将预设的按钮安排成 

“取消”是较保险的做法。那么要如何指定默认的按钮 

呢?表2列出了默认按钮的指定常数。 

在msgbox对话框中指定了两个以上的按钮后,当然 

希望知道用户最终按下了哪一个按钮。MsgBox会返回 

通过GetObject或CreateObject函数事先取得Wscript对 

象,该对象提供了Echo方法,让我们向用户显示信息。 

但ECHO方法的功能是相当有限的,用户唯一能做的响 

应就是按下“确定”键。事实上,在VBSCript中提 

供有一个对应的函数,即MsgBox,我们可以利用它来 

进行更有弹性的信息显示安排。我们把上面例子中的最 

后一个语句改成下面的形式: 

MsgBox strServices,vbOKOnly Or vblnformation,’’ 

用户按下的按钮值,您可以根据这个返回值判断用户的 

决定。表3是这些返回值常数的说明。假设我们要在用 

户响应“否”的时候中止程序的执行,我们可能会用 

如下的叙述: 

If MsgBox(strMessage,vbYesNo)=vbNo Then 

执行中的服务” 

执行后的画面如图2。我们会看到画面中多了一个图 

标,而且对话框的标题也是我们所指定的标题。使用 

MsgBox函数,除了可以显示信息之外,还可以指定图标、 

用户能操作的按钮以及对话框标题。它的语法如 : 

MsgBox(prompt,buttons,title,helpfile,context) 

WScript.Quit 

EndIf 

Prompt就是我们要显示的提示,而Buttons则是我 

们要提供的按钮。ButtonS这个参数很有意思,通过 

它,您可以同时指定对话框的图标、按钮以及默认的按 

钮。这三个不同的信息可以使用Or运算符结合在一起。 

至于对话框的图标,主要有四类,分别是:一般 

信息、一般警告、严重警告或提示及询问。一般信息 

像上面例子中的vbOKOnly代表的是只显示“确定”按 

钮,而后面的vblnformation则是指定图标的名称,也 

就是画面中有i的图案,代表是一个一般的信息。在表 

MsgBox返回值

vbOK 

说啊 

按下“确定”,或者是在只有确定 

按钮的情况下按下“Esc 取消对话 

框。 

vbCancel 

MsgBox覆设默认常奴 

vbDefaultButton 1 

按下“取消 或是在有取消按钮的 

对话框按下“E S C”取消对话框。 

说啊 

' 

第一个按钮是默认按钮 

第二个按钮是默认按钮 

第三个按钮是默认按钮 

vbYes 

vbNo 

按下

按下

“是”。 

“否”。 

vbDefauItButton2 

vbDefauItButton3 

vbDefauItButton4 第四个按钮是默认按钮 

赣 

维普资讯

。 -。 ’ 誊 ll鬈譬 ≯i 

图3:提供帮助说明的信息对话框 图4:InPutBox函数执行的结果 

主要是提供一般性的信息,目的在于告知用户所需要的 

信息。至于一般警告则是在提醒用户注意,显示的是惊 

叹号的图标。如果面对的是很重要的情况,甚至是严重 

的错误,则会利用禁止的图标来警示。若处置的措施要 

/msdn.microsoft.corn/library/default.asp?URL=/library/ 

tools/htmlhelp/chm/hh 1 start.htm)。 

lI'1PUtB0X函数 

MsgBox是用来向用户显示信息的,而InputBox则 

是用来取得用户的输入信息。这个函数的语法如下: 

InputBox(prompt,title,default,xpos,ypos,heipfile, 

context) 

根据用户的响应来决定,我们就会显示问号。表4列出 

了图标对应的常数。 

在MsgBox函数中,除了Prompt参数以外,其他 

的参数都是可选的。如果不指定Buttons参数,就只会 

显示一个“确定”按钮,不会有图标。如果不指定Title 

参数,就会以“VBScript”作为对话框的标题。至于 

Helpfile及Context两个参数则需要配合帮助文档来使 

用。如果希望通过帮助文件提供与对话框有关的信息给 

用户,您就可以利用Helpfile指定帮助文件的位置,并 

通过Context来指定要显示那一段说明文字。 

在使用Helpfile和Context这两个参数时,一旦指定 

了Helpfile,就一定要指定Context。反之亦然。当您 

指定了Helpfile参数的值时,信息对话框中会自动加上 

同样的,InputBox函数中除了Prompt参数是必需 

的外,其他都是可选的。Prompt是给用户看的提示信 

息,处理方式和MsgBox一样。Title、Helpfile及Context 

等参数的作用也和MsgBox中一样。至于Default则是输 

入对话框上文字框中的默认值,用户可以直接用您所提 

供的默认值作为输入值。例如下面的语句会出现如图4 

的对话框: 

str=InputBox(”请输入用户账户名称”,”取 

得账户信息”,”username”) 

我们可以利用xpos及ypos两个参数来指定对话框显 

示的位置。在默认的情况下,输入对话框的水平位置会 

在画面的中央,而垂直的位置则大约在画面的三分之一 

个“帮助”的按钮。例如我们执行了以F的语句: 

’MsgBoxTest.VBS 

M SgB0X”测试辅助说明l”,vb0K0nlY 0r 

vbInformation,”测试”,”c:\test.chm”,1011 

处,您可以使用这两个参数改变对话框出现的位置,它 

们的坐标单位是twip(每一个twip相当于1/1440时)。 

InputBox会返回用户输入的信息,如果用户取消了 

对话框,返回的就是空字符串。由于InputBox返回的 

就出现如图3的对话框。 

注意,“帮助”按钮的目的只是协助用户获得帮助 

说明,因此按F这个按钮并不会结束对话框,也不会将 

值返回到程序中。如果您对撰写帮助说明有兴趣,可以 

参考MSDN网站中HTML Help Workshop的说明(http:/ 

MsgBox圈标,I|敦 

vblnformation 

说啊 

显示信息圈标 

vbExclamation 

vbCritical 

vbQuestion 

显示惊叹圈标 

显示重要信息圈标 

显示问号圈标 

VBScri pt 

维普资讯

值都被视为字符串,所以您要自行利用类型转换函数把 

返回的结果转换成适当的数据类型。

Option Explicit 

Dim intServiceNumber 

函数的调用 

前面我们提到过,函数和语句最大的不同在于函数 

会返回结果,语句不会。由于函数会返回结果,所以 

多半用在表达式中。调用的时候我们会像之前所示范的 

intServiceNumber=CInt(InputBox(”您要列出几项 

服务?”,”系统服务”,10)) 

WScript.Echo ServiceList(intServiceNumber) 

那样,用括号将参数括起来。若该函数不需要参数,我 

们也要用空括号来声明它是一个函数。 

有些时候,我们可能并不需要返回的值。例如像前 

面的例子,我们利用MsgBox来显示信息,但不需要取 

Function ServiceList(ServiceNumber) 

Dim wmiObject,wmiServices 

Dim strServices,objService,intCount 

Set wmiObject=GetObject(”WinMgmts:”、 

得用户的响应,因此就不需要用括号把参数括起来。用 

Call语句调用函数也是一种方法。例如: 

Call MsgBox(”嗨l”) 

’显示所有的服务 

Set wmiServices: 

注意,用Call语句调用函数时,仍然要使用括号, 

但是函数并不需要出现在表达式中。 

wmiObject.InstancesOf(”Win32一Service”) 

For Each objService In wmiServices 

strServices:strServices&objService.Descrip・ 

自定义函数 

前面提到的MsgBox/3 ̄InputBox都是VBScript的内 

置函数。除了可以使用这些VBScript内置函数外,您 

还可以设计自己的函数,供程序使用。自定义函数的语 

法如下: 

Function FunctionName(parameters) 

statements 

tion&”:” 

intCount:intCount+1 

If intCount>:ServiceNumber Then 

ExitFor 

EndIf 

Next 

FunctionName:returnvahle 

End Function 

ServiceList:strServices&vbCrLf&vbCrLf&

”总共”&intCount&”个服务执行中l” 

End Function 

FunctionName是您的函数名称。由于函数是要返回 

值的,所以您最后执行的结果,要赋值于函数名称,也 

就是函数要返回给调用程序的值。注意在指定函数名称 

时,不能使用到任何VBScript的关键词。parameters指 

函数的参数,各个参数之间用逗号隔开。Statements是 

使用自定义函数的最大好处就是可以进行代码重 

用,上面的程序在执行时,只会执行程序开头到函数定 

义之前的程序代码,每一个个别的函数则只有在被调用 

时才执行。 

今天我们就讨论到这里,下一期,我们会更进一步 

实现函数功能的具体代码。 

以前面操作WMI的程序为例,我们可以把取得系 

统服务的工作封装成一个函数,然后再调用这个函数来 

研究有关字符串处理的函数,看看如何利用这些函数来 

提供更容易阅读的信息。 

取得服务清单,并显示相应的信息。为了提高使用的弹 

性,我们可以让用户决定要取得几个服务的名称。请注 

意,我们在利用InputBox函数取得用户输入的服务个数 

时,一定要利用类型转换函数(这里是使用Clnt)将 

数据转换成正确的类型,否则无法进行正确的判断。修 

改后的程序如下: 

’WMITest.VBS 

关于译者 

朱其胜,亚洲MVP。本刊特约撰稿人,本刊论 

 ̄/:Windows Server和Windows脚本版块的版主.网 

名:沧海笑一声。