• 2006-08-27

    脚本漫谈--2002年10月

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://tuenhai.blogbus.com/logs/3157276.html

    脚本漫谈--2002年10月

    http://www.microsoft.com/china/technet/archives/columns/scripts/sg1002.asp

    从WSH脚本中运行程序
    脚本专家组

    脚本专家组衷心欢迎您访问我们新近开辟的这个每月一期的专栏。我们原本希望依靠自身力量创办这个专栏,但却实在力不从心。正如您所看到的,这其实根本就不是我们的专栏;而是属于您们的专栏。您们将精心编写的大量电子邮件发送至scripter@microsoft.com,而这个专栏则恰恰(并将继续)建立在您们所提供的问题和评论基础之上。正因如此,脚本专家组才得以有条不紊地欢迎大家访问属于自己的专栏;我们衷心希望您们能够在此发现既赏心悦目又具备实用价值的信息资料。如果本专栏所呈献的内容并不令您满意,则请不吝赐教!

    我们所收到的较为常见一个问题就是,如何从WSH脚本中运行程序。以下是摘自此类电子邮件的一个具有代表性的片断。

    你们曾在Web广播中提到过两行可帮助你们运行某一外部程序的脚本代码。请问,你们能否提供有关代码的示例样本?

    作为针对上述问题的答复,我们决定占用本专栏第一期的篇幅向您介绍从自行编制的脚本中运行外部程序的具体实现方式。若问您为何需要从脚本中运行外部程序?就请这样设想:命令行工具将允许您执行一整套特定任务,而批处理脚本则提供了所需逻辑线程,以便您用来将这些任务缝合成足以构建自定义解决方案的基本要素。但是,如果批处理脚本所提供的逻辑线程尚不具备足够强大的功能,亦或构建解决方案所需必要组件不能由命令行工具提供,又将如之奈何?而这恰恰是WSH脚本大显身手的用武之地。这种脚本将允许您针对由脚本编程语言(如VBScript)所提供的强大逻辑线程加以应用,并借助强大的工具手段(如WMI和ADSI)以及命令行工具和批处理脚本将您自己的任务解决方案付诸实施。

    让我们立即着手编写一个示例脚本。事实上,我们应该在编写脚本之前,先确保具备一个用来保存这个脚本的物理位置。如果在您所使用的计算机上并不存在一个名为C:\Scripts的文件夹,就请返回根目录,并新建这个文件夹。当您完成上述工作后,应打开记事本或其它文本编辑器,并键入以下脚本代码,然后,使用RunIPConfig.vbs文件名将其保存至您的C:\Scripts文件夹。

    Set objShell = CreateObject(“Wscript.Shell”)
    objShell.Run “ipconfig”
    

    在尝试运行刚刚生成的脚本之前,让我们先对其进行检查,并设法事先指出可能产生的运行结果。在这个脚本中存在着两个有助于我们预测运行结果的暗示。第一行代码中包括动词Create(生成,实际上是CreateObject),而第二行代码则包含动词Run(运行)。可见,这个脚本将有可能先生成某种被称作对象的东西,并随后运行某一特定程序。事实上,情况看上去更象是该脚本将运行一个文件名为ipconfig.exe的命令行工具。

    以上预测的确与该脚本所产生的运行结果相符。该脚本首先生成一种被称作对象的东西。在这个示例中,脚本所生成的对象是Shell(WshShell)对象。您可将某一对象理解成类似于命令行工具的东西;而您的脚本则可借助它执行某一特定类型的任务。Shell对象将允许您从脚本中执行原本可在Windows命令解释程序内执行的任务--就像运行程序一样。

    与命令行工具不同的是,您必须在开始对其加以应用之前,先行生成一个新对象。当生成该对象时,还应为它指定一个将在脚本其余部分中被用来对它进行引用的名称。在这个示例中,我们所使用的名称是objShell。当对象生成完毕并被赋予相关名称后,我们便可利用该对象执行相关任务,具体方法为:在对象名后加上一个圆点(.),并在圆点后加上所需完成的任务名称。这个例子中的任务名是Run。而Run则是众所周知的Shell对象方法。

    现在,请打开一个命令行窗体,并导航至C:\Scripts文件夹。如需运行您刚刚编写的脚本,则请输入cscript RunIPConfig.vbs命令,并按回车键。您将看到一个窗体在屏幕上一闪而过,但该窗体所显示的内容却在您能够看清之前消失了!您可反复尝试运行该脚本,并试图破解消失在窗体中的信息。这也许是一件饶有兴味的事,但却可通过一种更加简便的方法完成。

    为了便于您进行理解,我们必须针对在您运行命令行工具的同时所发生的事件给予关注。当您在命令行方式下输入ipconfig、并在键盘上敲击回车键时,便对命令解释程序发出了一个指令。而命令解释程序则将对您所输入的指令进行检查。如果您所输入的命令代表着一个有效程序,那么,命令解释程序便会为您运行该程序。如果您所输入的命令并不代表有效程序,那么,命令解释程序则将通过显示错误信息的方式就有关情况向您进行告知。基于Windows NT操作系统的命令解释程序是Cmd.exe。而Windows 9x操作系统中的命令解释程序则是Command.exe。

    此时此刻,上述脚本中的objShell.Run “ipconfig”命令将在其运行ipconfig程序的同时绕过命令解释程序;换句话说,该命令将在无须先运行命令解释程序再由命令解释程序运行ipconfig的前提下直接运行ipconfig。在某些情况下,这种方式或许利大于弊,但在这个示例中,我们却不希望绕过命令解释程序。为什么?因为命令解释程序可帮助我们发现“窗体一闪而过”问题的答案。正如您所看到的,命令解释程序可接受大量开关选项(如果您有兴趣了解cmd.exe或command.exe所具备的全部功能,则请在计算机帮助系统中查找该程序的可执行文件),而这些选项中的/k开关则恰恰用来指示命令解释程序在某一程序运行完毕后保持输出窗口的开启状态。我们需要借助这个选项来确保程序窗体不会在打开后立即关闭。

    为实现上述目的,我们应将正在运行的命令从ipconfig修改为cmd.exe /k ipconfig或command.exe /k ipconfig,这里,cmd.exe对应于Windows NT操作系统,而command.exe则适用于Windows 9x操作系统。但是,如果您必须同时面向Windows NT和Windows 9x操作系统提供支持,又将如之奈何?针对我们正在使用的操作系统进行跟踪的确是一件颇为麻烦的事。也正是出于这种原因,我们才引用了一个名为%COMSPEC%的环境变量,以期提供通往适当命令解释程序的完整路径。该环境变量可确保下列脚本代码既可在Windows NT操作系统上运行,又能在Windows 9x操作系统上执行:

    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "%COMSPEC% /k ipconfig"
    

    请尝试运行这个经过修改的脚本。您只需启动记事本(或其它习惯使用的文件编辑器),并将%COMSPEC% /k添加到先前编写的脚本中,然后,将修改过的文件另存为RunIPConfig.vbs。接下来,在命令行窗体中导航至C:\Scripts目录,再通过输入cscript RunIPConfig.vbs命令并按回车键的方法运行该脚本。您这次将看到一个用来显示ipconfig命令输出结果的新窗体,具体情形如下图所示。

    tuenhai:

    blogbus最垃圾的地方之一就是无法贴长文。下面部分被自动截去了。

    下面是vbscript教程:

    http://book.chinaz.com/others/web/web/VBScript/index.htm

    http://www.pconline.com.cn/pcedu/empolder/wz/vbscript/index.html


    收藏到:Del.icio.us