花鸟鱼虫的虫:如何使用命令行参数和默认值?

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 12:04:55

如何使用命令行参数和默认值?

问:

嗨,Scripting Guy!我希望有个脚本可以将计算机名作为命令行参数接收,然后对这些计算机中的每台计算机运行这个脚本。但是,如果不输入命令行参数,我希望它默认对本地计算机运行。你们能帮我吗?

-- TS

答:

嗨,TS。当然,我们可以帮你。我们假设您在命令行提示符处输入以下命令来启动您的假想脚本:

cscript my_script.vbs atl-ws-01 atl-ws-02 atl-ws-03

这种情况下,您可能希望对以下三台计算机运行这个脚本:atl-ws-01; atl-ws-02; and atl-ws-03. 但如果您输入一个类似如下所示的没有任何命令行参数的命令,情况又会怎样呢:

cscript my_script.vbs

这种情况下,您希望脚本说:“哦,没有命令行参数,对吧?那好,我会对本地计算机运行。”

那么,如何做到呢?好吧,您可以通过以下代码来实现:

If Wscript.Arguments.Count = 0 ThenarrComputers = Array(".")ElseDim arrComputers()For i = 0 to Wscript.Arguments.Count - 1Redim Preserve arrComputers(i)arrComputers(i) = Wscript.Arguments(i)NextEnd IfFor Each strComputer in arrComputersSet objWMIService = GetObject _("winmgmts:\\" & strComputer & "\root\cimv2")Set colItems = objWMIService.ExecQuery _("Select * from Win32_OperatingSystem")For Each objItem in colItemsWscript.Echo objItem.CaptionNextNext

我们稍微解释一下这段代码的工作原理。我们首先检查是否输入了命令行参数;我们通过 Wscript.Arguments.Count(如您所料,这会告诉我们脚本启动时被提供的参数数目)来检查这个值。假如这个值等于 0。这说明您没有提供命令行参数。因此,我们将数组 arrComputers 的值设为圆点 (“.”)。为什么设为圆点?这是因为在 WMI 中,圆点表示本地计算机。

那为什么使用数组?好吧,那是因为我们想要尽可能写入几行代码。通过使用数组,我们就不需要为没有指定命令行参数的情况编写一组代码,而为指定了一个(或是两个)命令行参数的情况另外编写一组代码。相反,我们只要使用 If-Then 语句来检查 Wscript.Arguments.Count 的值就可以了。上面说过,如果这个值为 0(即没有输入命令行参数),那么我们就将 arrComputers 的值设为圆点。因此,我们就有了一个由单个项目组成的数组。

但如果 Count 等于 0 呢?这种情况下,我们就要获取所有命令行参数,并将这些参数填充到 arrComputers 中。以下就是它的工作原理:

首先,我们使用以下代码创建一个动态数组:Dim arrComputers()。动态数组就是事先不指定大小的数组;我们可以根据需要动态增加数组的大小。通过这种方式,我们就可以不必考虑所输出的命令行参数的个数,只要根据所有参数的数目调整数组的大小就可以了。

接下来,我们创建一个从 0 运行到 Wscript.Arguments.Count – 1 的 For Next 循环。这看来有点疯狂,但我们这么做是因为 VBScript 数组是从项目 0 开始的。因此,最后一个项目就自然是所有项目的总数减去 1。例如,假设我们有三个项目。第一个项目是项目 0;第二个项目是项目 1;那么第三个项目就是项目 2 (3 – 1)

对于每个项目,我们使用以下代码来重新调整数组大小:Redim Preserve arrComputers(i).这会将数组大小设置为 i 的值(i 是循环变量,它告诉我们正在处理的是 Wscript.Arguments 中的哪些参数)。开始运行循环时,i 等于 0,因此我们实际上使用的是以下代码:Redim Preserve arrComputers(0),它为我们提供了一个单元素数组。

顺便说一下,代码中的 Preserve 部分用于确保在每次重新调整数组的维数时不会丢失所有现有数据。假设我们处在 Redim arrComputers(),这时数组大小会被重新调整,但系统将会检测数组中原有的任何数据。

然后,我们将这个参数添加到数组中。如果我们提供 atl-ws-01 和 atl-ws-02 作为命令行参数,那么循环结束时 arrComputers 将是一个具有以下两个元素的数组:atl-ws-01 和 atl-ws-02。

剩下的就简单了。我们创建一个可以对数组 arrComputers 中的所有元素循环运行的 For-Each 循环;我们知道,arrComputers 中可能包含一个圆点(表示本地计算机),也可能包含从命令行参数中获取的计算机名列表。每次循环运行都会连接到相应的计算机并检索 Win32_OperatingSystem 类的 Caption 属性。以上就是对您的问题的全部解答!