当前位置:编程学习 > 网站相关 >>

脚本的故事之2004 年 7 月

本页内容
脚本恰似好用的参数
为脚本添加命令行参数
回到刚才那个问题,什么是命令行参数呢?
这很酷,但还可以更酷,如果我们能…
1 是最孤独的数字
计算机上对任一服务进行操作又该如何呢? 那么在任意数量的计算机上对任一服务进行操作又该如何呢?
计算机上对任何服务进行操作,那该怎么办?  不过,如果想在任意数量的计算机上对任何服务进行操作,那该怎么办?
下一步做什么?

 

脚本恰似好用的参数
大多数人都知道周期蝉 — 人们更常被其为 17 年蝉。周期蝉是一种蜫虫;它们在某个夏天出现,发出大量的噪音,制造巨大的骚乱,然后消失不见,但是 17 年后又会重新出现,重复这一周期。或许我们可以这样说:在许多方面,我们这些 Microsoft 脚本专家就像 Microsoft 的脚本蝉 — 我们突然出现,大显身手,兴风作浪,然后消失。等过了大约 17 年,我们突然又回来了。这个周期会一直循环下去吗?谁知道呢?请到 2021 年登录 TechNet 查找答案吧!

换句话说,我们知道,从上一次脚本的故事 专栏到现在的确 已经很长时间了。这么长时间没露面有许多原因—慢着,谁说的“先坦白承认你们这些家伙只是偷懒而已?”为什么这么说?如果我们不是偷懒的话,我们就会真的给您个…不过请记住,重要的事情不是问“你们到哪里去了?”重要的是我们回来了,并且我们是带着全新的、很酷的“脚本中心”一起回来的。在写这篇文章的时候,我们不清楚这些新特色中有多少已经亮过相,但是您很快就会看到一个扩展后的“脚本中心”,它包括:

• 数百个新脚本。
 
• 指向网络广播、脚本编写文章、脚本专栏等的链接。
 
• 新的“解决方案中心”,提供能直接被企业所使用的、由 Microsoft 产品团队开发的脚本。
 
• 脚本专家 工具包和脚本专家书架,带注释的脚本编写工具与资源列表。
 
• 新的每日问答专栏您好!脚本专家!
 

最重要的是,我们将每隔 17 年推出一个新的脚本的故事 专栏。我们保证做到!

好吧好吧。我们退一步,就每月提供一个新的脚本的故事 专栏;再次使脚本的故事 成为脚本编写者的首选资源,方便你们查找简单、易懂的常见脚本编写问题的答案,比如“你们这些人怎么需要这么长时间来写一个小小的脚本专栏?”

_px_up.gif" width=7 border=0>返回页首
为脚本添加命令行参数
我们原先计划在这个月讨论如何在脚本中使用命令行参数。(是的,对专栏来说这的确 是个好主意,不过不用谢我们;毕竟我们花了 17 年才想出这个主题。)您可能已经注意到了,“脚本中心”中的大部分脚本都是为在一台计算机上运行而设计的;除此之外,我们也倾向于对计算机名这样的对象采用硬编码。例如,以下脚本只能完成一个任务:停止本地计算机上的“警报器”服务。如果您看得足够仔细,您会发现我们指定了脚本运行的对象计算机的名称 (.) 和要停止的服务的名称 (Alerter):

strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\" & strComputer & "ootcimv2")
Set colServices = objWMIService.ExecQuery _
    ("Select * FROM Win32_Service WHERE Name = Alerter")
For Each objService in colServices
    objService.StopService
Next

不用说,让脚本只能在本地计算机上停止“警报器”服务看起来并不很有用,也没什么可兴奋的。那么,我们为什么要写这样的脚本呢?这至少有两个原因。其中之一是,硬编码值有助于缩短脚本的长度。我们的脚本要富有指导性,我们不希望因为有许多附加代码而使脚本显得混乱;我们希望方便您将注意力集中到手头的任务上。同样因为这个原因,我们的脚本中通常不包括错误处理;对我们的目的来说,脚本越短越好。(此外,看一看我们编写简单脚本所花的时间;您能想象编写复杂脚本要花多长时间吗?)

另一个原因是,编写简单脚本更便于您利用我们的脚本和根据自己的需要来修改脚本。例如,假如我们的所有脚本都从一个文本文件读入计算机名,执行某些任务,然后将数据输出到 Excel。这么做没问题;但是这就不利于您利用该脚本并将其修改为从 Active Directory 读入计算机名,然后将信息输出到命令窗口。我们的脚本写得越复杂,您就越难自定义这些脚本来满足您的独特需求。反过来,这也使我们有点像解决方案供应商,而不像是教育者;请相信我们,没有人希望这样。(当然,除非您愿意为一个解决方案等待 17 年。)

总的来说,这已被证明是一个有效的方法。但是必须承认,我们的确 有一个较坏的说话习惯,比如,我们会说,“这确实只是一个脚本骨架,但是您可以很方便地修改它以使其执行接受命令行参数等操作。”的确如此,只是我们好像从来不准备告诉别人怎样 修改我们的示例脚本,让它们执行接受命令行参数等操作。我们将马上注意弥补这样的疏漏。(你们已经埋怨过我们很懒了…)

