15.6 Windows脚本宿主的内建对象 每个编程环境都提供了自己的对象模型,开发人员 可以使用这些对象模型实现各种解决方案,WSH也不例外。WSH包含了一组核心对象,分别包含了属性和方法,可以用于访问网络中的其他计算机、导入外部的 可脚本化对象以供应用程序使用,或者连接到Windows或Windows Shell。 15.6.1 WScript对象 WSH对象模型的基础就是WScript对象。这个对象提供了使开发人员能够访问各种信息的属性和方法,如: ● 将要执行的脚本的名称和路径信息 ● Microsoft脚本引擎的版本 ● 与外部对象的链接 ● 与用户的交互 ● 延迟或中断脚本执行的能力 1. WScript的属性 WScript对象具有下列属性: ● Arguments ● FullName ● Interactive ● Name ● Path ● ScriptFullName ● ScriptName ● StdErr ● StdIn ● StdOut ● Version Argument Argument属性包含了WshArguments对象(一个参数集合)。从该集合中获取单个参数时,使用由0开始的索引。 Set objArgs = WScript.Arguments For x = 0 to objArgs.Count - 1 WScript.Echo objArgs(x) Next FullName FullName属性是一个只读的字符串,它代表宿主可执行文件(cscript.exe或wscript.exe)的有效完整路径。下面的代码使用了FullName属性。 WScript.Echo WScript.FullName 这段代码产生如图15-4的输出。 图15-4 Interactive Interactive属性设置脚本的模式,或识别脚本的模式。使用该属性会返回一个布尔值。有两种可用的模式:批处理模式和交互模式。 在交互模式下(默认情况),脚本可以与用户进行交互。可以向WSH输入信息,WSH也可以输出信息,信息被显示在对话框中,等待用户提供反馈。在批处理模式中,不支持用户交互,不支持WSH的输入和输出。 可以使用WSH命令行开关脚本模式//I(交互模式)和//B(批处理模式)来设置脚本模式。 Name Name属性返回WScript对象(宿主可执行文件)的名称,它是一个只读的字符串。下面的代码使用了Name属性: WScript.Echo WScript.Name 这段代码产生如图15-4的输出。 图15-5 Path Path属性返回包含宿主可执行文件(cscript.exe或wscript.exe)的目录名。该属性返回一个只读的字符串。 下面的VBScript代码将显示可执行文件所在的目录名: WScript.Echo WScript.Path ScriptFullName ScriptFullName属性返回当前正在运行的脚本的完整路径。该属性返回一个只读的字符串。 ScriptName ScriptName属性返回当前正在运行的脚本的文件名。该属性返回一个只读的字符串。下面的代码显示了正在运行的脚本的名称,如图15-6所示: WScript.Echo WScript.ScriptName 图15-6 StdErr StdErr属性开放当前脚本的只写的错误输出流。该属性返回一个标识标准错误流的对象。只有使用cscript.exe时才能访问StdIn、StdOut和StdErr流。使用wscript.exe时如果想访问这些流就会产生一个错误。 StdIn StdIn属性开放当前脚本的只读的输入流。该属性返回一个标识标准错误流的对象。只有使用cscript.exe时才能访问StdIn、StdOut和StdErr流。使用wscript.exe时如果想访问这些流就会产生一个错误。 StdOut StdOut属性开放当前脚本的只写的错误输出流。该属性返回一个标识标准错误流的对象。只有使用cscript.exe时才能访问StdIn、StdOut和StdErr流。使用wscript.exe时如果想访问这些流就会产生一个错误。 下面的示例使用了这三种类型的内建流打印匹配某一特定扩展名的所有文件列表。这是通过将DOS的dir命令结果使用管道重定向到过滤器脚本来实现的,其中将扩展名字符串作为参数。 ' Usage: dir | cscript filter.vbs ext ' ext: file extension to match ' Dim streamOut, streamIn, streamErr Set streamOut = WScript.StdOut Set streamIn = WScript.StdIn Set streamErr = WScript.StdErr Dim strExt, strLineIn Dim intMatch strExt = WScript.Arguments(0) intMatch = 0 Do While Not streamIn.AtEndOfStream strLineIn = streamIn.ReadLine If 0 = StrComp(strExt, Right(strLineIn, Len(strExt)), _ vbTextCompare) Then streamOut.WriteLine strLineIn intMatch = intMatch + 1 End If Loop If 0 = intMatch Then streamErr.WriteLine "No files of type '" & strExt & "' found" End If 因为这个示例中使用StdIn、StdOut和 StdErr进行消息的处理,所以不仅能将匹配的文件打印在屏幕上,也能够将输出结果发送到一个文本文件或其他有重定向或附加管道功能的应用程序中。例如,可以使用下面的命令创建一个文件,包含整个目录树,包括子目录中的所有.vbs文件: C:/wsh>dir /s | cscript filter.vbs vbs >> vbsfiles.txt Version 该属性返回WSH的版本。下面的代码显示当前WSH的版本,如图15-7所示: WScript.Echo WScript.Version 图15-7 2 WScript的方法 WScript对象具有下列方法: ● CreateObject ● ConnectObject ● DisconnectObject ● Echo ● GetObject ● Quit ● Sleep CreateObject WScript对象的这个方法用于创建一个COM对象。 object.CreateObject(strProgID[,strPrefix]) ● object:WScript对象。 ● strProgID:值为字符串,表示想要创建的对象的程序标识符(ProgID)。 ● strPrefix:可选。值为字符串,表示函数前缀。 使用CreateObject方法和strPrefix参数创建的对象是已连接对象。对象被创建后,其输出接口与脚本文件相连接。每个事件函数都由这个前缀加上事件的名称来命名。 如果创建对象时没有使用strPrefix参数,也可以使用ConnectObject方法同步对象的事件。只要对象产生一个事件,WSH就会调用一个子程序,其名称是strPrefix加上事件的名称。 下面的代码使用CreateObject方法创建一个WshNetwork对象: Set WshNetwork = WScript.CreateObject("WScript.Network") ConnectObject 该方法将对象的事件源连接到具有给定前缀的函数。 object.ConnectObject(strObject, strPrefix) ● object:WScript对象。 ● strObject:必需的。表示想要连接的对象名称的字符串。 ● strPrefix:必需的。表示函数前缀的字符串。 同步一个对象的事件时,已连接对象是很有用的。对象被创建后,ConnectObject方法将对象的输出接口连接到脚本文件。事件函数的名称就是这个前缀加上事件的名称。 WScript.ConnectObject RemoteScript, "remote_" DisconnectObject 该方法用于断开已连接对象的事件源的连接。 object.DisconnectObject(obj) ● object:WScript对象。 ● obj:表示想要断开连接的对象名称的字符串。 断开一个对象的连接意味着WSH无法再响应它的事件。但是,有一点很重要,那就是断开连接后对象仍然能够产生事件。还要注意的是,如果指定的对象尚未连接,DisconnectObject方法就不会做任何事。 WScript.DisconnectObject RemoteScript Echo 该方法输出一个消息框或一个命令控制台窗口。 object.Echo [Arg1] [,Arg2] [,Arg3] ... ● object:WScript对象。 ● Arg1、Arg2、Arg3、……:可选。表示要显示项目的列表。 根据当前使用的WSH引擎的不同,Echo方法输出的类型也有所变化(参见表15-3)。 表15-3
图15-8和图15-9显示了这两种输出的示例。 图15-8 图15-9 GetObject GetObject方法根据指定的ProgID获取某个已存在对象,或从文件创建一个新的对象。 object.GetObject(strPathname [,strProgID], [strPrefix]) ● object:WScript对象。 ● strPathname:包含将对象保存到磁盘的文件所使用的完整的有效路径名。 ● strProgID:可选。值为字符串,表示想要创建的对象的程序标识符(ProgID)。 ● strPrefix:可选。进行对象事件同步时有用。如果提供了strPrefix参数,WSH就会在创建对象之后将对象的输出接口连接到脚本文件。 如果内存中存在对象的一个实例,或者想从文件创建一个对象,都需要使用GetObject方法。GetObject方法适用于所有COM类,与创建对象使用的脚本语言无关。 如果内存不存在对象的实例,也不想从文件创建对象,就可以使用CreateObject方法。 Dim MyObject As Object Set MyObject = GetObject("C:/DRAWINGS/SCHEMA.DRW") MyApp = MyObject.Application Quit 该方法强制脚本在任意时刻立即停止执行。 object.Quit([intErrorCode]) ● object:WScript对象。 ● intErrorCode:可选。返回一个整数值,作为进程的返回码。如果忽略intErrorCode参数,就不会有返回值。 Quit方法可以用于返回一个可选的错误代码。如果Quit方法是脚本中的最后一条命令(并且不需要返回一个非零值),就可以不使用任何参数,这样脚本就会正常退出。 WScript.Quit 1 ' This line of code is not executed. MsgBox "This message will never be shown!" 下面给出了Quit方法实际运行的示例。 If Err.Number <> 0 Then WScript.Quit 1 ' some failure indicator Else WScript.Quit 0 ' success End If WScript.Quit 1 Sleep 该方法将脚本的执行挂起一段时间,然后接着执行。 object.Sleep(intTime) ● object:WScript对象。 ● intTime:这是一个整数值,表示希望脚本进程保持非活跃状态的时间间隔(以毫秒为单位)。 使用这个方法时,运行脚本的线程被挂起,占用的CPU被释放。当间隔时间到,就会继续恢复执行。要想被事件所触发,脚本必须持续活跃,因为已经结束执行的脚本是肯定不能检测到任何事件的。脚本所处理的事件在脚本休眠时仍然会被执行。 向Sleep方法传递0或-1作为参数,就不会导致脚本不确定性地挂起。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "calc" WScript.Sleep 100 WshShell.AppActivate "Calculator" WScript.Sleep 100 WshShell.SendKeys "1{+}" WScript.Sleep 500 WshShell.SendKeys "2" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 500 WshShell.SendKeys "*9" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 2500 </script> </job> </package> 15.6.2 WshArguments对象 编程过程中,参数的使用是一种非常有益的机制,可以给脚本提供输入以支持它的工作。如果考虑在DOS提示符下工作,那么多数命令行可执行文件都使用参数来确定要做的事情。例如,浏览一个目录树: c:/>cd wsh 在这个例子中,cd是一个DOS命令的名称(用于切换目录),而wsh是要激活的目录的名称—— 它是作为参数被传递给cd的。 创建使用参数的脚本是编写可重用代码的一个良好开端。创建设计用于在命令行中执行的脚本的开发人员会立竿见影地感受到使用Arguments属性带来的好处。不过,在WSH中,还有更好的理由来使用这个对象,因为这就是拖放功能得以实现的原因。 使用这个对象的最后一个好处就是它允许开发人员在其他脚本中重用脚本代码,只要以命令行运行的方式运行想重用的脚本,并给它传递可能在运行时需要的参数即可。 1. 访问WshArgument对象 它是通过使用WScript.Arguments属性来实现的。 Set objArgs = WScript.Arguments 2 WshArgument对象的属性 WshArgument对象是一个由WScript对象的Arguments属性返回的集合(WScript.Arguments)。 访问命令行参数集合有下列三种方法: ● 使用WshArguments对象访问整个参数集合。 ● 使用WshNamed对象访问有名字的参数。 ● 使用WshUnnamed对象访问没有名字的参数。 下面的例子是一个遍历WshArguments集合的简单循环,依次显示每个元素: Set objArgs = WScript. Arguments For x = 0 to objArgs.Count - 1 WScript.Echo objArgs(x) Next 有趣的是,这段代码既适用于cscript.exe,也适用于wscript.exe,可以使用示例echoargs.vbs来尝试这一点。在命令行中运行时,传递一些参数: c:/vbs/echoargs Hello, World! 图15-10显示了命令行输出。 图15-10 现在可以尝试拖动一两个文件,并将它们放到echoargs.vbs上。图15-11显示了这样做输出的结果。 图15-11 15.6.3 WshShell对象 Windows脚本宿主提供了一种便捷的方式,可以用于获取系统环境变量的访问、创建快捷方式、访问Windows的特殊文件夹,如Windows Desktop,以及添加或删除注册表条目。还可以使用Shell对象的功能创建更多的定制对话框以进行用户交互。 1 访问WshShell对象 要使用下面这一节中将要列出的属性,程序员必须创建一个WScript.Shell对象的实例。这样以后对WshShell对象的引用实际就是对新创建实例的引用。 Set WshShell= WScript.CreateObject( "WScript.Shell" ) 2 WshShell对象的属性 WshShell对象有三个属性: ● CurrentDirectory ● Environment ● SpecialFolders CurrentDirectory 该属性获取或更改当前活动目录。 object.CurrentDirectory ● object:WshShell对象。 CurrentDirectory属性返回一个字符串,其中包含当前活跃进程的当前工作目录的完整有效路径名。 Dim WshShell Set WshShell = WScript.CreateObject("WScript.Shell") WScript.Echo WshShell.CurrentDirectory Environment 该属性返回WshEnvironment对象(一个环境变量集合)。 object.Environment ([strType]) ● object:WshShell对象。 ● strType:可选。指定环境变量的位置。 Environment属性包含WshEnvironment对象(一个环境变量集合)。如果指定了strType,就指定了环境变量所在的级别的值: ● System ● User ● Volatile ● Process 如果没有指定strType,Environment属性就会根据不同的操作系统返回不同的环境变量类型(表15-4所示)。 表15-4
对于Windows 95/98/Me,只允许一种strType:Process。其他类型不允许在脚本中使用。 表15-5列出了Windows操作系统提供的一些变量。 表15-5
(续表)
要注意的是,脚本有可能访问其他应用程序所设置的环境变量,而且上面列出的环境变量都不能是Volatile类型的。 下面是一个关于在代码中如何使用上面列出的这些变量的示例。该示例返回系统中存在的处理器个数。 Set WshShell = WScript.CreateObject("WScript.Shell") Set WshSysEnv = WshShell.Environment("SYSTEM") WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS") SpeciolFolders 该属性返回一个SpecialFolders对象(一个特殊文件夹集合)。 object.SpecialFolders(objWshSpecialFolders) ● object:WshShell对象。 ● onjWshSpecialFolders:特殊文件夹的名称。 WshSpecialFolders对象是一个集合,它包含所有的Windows特殊文件夹,其中包括Desktop文件夹、Start Menu文件夹和Documents/My Documents文件夹(注意,在Windows Vista中去掉了前缀“my”)。 特殊文件夹的名称用于索引集合以获取想要的具体 文件夹。如果被请求的文件夹(strFolderName)不可用,SpecialFolder属性将返回一个空字符串。例如,Windows 95没有AllUsersDesktop这个文件夹,所有如果strFolderName是AllUsersDesktop的话,就会返回一个空字符串。 下面是可用的特殊文件夹: ● AllUsersDesktop ● AllUsersStartMenu ● AllUsersPrograms ● AllUsersStartup ● Desktop ● Favorites ● Fonts ● MyDocuments ● NetHood ● PrintHood ● Programs ● Recent ● SendTo ● StartMenu ● Startup ● Templates 下面的代码用于获取Start Menu文件夹并在strDeskTop变量中保存路径以备后面的使用。 strDesktop = WshShell.SpecialFolders("StartMenu") 3. WshShell对象的方法 WshShell对象有11个方法。所有这些方法都与操作系统shell相关,可以用于控制Windows注册表,也可以创建弹出式消息框和快捷方式以及激活和控制正在运行的应用程序: ● AppActivate ● CreateShortcut ● ExpandEnvironmentStrings ● LogEvent ● Popup ● RegDelete ● RegRead ● RegWrite ● Run ● SendKeys ● Exec AppActivate 这个方法可以用于激活一个指定的已经打开的应用程序窗口。 object.AppActivate title ● object:WshShell对象。 ● title:指定要激活的应用程序。这可以是一个包含应用程序标题的字符串(就像出现在标题栏中的那样)或应用程序的进程ID。 AppActivate方法返回一个 Boolean类型的值,标志着过程调用是否成功。这个方法用于将焦点切换至指定名称的应用程序或窗口。方法的调用不影响应用程序的最大化或最小化状态。当进行了切换焦点(或关闭窗口)的动作之后,焦点就会从已经获得焦点的应用程序上移走。 为了确定要激活的应用程序,指定的标题名称会与 每个正在运行的应用程序的标题字符串做比较。如果没有准确的匹配,那么具有以title所指定的值开始的标题字符串的应用程序就会被激活。如果还是没有能 找到合适的应用程序,那么具有以title所指定的值结束的标题字符串的应用程序就会被激活。如果存在多个名为title所指定的值的应用程序实例,就会任意激活其中的一个。但是,无法控制具体选择哪一个。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "calc" WScript.Sleep 100 WshShell.AppActivate "Calculator" WScript.Sleep 100 WshShell.SendKeys "1{+}" WScript.Sleep 500 WshShell.SendKeys "2" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 500 WshShell.SendKeys "*3" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 2500 </script> </job> </package> CreateShortcut 该方法可以用于创建一个新的快捷方式,或打开一个已有的快捷方式。 object.CreateShortcut(strPathname) ● object:WshShell对象。 ● strPathname:一个表示要创建的快捷方式的路径名。 CreateShortcut方法返回一个 WshShortcut对象或一个WshURLShortcut对象。调用CreateShortcut方法不会导致快捷方式的真正创建,而是将快捷方式 对象以及对其所做的修改保存在内存中,直到使用Save方法将其保存至磁盘。要真正创建一个快捷方式,必须完成下列三个步骤: ● 创建WshShortcut对象的一个实例。 ● 初始化其属性。 ● 使用Save方法将其保存到磁盘。 容易出问题的是将参数放到快捷方式对象的TargetPath属性中,这通常是无用的。快捷方式的所有参数都必须放在Arguments属性中。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & _ "/Shortcut Script.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut to Notepad" oShellLink.WorkingDirectory = strDesktop oShellLink.Save </script> </job> </package> ExpandEnvironmentStrings 该方法返回环境变量的扩充值。 object.ExpandEnvironmentStrings(strString) ● object:WshShell对象。 ● strString:一个字符串值,表示想要扩充的环境变量的名称。 这个方法只对PROCESS环境空间内定义的环境变量进行扩充。环境变量的名称必须以“%”包围,并且是大小写不敏感的。 set WshShell = WScript.CreateObject("WScript.Shell") WScript.Echo "The path to WinDir is " _ & WshShell.ExpandEnvironmentStrings("%WinDir%") LogEvent LogEvent方法向日志文件中添加一个事件条目。 object.LogEvent(intType, strMessage [,strTarget]) ● object:WshShell对象。 ● intType:表示事件类型的整数值。 ● strMessage:包含日志条目文本的字符串值。 ● strTarget:可选。一个字符串值,表示事件日志所存储的计算机系统名称(默认的是本地计算机系统)。只适用于Windows NT/2000/XP/Vista。 这个方法用于返回一个Boolean值(如果事 件被成功记录,就返回True,否则返回False)。在Windows NT/2000/XP/Vista中,事件被记录在Windows NT Event Log中。在Windows 9x/Me中,事件被记录在WSH.log(位于Windows目录)中。 有6种事件类型,如表15-6所示。 表15-6
下面的代码显示了LogEvent的运行,它基于事件的成功与否对其进行记录。 Set WshShell = WScript.CreateObject("WScript.Shell") 'assume that rS contains a return code 'from another part of the code if rS then WshShell.LogEvent 0, "Script Completed Successfully" else WshShell.LogEvent 1, "Script failed" end if Popup 该方法用于在弹出式消息框中显示文本。 intButton = object.Popup(strText,[nSecondsToWait],[strTitle],[nType]) ● object:WshShell对象。 ● strText:一个字符串值,包含了想要显示在弹出式消息框中的文本。 ● nSecondsToWait:可选。一个数值,表示想要弹出式消息框显示的最长时间(以秒为单位)。如果nSecondToWait等于0(默认值), 弹出式消息框就一直可见,直到被关闭。如果nSecondToWait大于0,那么弹出式消息框就在nSecondToWait秒后关闭。 ● strTitle:可选。一个字符串值,包含了想要出现在弹出式消息框标题栏中的文本。如果没有提供strTitle这个参数,弹出式消息框的标题就会被设置为默认的字符串“Windows Script Host”。 ● nType:可选。一个数值,表示想在弹出式消息框中出现的按钮和图标的类型。这些决定了消息框的使用场合和用途。nType的功能与Microsoft Win32应用程序编程接口中的MessageBox函数相同。下面的表格显示了各种值和它们的含义。可以合并列表中不同的值获得各种不同的结果。 ● IntButton:一个整数值,表示关闭消息框时单击的按钮的序号,这个值是由Popup方法返回的。 无论使用那种宿主可执行文件(wscript.exe或cscript.exe)运行脚本,都可以使用Popup方法显示一个消息框。 要以诸如HeBrew或Arabic这样的RTL语言的格式(从右至左)正确显示文本,可以在nType参数之前加上h00100000(十进制的1048576)。 按钮类型 见表15-7。 表15-7
图标类型 见表15-8。 表15-8
IntButton的返回值代表已单击的按钮编号。如果在nSecondsToWait秒之前没有单击任何按钮,inButton就被设置为-1. 表15-9列出了关闭消息框时所单击的按钮的编号。 表15-9
下面的代码显示了各种消息框按钮和图标的使用: Dim WshShell, BtnCode Set WshShell = WScript.CreateObject("WScript.Shell") BtnCode = WshShell.Popup("Do you like this code?", 7, "Quick survey:", 4 + 32) Select Case BtnCode case 6 WScript.Echo "Glad to hear it - Thanks!" case 7 WScript.Echo "I’m sorry you didn’t like it." case -1 WScript.Echo "Helllloooooooo?" End Select RegDelete 该方法从注册表中删除一个键或其键值。 object.RegDelete(strName) ● object:WshShell对象。 ● strName:一个字符串值,表示要删除的注册表键或键值的名称。 如果strName以反斜杠结尾,就可以指定键名,如果不使用反斜杠,就可以指定键值名。 完整的有效键名和键值名是以一个根键的名称作为前缀的。使用RegDelete方法时,也可以使用根键名的缩写形式。 表15-10列出了5种可能使用的根键。 表15-10
下面的脚本将创建、读取并删除Windows注册表键。高亮的部分是删除键的脚本。 Dim WshShell, bKey Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.RegWrite "HKCU/Software/WROX/VBScript/", 1, "REG_BINARY" WshShell.RegWrite "HKCU/Software/WROX/VBScript/ProgRef","VBS_is_great","REG_SZ" bKey = WshShell.RegRead("HKCU/Software/WROX/VBScript/") WScript.Echo WshShell.RegRead("HKCU/Software/WROX/VBScript/ProgRef") WshShell.RegDelete "HKCU/Software/WROX/VBScript/ProgRef" WshShell.RegDelete "HKCU/Software/WROX/VBScript/" WshShell.RegDelete "HKCU/Software/WROX/" 在修改注册表设置时,需要特别的小心。对注册表进行不当的修改可能会导致系统变得不稳定,甚至使其变得完全不可用。如果不了解注册表的内部工作机制,那么强烈建议在实际操作之前就此问题阅读一些相关的资料。 RegRead 该方法返回注册表中一个键或键值的名称。 object.RegRead(strName) ● object:WshShell对象。 ● strName:一个字符串值,表示想获得的键或键值的名称。 RegRead方法返回的值有5种类型(如表15-11所示)。 表15-11
如果strName以反斜杠结尾,就可以指定键名,如果不使用反斜杠,就可以指定键值名。 一个键值包含三部分: ● 名称(Name) ● 数据类型(Data Type) ● 值(Value) 如果指定了键名(相对于键值名来说),RegRead就会返回默认的值。所以要读取一个键的默认值,只要指定键的名称即可。 完整的有效键名和键值名是以一个根键的名称作为起始的。使用RegRead方法时,也可以使用根键名的缩写形式。表15-12列出了5种可能使用的根键。 表15-12
下面的脚本将创建、读取并删除Windows注册表键。高亮的部分是读取键的脚本。 Dim WshShell, bKey Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.RegWrite "HKCU/Software/WROX/VBScript/", 1, "REG_BINARY" WshShell.RegWrite "HKCU/Software/WROX/VBScript/ProgRef","VBS_is_great","REG_SZ" bKey = WshShell.RegRead("HKCU/Software/WROX/VBScript/") WScript.Echo WshShell.RegRead("HKCU/Software/WROX/VBScript/ProgRef") WshShell.RegDelete "HKCU/Software/WROX/VBScript/ProgRef" WshShell.RegDelete "HKCU/Software/WROX/VBScript/" WshShell.RegDelete "HKCU/Software/WROX/" RegWrtie 该方法可以创建一个新键,给现有键添加另一个键值名(并指定一个值),或修改现有键值名的值。 object.RegWrite(strName, anyValue [,strType]) ● object:WshShell对象。 ● strName:一个字符串值,表示想创建、添加或修改的键名、键值名或键值。 ● anyValue:想要创建的新键的名称,或想添加到现有键的键值名,或想指定给某个现有键值名的新键值。 ● strType:可选。一个表示键值数据类型的字符串。 如果strName以反斜杠结尾,就可以指定键名,如果不使用反斜杠,就可以指定键值名。 RegWrite方法自动将参数anyValue转换成一个字符串或一个整数,而由strType的值决定其数据类型(是字符串还是整数)。表15-13列出了strType方法的可用选项。 表15-13
RegWrite方法不支持REG_MULTI_SZ类型。 RegWrite最多写入一个DWORD或REG_BINARY值,该方法不支持更大的值。完整的有效键名和键值名是以一个根键的名称作为起始的。使用RegWrite方法时,也可以使用根键名的缩写形式。表15-14列出了5种可能使用的根键。 表15-14
strType的四种可能被指定的数据类型如表15-15所示。 表15-15
下面的代码显示了如何访问和修改Windows注册表: Dim WshShell, bKey Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.RegWrite "HKCU/Software/WROX/VBScript/", 1, "REG_BINARY" WshShell.RegWrite "HKCU/Software/WROX/VBScript/ProgRef","VBS_is_great","REG_SZ" bKey = WshShell.RegRead("HKCU/Software/WROX/VBScript/") WScript.Echo WshShell.RegRead("HKCU/Software/WROX/VBScript/ProgRef") WshShell.RegDelete "HKCU/Software/WROX/VBScript/ProgRef" WshShell.RegDelete "HKCU/Software/WROX/VBScript/" WshShell.RegDelete "HKCU/Software/WROX/" 在修改注册表设置时,需要特别的小心。对注册表进行不当的修改可能会导致系统变得不稳定,甚至使其变得完全不可用。如果不了解注册表的内部工作机制,那么强烈建议在实际操作之前就此问题阅读一些相关的资料。 Run Run方法在一个新进程中运行一个程序。 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn]) ● object:WshShell对象。 ● strCommand:一个字符串,表示想要运行的命令行,必须包含所有要传递给可执行文件的参数。 ● intWindowStyle:可选。一个整数值,表示程序窗口的外观。并不是所有的程序都使用这一信息。 ● bWaitOnReturn:可选。一个Boolean值,表示脚本在其下一条语句之前是否需要等待程序结束。如果设置为 True,脚本一直停止执行直到程序结束,Run返回任一个由程序返回的错误代码。如果设置为False(默认),程序启动后,Run方法立即返回0(这 不是错误代码)。 Run方法返回一个整数。该方法使用一个新的 Windows进程启动运行一个程序。可以让脚本等待程序运行完毕再继续执行,这样就可以是脚本和程序同步执行。如果将某个文件类型成功注册到某一个特定程序,那么对该文件调用Run方法就会启动注册的程序。例如,对一个*.txt文件调用Run方法,就会启动记事本程序并将文本文件加载到其中。表 15-16列出了intWindowStyle的可用值。 表15-16
下面的代码打开一个命令提示符窗口并显示驱动器C:的内容。 Dim oShell Set oShell = WScript.CreateObject ("WSCript.shell") oShell.run "cmd /K CD C:/ & Dir" Set oShell = Nothing SendKeys Sendkeys方法向活跃窗口发送一次或多次击键(仿佛来自键盘)。 object.SendKeys(string) ● object:WshShell对象。 ● string:一个字符串值,表示想要发送的击键。 使用SendKeys方法可以向没有内建的自动化接口的应用程序发送击键。多数键盘字符可由单个击键表示,但有些键盘字符是由击键的组合构成的(例如Alt+F4)。 要发送一个单独的键盘字符,只要将该字符本身作为字符串参数发送即可。例如,要发送字母“v”。要发送一个空格,可以发送“ ”。 也可以使用SendKeys方法发送多次击键。可以依次加入每次击键,形成一个序列,创建一个复合的字符串参数来表示击键的序列。例如,要发送击键x、y和z,可以发送字符串参数“xyz” SendKeys方法使用某些字符作为其他字符的限定符。这些特殊的字符包括圆括弧、尖括弧、花括弧,以及表15-17中列出的一些字符。 表15-17
要发送这些字符,可以将它们包含在一对花括弧“{}”中间。所以如果要发送加号,可以发送字符串参数“{+}”。 在SendKeys中使用方括弧“[]”时,没有什么特殊含义,但为了满足那些为它们指定了特殊含义的应用程序(例如Dynamic Data Exchange)的需要,仍需要将它们包含在花括弧中。 要发送方括弧字符,可以使用字符串数组“{[}”发送左括弧,使用字符串数组“{]}”发送右括弧。要发送花括弧字符,可以发送字符串参数“{{}”发送左括弧,发送字符串“{}}”发送右括弧。 某些击键不产生任何字符(如Enter和Tab),某些击键代表一些动作(如Backspace和Break)。要发送这些击键,可以发送表15-18中列出的这些字符串参数。 表15-18
(续表)
要发送常规字符与Shift、Ctrl或Alt键的组合,就需要创建一个复合的字符串参数以表示这种击键组合。可以在常规击键之前加上表15-19中的一个或多个特殊字符。 表15-19
当用做这种用途时,这些特殊字符不需要被包含在花括弧中。 要表示按下其他某些键的同时,必须按下Shift、Ctrl或Alt键的情况,可以修改圆括弧中包含的击键序列创建一个复合的字符串参数。例如下面这些击键以及相应的操作: ● 按下Shift的同时按下V和B,发送字符串参数“+(VB)”。 ● 按下Shift的同时按下V,然后长按B(不要按下Shift),发送字符串参数“+VB”。 可以使用SendKeys方法发送一个单独的击 键被按下若干次所构成的击键模式。可以创建一个复合的字符串参数,指定想要重复的击键,后面再跟上想要重复的次数。使用的复合字符串参数形如{击键 次数}。例如,要发送“V”被按下10次的击键模式,可以发送字符串参数“{V 10}”。 单个击键被按下若干次的模式是唯一的一种能够发送的击键模式。例如,可以发送10次“V”,但不能发送10次“Ctrl+V”。注意,不能向应用程序发送Print Screen键{PRTSC}。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run "calc" WScript.Sleep 100 WshShell.AppActivate "Calculator" WScript.Sleep 100 WshShell.SendKeys "1{+}" WScript.Sleep 500 WshShell.SendKeys "2" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 500 WshShell.SendKeys "*9" WScript.Sleep 500 WshShell.SendKeys "~" WScript.Sleep 2500 </script> </job> </package> Exec Exec方法在一个子命令解释器中运行一个应用程序,子命令解释器提供对StdIn、StdOut和StdErr流的访问。 object.Exec(strCommand) ● object:WshShell对象。 ● strCommand:一个字符串值,表示用于运行脚本的命令行。 Exec方法返回一个WshScriptExec对象,该对象提供使用Exec运行的脚本的状态和错误信息,也提供对StdIn、StdOut和StdErr通道的访问。Exec方法只能执行命令行应用程序,并且不能用于运行远程脚本。 15.6.4 WshNamed对象 WshNamed对象提供从命令行中对有名称参数的访问。 WshArguments对象的Named属性返回WshNamed对象,这是一个有名称参数的集合。这个集合使用了参数名称作为索引来获取每个参数的值。访问命令行参数集合有下列三种方法: ● 使用WshAruments对象访问整个参数集合。 ● 使用WshNamed对象访问有名字的参数。 ● 使用WshUnnamed对象访问没有名字的参数。 1. 访问WshNamed对象 该对象的访问是通过创建WScript.Named对象的实例实现的。 Set argsNamed = WScript.Arguments.Named 2. WshNamed对象的属性 WshNamed对象具有两个属性: ● Item ● Length Item Item属性提供了对WshNamed对象中的项目的访问。 Object.Item(key) ● object:WshNamed对象。 ● key:想要获取的项目名称。 Item属性返回一个字符串。对于集合来说,它根据给定的关键字返回一个项目。在命令行中输入参数时,可以在字符串中使用空格,只要将其包含在引号中即可。下面这行代码可以用于在命令提示符下运行脚本: sample.vbs /a:arg1 /b:arg2 如果脚本中包含下面的代码。 WScript.Echo WScript.Arguments.Named.Item("b") WScript.Echo WScript.Arguments.Named.Item("a") 就会产生这样的输出结果。 arg2 arg1 Length Length属性是一个只读的整数,可以在编写Jscript脚本时使用。同样地,这个属性不在本书的讨论范围之内。 3. WshNamed对象的方法 WshNamed对象具有两个方法: ● Count ● Exists Count Count方法返回WshNamed或WshUnnamed对象的选项开关个数。 object.Count ● object:WshNamed对象。 Count方法用于返回一个整数值。该方法是给VBScript用户使用的,JScript用户应该使用length属性。 For x = 0 to WScript.Arguments.Count-1 WScript.Echo WScript.Arguments.Named(x) Next x Exists Exists方法可以用于确定某一给定的键值是否存在于WshNamed对象中。 object.Exists(key) ● object:WshNamed对象。 ● key:字符串值,表示WshNamed对象的一个参数。 这个方法返回一个Boolean值。如果请求的参数的确在命令行中被指定,就返回True(否则返回False)。在命令提示符中输入下面的代码运行脚本: sample.vbs /a:arg1 /b:arg2 下面的代码可以用于确定是否使用了参数/a、/b和/c: WScript.Echo WScript.Arguments.Named.Exists("a") WScript.Echo WScript.Arguments.Named.Exists("b") WScript.Echo WScript.Arguments.Named.Exists("c") 15.6.5 WshUnnamed对象 WshUnnamed对象提供了从命令行中对未命名对象的访问。它是一个由WshAruments对象的Unnamed属性返回的只读集合。从该集合中获取单个参数值时,使用由0开始的索引。 访问命令行参数集合有下列三种方法: ● 使用WshAruments对象访问整个参数集合。 ● 使用WshNamed对象访问有名字的参数。 ● 使用WshUnnamed对象访问没有名字的参数。 1. 访问WshUnnamed对象 该对象的访问是通过创建WScript.Arguments.Unnamed对象的实例实现的。 Set argsUnnamed = WScript.Arguments.Unnamed 2. WshUnnamed对象的属性 WshUnnamed对象具有两个属性: ● Item ● Length 这两个属性和WshNamed的类似,这里就不再重复介绍。 3. WshUnnamed对象的方法 WshUnnamed对象具有一个方法: ● Count 这个方法和WshNamed的类似,这里就不再重复介绍。 15.6.6 WshNetwork对象 WshNetwork对象提供对计算机所连接的网络上共享资源的访问。如果想连接到网络共享或网络打印机,从网络共享或网络打印机断开连接,映射或删除网络共享,或访问网络上某一用户的信息,都需要创建一个WshNetwork对象。 1. 访问WshNetwork对象 该对象的访问是通过创建WScript.Network对象的实例实现的。 Set WshNetwork = WScript.CreateObject("WScript.Network") 2. WshNetwork对象的属性 WshNetwork对象具有三个属性: ● ComputerName ● UserDomain ● UserName ComputerName ComputerName属性返回计算机系统的名称。 object.ComputerName ● object:WshNetwork对象。 ComputerName属性包含一个字符串值,表示计算机系统的名称。 <package> <job id="vbs"> <script language="VBScript"> Set WshNetwork = WScript.CreateObject("WScript.Network") WScript.Echo "Domain = " & WshNetwork.UserDomain WScript.Echo "Computer Name = " & WshNetwork.ComputerName WScript.Echo "User Name = " & WshNetwork.UserName </script> </job> </package> UserDomain UserDomain属性返回用户的域名。 object.UserDomain ● object:WshNetwork对象。 UserDomain属性在Windows 98和Windows Me下不可用,除非设置了USERDOMAIN环境变量。这个变量默认情况下是没有被设置的。 <package> <job id="vbs"> <script language="VBScript"> Set WshNetwork = WScript.CreateObject("WScript.Network") WScript.Echo "Domain = " & WshNetwork.UserDomain WScript.Echo "Computer Name = " & WshNetwork.ComputerName WScript.Echo "User Name = " & WshNetwork.UserName </script> </job> </package> UserName UserName属性返回某个用户的名称。 object.UserName ● object:WshNetwork对象。 UserName属性以字符串返回一个用户的名称。 <package> <job id="vbs"> <script language="VBScript"> Set WshNetwork = WScript.CreateObject("WScript.Network") WScript.Echo "Domain = " & WshNetwork.UserDomain WScript.Echo "Computer Name = " & WshNetwork.ComputerName WScript.Echo "User Name = " & WshNetwork.UserName </script> </job> </package> 3. WshNetwork的方法 WshNetwork对象有下列8个方法可用: ● AddWindowsPrinterConnection ● AddPrinterConnection ● EnumNetworkDrives ● EnumPrinterConnection ● MapNetworkDrive ● RemoveNetworkDrive ● RemovePrinterConnection ● SetDefaultPrinter AddWindowsPrinterConnection AddWindowsPrinterConnection方法在计算机系统中添加一个Windows打印机连接。 ● Windows NT/2000/XP/Vista: object.AddWindowsPrinterConnection( strPrinterPath ) ● Windows 9x/Me: object.AddWindowsPrinterConnection( strPrinterPath, strDriverName[,strPort] ) · object:WshNetwork对象。 · strPrinterPath:一个字符串值,表示打印机连接的路径。 · strDriverName:一个字符串值,表示驱动器的名称(在Windows NT/2000/XP中忽略此参数)。 · strPort:可选。一个字符串值,为打印机连接指定一个打印机端口(在Windows NT/2000/XP系统中忽略此参数)。 ● 使用这个方法添加一个打印机连接和使用控制面板中的Printer选项是非常类似的。这个方法允许创建一个打印机连接,并且能够很方便地将其定向到某一特定端口。 ● 如果连接失败,就会产生一个错误。 Set WshNetwork = WScript.CreateObject("WScript.Network") PrinterPath = "//printerserver/DefaultPrinter" WshNetwork.AddWindowsPrinterConnection PrinterPath AddPrinterConnection AddPrinterConnection方法在计算机系统中添加一个远程打印机连接。 object.AddPrinterConnection(strLocalName, strRemoteName[,bUpdateProfile][,strUser][,strPassword]) ● object:WshNetwork。 ● strLocalName:一个字符串值,表示指派给以连接打印机的本地名称。 ● strRemoteName:一个字符串值,表示远程打印机的名称。 ● bUpdateProfile:可选。一个Boolean值,表示打印机映射是否被存储到当前用户的参数文件中。如果提供了bUpdateProfile参数并且值为True,打印机映射就会被存储到用户参数文件中。默认值为False。 ● strUser:可选。一个字符串值,表示用户名。如果使用某个其他用户,而非当前用户的参数文件映射一个远程的打印机,就可以指定strUser和strPassword。 ● strPassword:可选。一个字符串值,表示用户的密码。如果使用某个其他用户,而非当前用户的参数文件映射一个远程的打印机,就可以指定strUser和strPassword。 EnumNetworkDrives EnumNetworkDrives方法返回当前网络驱动器的映射信息。 objDrives = object.EnumNetworkDrives ● object:WshNetwork对象。 ● objDrives:一个变量,保存网络驱动器的映射信息。 这个方法返回一个集合,它是一个由关联项目对(网络驱动器本地名称与其关联的UNC(Universal Naming Convention,通用命名规范)名称)构成的数组。集合中的偶数元素表示逻辑驱动器的本地名称,而奇数元素表示其关联的UNC共享名。 集合中的第一个元素的索引是0。 EnumPrinterConnection EnumPrinterConnection方法返回当前网络打印机的映射信息。 objPrinters = object.EnumPrinterConnections ● object:WshNetwork对象。 ● objPrinters:保存网络打印机的映射信息的变量。 EnumPrinterConnection方法返回一个集合,它是一个由关联项目对(网络打印机本地名称与其关联的UNC(Universal Naming Convention,通用命名规范)名称)构成的数组。集合中的偶数元素表示打印机端口,而奇数元素表示网络打印机的UNC名称。 集合中的第一个元素的索引是0。 MapNetworkDrive MapNetworkDrive方法在计算机系统中添加一个共享网络驱动器。 object.MapNetworkDrive(strLocalName, strRemoteName, [bUpdateProfile], [strUser], [strPassword]) ● object:WshNetwork对象。 ● strLocalName:一个字符串值,表示被映射驱动器在本地的名称。 ● strRemoteName:一个字符串值,表示共享的UNC名称(//xxx/yyy)。 ● bUpdateProfile:可选。一个Boolean值,表示映射信息是否被存储到当前用户的参数文件中。如果提供了bUpdateProfile参数并且值为True,映射信息就会被存储到用户参数文件中。默认值为False。 ● strUser:可选。一个字符串值,表示用户名。如果使用某个其他用户,而非当前用户的凭证映射一个网络驱动器,就必须指定这个参数。 ● strPassword:可选。一个字符串值,表示用户的密码。如果使用某个其他用户,而非当前用户的凭证映射一个网络驱动器,就必须指定这个参数。 如果试图映射一个非共享的网络驱动器,就会导致一个错误。 RemoveNetworkDrive RemoveNetworkDrive方法在计算机系统中删除一个共享的网络驱动器。 object.RemoveNetworkDrive(strName, [bForce], [bUpdateProfile]) ● object:WshNetwork对象。 ● strName:一个字符串值,表示想要删除的已映射驱动器名称。strName参数既可以是一个本地名称,也可以是远程名称,这取决对于驱动器映射的方式。 ● bForce:可选。一个Boolean值,表示是否强制删除已映射的驱动器。如果指定了bForce参数并且其值为True,那么无论资源是否正在被使用,该方法都会删除连接。 ● bUpdateProfile:可选。一个Boolean值,表示是否从用户参数文件中删除映射信息。如果指定了bUpdateProfile参数并且其值为True,就会从用户参数文件中删除映射信息。bUpdateProfile默认值为False。 如果某驱动器存在从本地名称(驱动器字母)到远程名称(UNC名称)的映射,strName就必须被设置为本地名。如果网络路径没有本地名称映射,strName就必须被设置为远程名称。下面的脚本删除网络驱动器“G:”。 Dim WshNetwork Set WshNetwork = WScript.CreateObject("WScript.Network") WshNetwork.RemoveNetworkDrive "G:" RemovePrinterConnection RemovePrinterConnection方法在计算机系统中删除一个共享的网络打印机连接。 object.RemovePrinterConnection(strName, [bForce], [bUpdateProfile]) ● object:WshNetwork对象。 ● strName:一个字符串值,表示打印机的标识名称。它可以是一个UNC名称(格式为//xxx/yyy)或者一个本地名称(如LPT1)。 ● bForce:可选。一个Boolean值,表示是否强制删除已映射的打印机。如果指定了bForce参数并且其值为True,那么无论是否有用户正在连接,该方法都会删除打印机连接。 ● bUpdateProfile:可选。一个Boolean值,如果设置为True(默认是False),所做的更改保存到用户参数文件中。 RemovePrinterConnection方法将同时删除基于Windows和基于DOS的打印机连接。 如果打印机是使用AddPrinterConnection方法连接的,strName就必须是打印机的本地名称。 如果打印机是使用AddWindowsPrinterConnection方法或手工连接的,strName就必须是打印机的UNC名称。 SetDefaultPrinter SetDefaultPrinter方法将某个远程打印机指定为默认打印机。 object.SetDefaultPrinter(strPrinterName) ● object:WshNetwork对象。 ● strPrinterName:一个字符串值,表示远程打印机的UNC名称。 使用基于DOS的打印机连接时,SetDefaultPrinter方法调用将失败。此外,也不能使用SetDefaultPrinter方法确定当前已安装的默认打印机名称。 15.6.7 WshEnvironment对象 WshEnvironment对象提供对Windows环境变量集合的访问。 这个对象是一个由WshShell对象的Environment属性返回的环境变量集合。该集合包含全部的环境变量(包括有名称的和没有名称的)。 要获取集合中某个具体的环境变量(及其值),可以使用环境变量名作为索引。 1. 访问WshEnvironment对象 该对象的访问是通过创建WScript.Environment对象的实例实现的。下面的脚本返回运行脚本的系统中安装的处理器个数: Set WshShell = WScript.CreateObject("WScript.Shell") Set WshSysEnv = WshShell.Environment("SYSTEM") WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS") 2. WshEnvironment对象的属性 WshEnvironment对象具有两个属性: ● Item ● Length Item Item属性公开集合中的某一指定元素。 Object.Item(natIndex) ● object:EnumNetworkDrive或numPrinterConnections方法的返回值,或由Environment或SpecialFolders属性返回的对象。 ● natIndex:设置要获取的元素。 Item是每个集合的默认属性。对于EnumNetworkDrive和EnumPrinterConnections集合来说,索引是一个整数,但对于Environment和SpecialFolders来说,索引是一个字符串。 在VBScript中,如果请求的文件夹(strFolderName)不存在,WshShell.SpecialFolders.Item (strFolderName)将返回“Empty”。 <package> <job id="vbs"> <script language="VBScript"> Set WshShell = WScript.CreateObject("WScript.Shell") Set WshSpecialFolders = WshShell.SpecialFolders For x = 0 To WshSpecialFolders.Count - 1 WScript.Echo WshSpecialFolders.Item(x) Next </script> </job> </package> Length Length属性是一个只读的整数,可以在编写Jscript脚本时使用。同样地,这个属性不在本书的讨论范围之内。 3. WshEnvironment对象的方法 WshEnvironment对象具有两个方法: ● Count ● Remove Count Count方法返回一个Long值,表示集合中元素的个数。 object.Count ● object:Arguments对象 Count方法返回一个整数值。该方法是给VBScript用户使用的,JScript用户应该使用Length属性。 For x = 0 to WScript.Arguments.Count-1 WScript.Echo WScript.Arguments.Named(x) Next x Remove Remove方法删除一个现有的环境变量。 object.Remove(strName) ● object:WshEnvironment对象。 ● strName:一个字符串值,表示要删除的环境变量的名称。 Remove方法删除下列类型的环境变量: ● PROCESS ● USER ● SYSTEM ● VOLATILE 使用Remove方法删除的环境变量将在当前会话结束后被恢复。 Dim WshShell, WshEnv Set WshShell = WScript.CreateObject("WScript.Shell") Set WshEnv = WshShell.Environment("PROCESS") WshEnv("tVar") = "VBScript is Cool!" WScript.Echo WshShell.ExpandEnvironmentStrings("The value of the test variable is: '%tVar%’") WshEnv.Remove "tVar" WScript.Echo WshShell.ExpandEnvironmentStrings("The value of the test variable is: '%tVar%’") 15.6.8 WshSpecialFolders对象 WshSpecialFolders对象提供对Windows特殊文件夹集合的访问。 WshShell对象的SpecialFolder属性返回WshSpecialFolders对象。该集合包含对Windows特殊文件夹(例如,Desktop文件夹和Start menu文件夹)的引用。 从这个集合中可以使用某特殊文件夹的名称作为索引获取该文件夹的路径。一个特殊文件夹的路径依赖于用户环境。如果一台计算机上有多个用户,那么硬盘上就存有若干组特殊文件夹。下面列出了可用的特殊文件夹: ● AllUsersDesktop ● AllUsersPrograms ● AllUsersStartMenu ● AllUsersStartup ● Desktop ● Favorites ● Fonts ● MyDocuments ● NetHood ● PrintHood ● Programs ● Recent ● SendTo ● StartMenu ● Startup ● Templates 下面的代码演示了如何在Windows桌面上创建Windows Notepad的一个快捷方式: <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut Script.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "A Script Generated Shortcut to Notepad" oShellLink.WorkingDirectory = strDesktop oShellLink.Save </script> </job> </package> 1. WshSpecialFolders对象的属性:Item WshSpecialFolders对象具有一个属性: ● Item Item属性暴露集合中某一指定的元素。 Object.Item(natIndex) ● Object:EnumNetworkDrive或EnumPrinterConnections方法的返回结果,或Environment 或SpecialFolders属性返回的对象。 ● natIndex:设置想要获取的元素。 Item是每个集合都有的默认属性。对于EnumNetworkDrive和EnumPrinterConnections集合来说,索引是整数,但对于Environment和SpecialFolders集合来说,索引是字符串。 <package> <job id="vbs"> <script language="VBScript"> Set WshShell = WScript.CreateObject("WScript.Shell") Set WshSpecialFolders = WshShell.SpecialFolders For x = 0 To WshSpecialFolders.Count - 1 WScript.Echo WshSpecialFolders.Item(x) Next </script> </job> </package> 2 WshSpecialFolders对象的方法:Count WshSpecialFolders对象具有一个方法: ● Count Count方法返回WshNamed对象或WshUnnamed对象的开关数。 object.Count ● object:Arguments对象。 Count方法返回一个整数值。Count方法适用于VBScript用户,JScript用户应该使用Length属性。 15.6.9 WshShortcut对象 WshShortcut对象允许您使用脚本创建快捷方式。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut Script.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save </script> </job> </package> 1. WshShortcut对象的属性 WshShortcut对象具有8个属性: ● Arguments ● Description ● FullName ● Hotkey ● IconLocation ● TargetPath ● WindowStyle ● WorkingDirectory Arguments Arguments属性包含WshArguments对象(一个参数集合)。从该集合中获取单个参数值时,使用由0开始的索引。 Set objArgs = WScript.Arguments For x = 0 to objArgs.Count - 1 WScript.Echo objArgs(x) Next Description Description属性返回快捷方式的描述信息。 object.Description1 ● Object:WshShortcut对象。 Description属性包含一个描述快捷方式的字符串值。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut Script.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Script generated shortcut to Notepad" oShellLink.WorkingDirectory = strDesktop oShellLink.Save </script> </job> </package> FullName FullName属性返回快捷方式对象目标的有效完整路径。 object.FullName ● Object:WshShortcut对象。 FullName属性包含一个只读字符串,给出了快捷方式目标的有效完整路径。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut Script.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save WScript.Echo oShellLink.FullName </script> </job> </package> HotKey HetKey属性用于给快捷方式指定一个热键,或识别快捷方式的热键。一个快捷方式的热键是指一些按键的组合,当同时按下这些按键时,就会启动该快捷方式。 object.Hotkey = strHotkey ● Object:WshShortcut对象。 ● strHotkey:一个字符串,表示指定给快捷方式的热键。 下面是strHotkey的语法: [KeyModifier]KeyName ● KeyModifier:KeyModifier可以是这些键之一:Alt+、Ctrl+、Shift+、Ext+。 Ext+指的是“扩展键”。这个键的加入是为了将来可能会在字符集中加入一类新的Shift键。 KeyName- a ... z, 0 ... 9, F1 ... F12, ... KeyName是大小写不敏感的。 修改前面的代码,添加一个热键,如下。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save WScript.Echo oShellLink.FullName </script> </job> </package> IconLocation IconLocation属性用于给快捷方式指定一个图标,或识别快捷方式的图标。 object.IconLocation = strIconLocation ● Object:WshShortcut对象。 ● strIconLocation:一个字符串,指定要使用的图标。该字符串应该包含图标的一个有效的完整路径,以及该图标所关联的一个索引。如果有多个图标,可以使用索引选择其中的一个。索引起始于0。 修改先前的代码,给快捷方式指定一个标准的Notepad图标。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save WScript.Echo oShellLink.FullName </script> </job> </package> TargetPath TargetPath属性给出了快捷方式执行文件的路径。 object.TargetPath ● Object:WshShortcut或WshUrlShortcut对象。 这个属性只用于快捷方式的目标路径,其他所有的参数必须放在Argument的属性中。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/Shortcut Script.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save WScript.Echo oShellLink.FullName </script> </job> </package> WindowsStyle Windowstyle属性用于指定快捷方式的窗口类型,或识别快捷方式所使用的窗口类型。 object.WindowStyle = intWindowStyle ● Object:WshShortcut对象。 ● intWindowStyle:设置程序执行窗口的类型。 WindowStyle属性返回一个整数。 表15-20列出了intWindowStyle的可用值。 表15-20
下面代码中的改动保证Notepad窗口处于活跃状态。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save WScript.Echo oShellLink.FullName </script> </job> </package> WorkingDirectory WorkingDirectory属性用于指定快捷方式的工作目录,或识别快捷方式所使用的工作目录。 object.WorkingDirectory = strWorkingDirectory ● Object:WshShortcut对象。 ● strWorkingDirectory:一个字符串,表示快捷方式的起始目录。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") strDesktop = WshShell.SpecialFolders("Desktop") set oShellLink = WshShell.CreateShortcut(strDesktop & "/ShortcutScript.lnk") oShellLink.TargetPath = WScript.ScriptFullName oShellLink.WindowStyle = 1 oShellLink.Hotkey = "CTRL+SHIFT+N" oShellLink.IconLocation = "notepad.exe, 0" oShellLink.Description = "Shortcut Script" oShellLink.WorkingDirectory = strDesktop oShellLink.Save WScript.Echo oShellLink.FullName </script> </job> </package> 2. WshShortcut对象的方法 WshShortcut对象具有一个方法: ● Save Save方法将一个快捷方式保存到磁盘。 object.Save ● Object:WshShortcut或WshUrlShortcut对象。 使用CreateShortcut方法创建一个快捷方式并设置该快捷方式对象的属性后,可以使用Save方法将该快捷方式对象保存到硬盘上。Save方法使用快捷方式对象的FullName属性中的信息确定在硬盘上保存快捷方式对象的位置。 只能对系统对象创建快捷方式—— 文件、目录和磁盘驱动器。不能为打印机或调度任务创建快捷方式。 15.6.10 WshUrlShortcut对象 WshUrlShortcut对象允许您使用脚 本创建到Internet资源的快捷方式。该对象是WshShell对象的子对象。必须使用WshShell方法的CreateShortcut来创建 WshUrlShortcut对象。下面的代码可以保存为一个后缀名为.wsf的Windows脚本文件。 WshShell.CreateShortcut(strDesktop & "/URLShortcut.lnk") <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url") oUrlLink.TargetPath = "http://www." oUrlLink.Save </script> </job> </package> 1. WshUrlShortcut对象的属性 WshUrlShortcut对象具有两个属性: ● FullName ● TargetPath FullName FullName属性返回快捷方式对象目标的有效完整路径。 object.FullName ● Object:WshUrlShortcut对象。 FullName属性包含一个只读的字符串,给出快捷方式目标的有效的完整路径。下面的代码可以保存为一个后缀名为.wsf的Windows脚本文件。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url") oUrlLink.TargetPath = "http://www." oUrlLink.Save WScript.Echo oUrlLink.FullName </script> </job> </package> TargetPath TargetPath属性给出了快捷方式可执行文件的路径。 object.TargetPath ● Object:WshUrlShortcut对象。 这个属性只用于快捷方式的目标路径,其他所有的参数必须放在Argument的属性中。下面的代码可以保存为一个后缀名为.wsf的Windows脚本文件。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url") oUrlLink.TargetPath = "http://www." oUrlLink.Save WScript.Echo oUrlLink.FullName </script> </job> </package> 2. WshUrlShortcut对象的方法 WshUrlShortcut对象具有一个方法: ● Save Save方法将快捷方式对象保存到磁盘。 object.Save ● Object:WshUrlShortcut对象。 使用CreateShortcut方法创建一个 快捷方式并设置该快捷方式对象的属性后,可以使用Save方法将该快捷方式对象保存的硬盘上。Save方法使用快捷方式对象的FullName属性中的信 息确定在硬盘上保存快捷方式对象的位置。下面的代码可以保存为一个后缀名为.wsf的Windows脚本文件。 <package> <job id="vbs"> <script language="VBScript"> set WshShell = WScript.CreateObject("WScript.Shell") set oUrlLink = WshShell.CreateShortcut(strDesktop & "/Wrox Web Site.url") oUrlLink.TargetPath = "http://www." oUrlLink.Save WScript.Echo oUrlLink.FullName </script> </job> </package> 15.2 WSH的概念 WSH是一个Windows管理工具。WSH创建了一个脚本运行的主环境,当脚本到达一台计算机时,WSH扮演主人的角色。WSH使脚本能够使用对象和服务,并提供脚本执行的准则。此外,WSH还负责安全管理以及调用适当的脚本引擎。 因为WSH是与脚本语言无关的,所以它还提供了 使用JScript、Perl、Python、REXX,或其他ActiveX脚本编写语言(只有VBScript和JScript是Microsoft 提供的,其他ActiveX脚本引擎是由第三方提供的)进行脚本编写的机制。WSH提供了一些非常便于使用的工具,可以访问散布在网络中,运行各种风格的 Windows操作系统的机器,从而提供了网络管理的能力。这种访问大部分是通过活动目录服务接口(Active Directory Service Interface,ADSI)和Windows管理规范(Windows Management Instrumentation,WMI)实现的。ADSI提供了一套COM接口,可以用于多种目录服务,如轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)、Windows NT目录服务,以及Novell的Netware和NDS服务。WMI是Microsoft基于Web的企业管理(Web-Based Enterprise Management,WBEM)的实现,这种标准的方法可以访问管理信息,如指定的客户端上安装的应用程序、系统内存,以及其他客户端信息。 通过开发使用ADSI和WMI的WSH脚本,系统管理员可以开发脚本以便执行下面列出的这些以及其他更多任务: ● 访问并操作服务器 ● 添加或删除用户以及修改密码 ● 添加网络文件共享 目前的WSH版本是5.7,它是随Windows Vista一起发布的。该版本相对于先前的版本(2.0)来说具有很多显著的变化。目前发布的WSH包含了大量深受程序员喜爱的功能: ● 支持文件包含 ● 能够在同一脚本中使用多种语言 ● 支持拖放功能 ● 参数处理 ● 可以远程运行脚本 ● 增强对外部对象和类型库的访问 ● 更强的调试功能 ● 暂停脚本执行的机制(对于接收受控对象产生的事件来说非常有用) ● 标准的输入/输出以及标准的错误支持(只有在控制台模式下运行cscript.exe时才有用) ● 可以将新的进程作为对象来对待 ● 对当前工作目录的访问 ● 新改进的安全模型 随Windows Vista发布的版本5.7中包括针对版本5.6的bug和安全性修正。 WSH 1.0的运行机制比较简单,只是为VBScript的文件扩展名(.vbs)和JScript的文件扩展名(.js)关联相应的脚本宿主。这意味着如果双击一个脚本文件,就会自动执行它。但是,这有一个很重要的局限—— 关联模式不允许使用代码模块,也不允许在一个WSH脚本项目中使用多种脚本语言。为了满足各种程序员的需要,Microsoft在WSH 2.0中引入了一种新的脚本文件类型(.wsf),它利用一种XML语法提供前面所提到的很多新的功能。 这种新的机制在其他的标记中包含了<script>标记、<object>标记和<job>标记。在这一章后面的部分中,我们将介绍具体的运行机制。 文件扩展名.wsf只在最后发布的WSH 2.0以及以后的版本中才有效。还在使用WSH 2.0 beta版本的开发人员仍然必须使用.ws文件扩展名。作者建议使用最新的脚本引擎和WSH。 15.3 脚本文件的类型 独立的脚本文件有一些不同的格式,每种格式都有 自己的扩展名。表15-1中列出了一些常见的类型。最终选择的脚本类型将依赖于需求。多数小项目只需要使用一种文件类型,但在某些情况下可能需要将整个问题分割成若干个小的部分,为每一部分分别编写脚本,并且每一部分的脚本都使用最合适的语言进行编写。 表15-1
(续表)
这就是Windows脚本宿主文件(WSF文件)的有用之处。WSF文件可以包含其他的脚本文件作为其脚本的一部分。这意味着多个WSF文件可以引用创建并保存在同一地点的库和有用的函数。 5.4 使用Windows脚本宿主运行脚本 WSH提供了两个用于执行脚本的接口,一个用于命令行,一个用于Windows环境。这两个接口各使用不同的宿主程序作为VBScript引擎: ● cscript.exe:用于在命令行中运行脚本 ● wscript.exe:用于在Windows环境中运行脚本 之所以有两个宿主程序,是因为cscript.exe被设计为从控制台窗口启动(一般来说是Windows中的MS-DOS窗口),而wscript.exe则用于直接与Windows GUI进行交互。这两者就功能来讲几乎没有区别。 15.4.1 命令行执行 执行脚本文件的命令行界面,cscript.exe调用方法如下: 1. 打开Run对话框(按下窗口键+R)或某个命令窗口(在Windows 9x中,可以依次单击Start|Programs|DOS Prompt;在Windows NT中,依次单击Start|Programs|Command Prompt;在Vista/XP中,依次单击Start|All Programs|Accessories|Command Prompt)。 注意,在使用Windows Vista时,打开Command Prompt需要系统管理员权限。最简单的方法是以系统管理员身份在开始菜单中用鼠标右键单击Command Prompt并选择Run。 2. 执行脚本如下: cscript c:/folderName/YourScriptName.vbs 如果直接在命令行中运行cscript.exe时不加参数,就只会得到使用帮助信息,如图15-1所示。 图15-1 使用语法如下: cscript scriptname.extension [option...] [arguments...] cscript.exe提供了如表15-2中所列的命令行选项,可以用来控制各种WSH环境设置。 表15-2
可以在命令行中以开关的形式增加这些选项以便使用它们。下面的示例在调试器中执行一个脚本。 cscript MyScript.vbs //X 15.4.2 在Windows环境中执行WSH 执行脚本文件的Windows GUI界面是wscript.exe,它允许以下列几种方式执行文件: ● 如果文件的类型注册为在WSH中执行,就可以直接在文件夹窗口或桌面上双击这些文件的图标来执行。 ● 如果使用Run命令对话框,那么就只要输入脚本的完整路径和名称即可。 在Run命令对话框中,可以调用wscript.exe。 wscript c:/folderName/YourScriptName.vbs 如果在命令行提示符下运行wscript.exe,就不会有输出信息,而是会出现一个如图15-2所示的对话框。该对话框提供了最基本的定制选项。如果在Run命令对话框中运行wscript.exe,也会出现相同的对话框。 图15-2 单击OK按钮后,将不会有任何反应。在系统级定制脚本行为的唯一方法就是使用先前曾详细介绍的cscript选项。使用.wsh文件实现的每个脚本的独立定制将使用该对话框来完成,这在稍后会介绍。 那么这两种运行脚本的方法之间有什么区别呢?当 调试一个出错脚本时,cscript和wscript之间的主要区别实际上变得更明显了。这是因为,相对于wscript可能产生的没完没了的弹出窗口来说,向一个控制台窗口发送错误消息显得更快更容易。在调试脚本时,推荐使用cscript,而在打印调试输出结果时,最好使用WScript对象的 Echo方法,因为调试时能产生大量的需要关注的错误信息。实际上,有时可能使调试者陷入循环,无法从错误消息中摆脱出来。 15.5 使用.WSH文件运行脚本 有时也许不想或不需要在每次执行脚本时都修改设 置,但又有可能需要控制单个的文件,这一点可以通过创建控制文件来实现。控制文件的扩展名为.wsh,用于控制单个脚本的设置。.wsh文件是短小的配置 文件,它大体上遵循以前的Windows所使用的.ini文件格式(但这并不是说有程序员已经不再使用类似于.ini文件的配置文件了)。.wsh文件非常便于定制脚本的启动—— 一个脚本可以使用多个不同的.wsh文件。 要创建一个.wsh文件,可以用鼠标右键单击一个与WSH关联的文件(一般带有.js、.vbs或.wsf的扩展名),然后选择Properties,在图15-3所示的对话框中选择Script标签页。 图15-3 这个对话框可以用于修改超时时间的默认设置,也 可以修改在命令行中运行脚本时,是否显示logo信息。一旦应用或接受了所做的修改,就会创建一个新的文件,文件名与所处理的脚本文件相同,只是扩展名为.wsh。这个新的文件记录了定制的设置,其格式可以被宿主引擎设置运行时选项。这里给出一个从脚本test.vbs创建的一个.wsh文件。 [ScriptFile] Path=C:/test.vbs [Options] Timeout=25 DisplayLogo=0 要使用这些选项执行脚本,就应该运行test.wsh文件。 转摘源地址:http://wenku.baidu.com/view/5d23660203d8ce2f006623af.html |
|