如果你使用过UNIX上的Shell Script(命令解释器脚本),那么对Unix下的脚本编程一定深有感触。利用UNIX上的各种Shell Script,例如C-Shell、TCL/TK、Perl,UNIX管理员往往用一个脚本就可以完成你半天的编程才能完成的任务。
但在微软的世界中一直没有够份量的类似东西出现,充其量我们只能写写简单的Batch File(就是DOS下的批处理命令),但它所提供的功能也太过于简单,无法处理复杂的事情。不过以前在DOS下还有Basic可以解一点燃眉之急,谁知道到了Windows 95以后连Basic都不复存在,让我们这些喜欢DIY的朋友们很不舒服。其实在Windows方便的操作界面下掩盖着更为强大的功能,你听说过WSH吗?它的全称是Windows Scripting Host,中文名字可以叫它Windows平台指令主机,就是它,让你通过威力强大的VBScript和JavaScript脚本,来实现强大的功能,再也不用羡慕UNIX平台下的各种Shell Script了……
WSH的优点
WSH可以在32位Windows平台上提供简单、威力强大以及具有弹性的指令环境。
1.更有威力的指令系统
在以前,Windows操作系统支持的唯一类似于脚本语言的是MS-DOS的批处理命令,虽然MS-DOS指令又快又小,但和VBScript及JavaScript相比,MS-DOS受到许多限制。今天,架构于ActiveX之上的WSH允许使用者利用威力强大的指令语言如VBScript与JavaScript,同时MS-DOS指令WSH仍可以支持,不过对于脚本语言来说,它只是很小的一个方面了。
2. Windows脚本语言的执行环境
以前的MS-DOS类的命令只可以在DOS下或者DOS窗口下使用,现在不一样了,Microsoft目前在 Windows平台上提供三种脚本语言的执行环境:
WSH架构
长久以来,Windows操作系统都缺乏一个真正的Shell程序功能,因此微软就针对了这个问题提出了WSH的架构,把解释程序语言的部分以及提供功能服务,像是显示信息、存取文件、或是读写注册表 (Registry) 等部分功能分开,解释的部分交给相应语言的解释引擎(Scripting Engine),而提供功能服务的部分就称为一个执行环境 (Scripting Host),WSH就是专为在Windows系统下执行这种服务程序的环境。
刚才所讨论的解释与服务分开的方式就是微软的ActiveX Scripting架构,图1就说明了WSH的架构以及执行环境与解释引擎之间的关系,在这个图中,我们假设要执行Tentimes.vbs脚本,它的具体步骤是:
先执行WSH(Windows 98带有字符模式的cscript.exe和图形界面的Wscript.exe),告诉它执行tentimes.vbs脚本,具体的命令行是:
cscript tentimes.vbs或者wscript tentimes.vbs
这是WSH会根据所要执行脚本的后缀名(VBS),到系统注册表中查询可以解释这种程序的解释引擎(Windows 98附有VBScript和JavaScript两种语言的解释引擎,你也可以自己安装其它语言的解释引擎,比如Perl)。
找出解释引擎之后,WSH会将程序一行一行从脚本中读出,然后送到解释引擎,由解释引擎解释程序所要执行的动作。
如果所要执行的动作必须要使用到WSH所提供的服务,例如存取文件或是注册表的内容,就向WSH提出要求,由WSH负责处理。
通过这样的方式,不管你使用何种语言,只要有该语言的解释引擎,就可以在WSH下执行该种语言编写的程序,并且可以使用WSH所提供的服务。
也许有的朋友要问:WSH是如何将这些服务提供给脚本语言呢?其实很简单,它其实相当于我们练习编程的那些函数(当然了,微软称它们为对象、属性和方法),通过这些接口实现脚本和操作系统的对话。好了,闲话少说,我们先来看看WSH到底有何神通……
Windows 98/Me、Windowns NT+IIS和Windows 2000都已经附带有WSH(不用去找那些烦人的编程语言IDE^_^),,如果你用的是Windows 95或者你想将你的WSH更新到最新版本。没有问题,到微软的WSH站点下载一个就是http://msdn.microsoft.com/scripting/,当前的最新版本是5.5,不过你下载的时候可要看清楚语言版本,中文的一定要选择Chinese/Simplified,下载不一致的语言版本回来可是不能安装的。同时你还要选择适合自己操作系统的版本,Windows 2000和其它操作系统是不同的。另外如果你想好好看一下WSH的帮助文档(WSH的帮助文档可不是像Linux下都随软件带有,它是需要另外下载的),也可以到前边所说的网址下载一个可执行文件,安装以后在\Program Files\Microsoft Windows Script\WSHdocs下找到一个WSH.chm的帮助文件,里面有WSH的详细说明,这个东西你可千万不能少了……
WSH使用初探
整个WSH中,Script语言都是以对象(Object)为基础在运作,讲到对象自然就会有所谓的方法(Method)和属性(Property)。所以要使用WSH的第一步就是建立一个对象,然后利用该对象的各种方法和属性,WSH提供以下几个对象:
Script.Network:用来与网络沟通,通过它,你可以取得网络的各种信息,比如IP地址、网上邻居列表等等;
WScript.Shell:与操作系统沟通,你可以通过该对象在桌面建立快捷方式、建立/删除注册表键值;
Excel.Application:与Excel沟通,不但可以在Excel中显示WSH内容,而且可以用WSH存取Excel和显示图表。
此外,WSH还可以显示一些窗口和捕捉鼠标的输入等等,这里就不再枚举,下边我们看看它具体是如何使用的:
1.建立一个弹出窗口
记得以前在所有的编程科目学习中,老师都会让我们编写一个Hello,World!的实例,这里我们先看看如何完成一个Hello,World的弹出窗口,打开记事本,输入以下代码,保存为PopUp.js,然后执行一下看看效果是否和图2一样。
function showit(){
var Message = "Hello, World!";
var timeout = 0;
var title = "Hello, World!";
var buttons = 65;
var rslt;
var WS = WScript.CreateObject("WScript.Shell");
rslt = WS.Popup(Message, timeout, title, buttons);
if ( rslt == 2 ) {
WScript.Quit;
}
}
showit();
2.显示网络信息(见图3)
让我们看看如何显示使用者工作组、使用者姓名、和电脑名称,使用记事本建立network.vbs,内容如下:
Set WSHNetwork = WScript.CreateObject("WScript.Network")
'显示WSHNetwork object的properties
MsgBox "使用者工作组: " & WSHNetwork.UserDomain & Chr(13) & Chr(10) & "使用者姓名: " & WSHNetwork.UserName & Chr(13) & Chr(10) & "电脑名称 : " & WSHNetwork.ComputerName, vbInformation + vbOKOnly, "WSHNetwork 内容"
3.桌面快捷方式的建立
'Shortcut.vbs
Set WSHShell = WScript.CreateObject("WScript.Shell")
'使用SpecialFolders读取桌面路径
DesktopPath = WSHShell.SpecialFolders("Desktop")
'于桌面上建立快捷方式
Set Shortcut1 = WSHShell.CreateShortcut(DesktopPath & "\记事本.lnk")
'设定快捷方式的属性并保存
Shortcut1.TargetPath = WSHShell.ExpandEnvironmentStrings("%windir%\notepad.exe")
Shortcut1.WorkingDirectory = WSHShell.ExpandEnvironmentStrings("%windir%")
Shortcut1.WindowStyle = 4
Shortcut1.IconLocation = WSHShell.ExpandEnvironmentStrings("%windir%\notepad.exe, 0")
Shortcut1.Save
4.WSH与Excel沟通(见图4)
让我们看看如何在Excel中显示WSH内容,使用记事本开启excel.vbs,内容如下:
Set objXL = WScript.CreateObject("Excel.Application")
objXL.Visible = TRUE
objXL.WorkBooks.Add
objXL.Columns(1).ColumnWidth = 20
objXL.Columns(2).ColumnWidth = 30
objXL.Columns(3).ColumnWidth = 40
objXL.Cells(1, 1).Value = "属性名称"
objXL.Cells(1, 2).Value = "值"
objXL.Cells(1, 3).Value = "描述"
objXL.Range("A1:C1").Select
objXL.Selection.Font.Bold = True
objXL.Selection.Interior.ColorIndex = 1
objXL.Selection.Interior.Pattern = 1 'xlSolid
objXL.Selection.Font.ColorIndex = 2
objXL.Columns("B:B").Select
objXL.Selection.HorizontalAlignment = &hFFFFEFDD ' xlLeft
Dim intIndex
intIndex = 2
'显示WScript properties
Call Show("Name", WScript.Name, "应用程序名称")
Call Show("Version", WScript.Version, "应用程序版本")
Call Show("FullName", WScript.FullName, "应用程序内容: 完整名称")
Call Show("Path", WScript.Path, "应用程序内容: 只有路径")
Call Show("Interactive", WScript.Interactive, "互动模式状态")
'显示命令行参数
Dim colArgs
Set colArgs = WScript.Arguments
Call Show("Arguments.Count", colArgs.Count, "指令列引数数目")
For i = 0 to colArgs.Count - 1
objXL.Cells(intIndex, 1).Value = "Arguments(" & i & ")"
objXL.Cells(intIndex, 2).Value = colArgs(i)
intIndex = intIndex + 1
objXL.Cells(intIndex, 1).Select
Next
Sub Show(strName, st