_px_up.gif" width=7 border=0>返回页首
回到刚才那个问题,什么是命令行参数呢?
为了保证我们的理解是一致的,有必要给出一个简单的定义。命令行参数是在您启动实用工具(可以是脚本、可执行文件或任何其他事物)时传递给实用工具的附加信息。例如,假设您试图 ping IP 地址 192.168.1.1。在这种情况下,您将在命令提示符下键入类似以下的内容:

ping 192.168.1.1

您也许已经猜到了,192.168.1.1 就是一个命令行参数(有时候叫做命令行变元,有时候叫做命令行开关,有时候直接叫做参数)。为什么您需要 命令行参数呢?好的,实际上您不需要。但是拿 Ping 来举例吧。假如您不能将 IP 地址作为命令行参数来传递,那么 Ping 对您有什么用处呢?Ping 是一个有用的实用工具,因为它允许您 ping 任何 IP 地址;它能这么做是因为它没有将任何 IP 地址硬编码在其中。相反,您在每次运行 Ping 的时候都要指定一个 IP 地址作为命令行参数。如果不能接受命令行参数,至少 Ping 的用途会很有限。

脚本也有同样的问题。如果您将计算机名称硬编码在了脚本中,那么只能在这台计算机上执行您的脚本。如果您需要在另一台计算机上执行脚本会怎么样呢?在这种情况下,您要么必须修改脚本,要么创建一段全新的脚本以便在第二台计算机上运行。不用说,这两种方法的效率都不高。更好的方法是创建一个脚本,其中包含了便于该脚本在任何 计算机上运行的方便方法。这正是命令行参数的设计思想。

我们知道,有些读者看到这里开始有点害怕了;你们会想“命令行参数?好像很难啊。我们才 17 年没见面而已,再等等好吗?”听着,您根本不必担心;因为您会发现命令行参数很容易掌握。事实上,您可以立即将命令行参数传递到脚本。在记事本中键入以下只有一行的脚本,然后将其保存为 args.vbs。

Wscript.Echo strComputer

现在,在命令提示符下用以下命令运行该脚本:

cscript args.vbs atl-ws-01

看看发生了什么情况。哦,什么也没发生;不过,如果您是脚本的故事 的读者,您应该对这种现象很习惯了。为什么除了屏幕上出现空白的信息反馈外没有出现任何其他现象呢?很简单,strComputer 变量没有设成任何值。但是,现在您不必再担心这种情况了。重要的是,您已经将一个命令行参数 (atl-ws-01) 传递到了脚本,并且脚本接受了该参数且没有出现任何问题。换句话说,Windows Script Host 无需任何特殊编码就接受了命令行参数;您唯一要做的就是在代码中加入一两行,让脚本使用 这些参数。

顺便说一下,您可能希望知道,当启动这个脚本并向它传递了一个命令行参数的时候,“这个参数到底 经历了些什么?它仅仅是消失了吗”答案是否定的,它不是仅仅消失了而已。事实上,传递给脚本的所有命令行参数都保存在 WSH Arguments 集合中 — 在您每次运行脚本的时候,都会自动创建这个集合。Arguments 集合是一个在运行时由传递给脚本的所有命令行参数组成的数组。当您启动脚本的时候,参数 atl-ws-01 实际上保存在 Arguments 集合中;只是我们的脚本中没有任何代码从这个集合中检索 它的值而已。只要给我们一秒钟,我们就可展示如何在您的脚本中添加此种代码。

注意 在进一步讨论之前,我们想指出,在 WSH 中,参数是用空格分隔的。假设我们键入以下内容:

cscript args.vbs atl-ws-01 atl-ws-02

在这个例子中,我们有两个参数:atl-ws-01 和 atl-ws-02。假设我们键入以下内容:

cscript args.vbs atl-ws-01/atl-ws-02/atl-ws-03

这里有多少个参数?不错;它只是一个大参数:atl-ws-01/atl-ws-02/atl-ws-03。因为参数之间必须用空格分隔。要想传递三个参数,我们必须键入以下内容:

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

如果像下面的例子中那样在参数之间键入多个空格,那么会怎样?

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

没问题;WSH 会自动丢弃多余的空格。但是,如果参数中必须包含空格,比如传递文件夹名称 C:Documents and Settings,那么会怎样?在这种情况下,请在参数外面加双引号,比如:

cscript args.vbs atl-ws-01 "C:Documents and Settings"

 

好了,现在回过头来讨论我们的参数发生了什么事情?刚才说过,参数是保存在数组中的;这个数组同大多数数组一样,给数组中的每一项分配一个索引号:第一项的索引号是 0,第二项是 1,依此类推。就脚本而言,数组类似下表:

索引号 值
0
 atl-ws-01
 
1
 atl-ws-02
 
2
 atl-ws-03
 

您为什么关心这个?

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,