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
WSH引擎 |
文 本 输 出 |
Wscript.exe |
图形消息框 |
Cscript.exe |
命令控制台窗体 |
图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
环境变量类型 |
操 作 系 统 |
System |
Microsoft Windows NT/2000/XP/Vista |
Process |
Windows 95/98/Me |
对于Windows 95/98/Me,仅仅同意一种strType:Process。其它类型不同意在脚本中使用。
表15-5列出了Windows操作系统提供的一些变量。
表15-5
名 称 |
描 述 |
System |
User |
Process(NT/2000/XP/Vista) |
Process(95/98/Me) |
NUMBER_OF _PROCESSORS |
机器中执行的处理器个数 |
x |
- |
X |
- |
PROCESSOR _ARCHITECTURE |
用户工作站的处理器类型 |
x |
- |
X |
- |
PROCESSOR _IDENTIFIER |
用户工作站的处理器ID |
x |
- |
X |
- |
PROCESSOR _LEVEL |
用户工作站的处理器等级 |
x |
- |
X |
- |
PROCESSOR _REVISION |
用户工作站的处理器版本号 |
x |
- |
X |
- |
OS |
用户工作站的操作系统 |
x |
- |
X |
- |
COMSPEC |
用户工作站的操作系统 |
- |
- |
X |
x |
HOMEDRIVE |
主逻辑驱动器(一般是C盘) |
- |
- |
X |
- |
HOMEPATH |
用户的默认文件夹 |
- |
- |
X |
- |
PATH |
Path环境变量 |
x |
x |
X |
x |
(续表)
名 称 |
描 述 |
System |
User |
Process(NT/2000/XP/Vista) |
Process(95/98/Me) |
PATHEXT |
可运行文件的扩展名(通常是.com、.exe、.bat或.cmd) |
x |
- |
X |
- |
PROMPT |
命令提示符(通常是$P$G) |
- |
- |
X |
x |
SYSTEMDRIVE |
系统文件夹所在驱动器(通常是c:/) |
- |
- |
X |
- |
SYSTEMROOT |
系统文件夹(比如c:/winnt)。与WINDIR同样 |
- |
- |
X |
- |
WINDIR |
系统文件夹(比如c:/winnt)。与SYSTEMROOT同样 |
x |
- |
X |
x |
TEMP |
存储暂时文件的文件夹(比如c:/temp) |
- |
x |
X |
x |
TMP |
存储暂时文件的文件夹(比如c:/temp) |
- |
x |
X |
x |
要注意的是,脚本有可能訪问其它应用程序所设置的环境变量,并且上面列出的环境变量都不能是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方法将其保存到磁盘。
easy出问题的是将參数放到快捷方式对象的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
类 型 |
值 |
0 |
SUCCESS |
1 |
ERROR |
2 |
WARNING |
4 |
INFORMATION |
8 |
AUDIT_SUCCESS |
16 |
AUDIT_FAILURE |
以下的代码显示了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:可选。一个数值,表示想在弹出式消息框中出现的button和图标的类型。这些决定了消息框的使用场合和用途。nType的功能与Microsoft Win32应用程序编程接口中的MessageBox函数同样。以下的表格显示了各种值和它们的含义。能够合并列表中不同的值获得各种不同的结果。
● IntButton:一个整数值,表示关闭消息框时单击的button的序号,这个值是由Popup方法返回的。
不管使用那种宿主可执行文件(wscript.exe或cscript.exe)执行脚本,都能够使用Popup方法显示一个消息框。
要以诸如HeBrew或Arabic这种RTL语言的格式(从右至左)正确显示文本,能够在nType參数之前加上h00100000(十进制的1048576)。
button类型
见表15-7。
表15-7
值 |
描 述 |
0 |
显示OKbutton |
1 |
显示OK和Cancelbutton |
2 |
显示Abort、Retry和Ignorebutton |
3 |
显示Yes、No和Cancelbutton |
4 |
显示Yes和Nobutton |
5 |
显示Retry和Cancelbutton |
图标类型
见表15-8。
表15-8
值 |
描 述 |
16 |
显示终止(Stop Mark)图标 |
32 |
显示问号(Question Mark)图标 |
48 |
显示叹号(Exclamation Mark)图标 |
64 |
显示提示信息(Information Mark)图标 |
IntButton的返回值代表已单击的button编号。假设在nSecondsToWait秒之前没有单击不论什么button,inButton就被设置为-1.
表15-9列出了关闭消息框时所单击的button的编号。
表15-9
值 |
描 述 |
1 |
OKbutton |
2 |
Cancelbutton |
3 |
Abortbutton |
4 |
Retrybutton |
5 |
Ignorebutton |
6 |
Yesbutton |
7 |
Nobutton |
以下的代码显示了各种消息框button和图标的使用:
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
根 键 名 |
缩 写 |
HKEY_CURRENT_USER |
HKCU |
HKEY_LOCAL_MACHINE |
HKLM |
HKEY_CLASSES_ROOT |
HKCR |
HKEY_USERS |
HKEY_USERS |
HKEY_CURRENT_CONFIG |
HKEY_CURRENT_CONFIG |
以下的脚本将创建、读取并删除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
类 型 |
描 述 |
形 式 |
REG_SZ |
字符串 |
字符串 |
REG_DWORD |
数字 |
整数 |
REG_BINARY |
二进制值 |
整数构成的VBArray |
REG_EXPAND _ SZ |
可扩充字符串(比如%windir%//notepad.exe) |
字符串 |
REG_MULTI_SZ |
字符串数组 |
字符串构成的VBArray |
假设strName以反斜杠结尾,就能够指定键名,假设不使用反斜杠,就能够指定键值名。
一个键值包括三部分:
● 名称(Name)
● 数据类型(Data Type)
● 值(Value)
假设指定了键名(相对于键值名来说),RegRead就会返回默认的值。所以要读取一个键的默认值,仅仅要指定键的名称就可以。
完整的有效键名和键值名是以一个根键的名称作为起始的。使用RegRead方法时,也能够使用根键名的缩写形式。表15-12列出了5种可能使用的根键。
表15-12
根 键 名 |
缩 写 |
HKEY_CURRENT_USER |
HKCU |
HKEY_LOCAL_MACHINE |
HKLM |
HKEY_CLASSES_ROOT |
HKCR |
HKEY_USERS |
HKEY_USERS |
HKEY_CURRENT_CONFIG |
HKEY_CURRENT_CONFIG |
以下的脚本将创建、读取并删除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
转换至 |
strType |
字符串 |
REG_SZ |
字符串 |
REG_EXPAND_SZ |
整数 |
REG_DWORD |
整数 |
REG_BINARY |
RegWrite方法不支持REG_MULTI_SZ类型。
RegWrite最多写入一个DWORD或REG_BINARY值,该方法不支持更大的值。完整的有效键名和键值名是以一个根键的名称作为起始的。使用RegWrite方法时,也能够使用根键名的缩写形式。表15-14列出了5种可能使用的根键。
表15-14
根 键 名 |
缩 写 |
HKEY_CURRENT_USER |
HKCU |
HKEY_LOCAL_MACHINE |
HKLM |
HKEY_CLASSES_ROOT |
HKCR |
HKEY_USERS |
HKEY_USERS |
HKEY_CURRENT_CONFIG |
HKEY_CURRENT_CONFIG |
strType的四种可能被指定的数据类型如表15-15所看到的。
表15-15
类 型 |
描 述 |
形 式 |
REG_SZ |
字符串 |
字符串 |
REG_DWORD |
数字 |
整数 |
REG_BINARY |
二进制值 |
整数构成的VBArray |
REG_EXPAND _ SZ |
可扩充字符串(比如%windir%//notepad.exe) |
字符串 |
以下的代码显示了怎样訪问和改动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
IntWindowStyle |
描 述 |
0 |
隐藏当前窗体并激活还有一个窗体 |
1 |
激活并显示一个窗体 假设该窗体处于最小化或最大化状态,系统将恢复其原始尺寸 假设是初次显示该窗体,应用程序就应该指定这个标志 |
2 |
激活并以最小化状态显示窗体 |
3 |
激活并以最大化状态显示窗体 |
4 |
以其近期位置和尺寸显示一个窗体 活跃的窗体将继续保持活跃 |
5 |
以其当前位置和尺寸显示一个窗体 |
6 |
最小化指定的窗体并将其激活为Z序列中仅次于顶层的窗体 |
7 |
以最小化形式显示窗体 活跃的窗体将继续保持活跃 |
8 |
以其当前状态显示窗体 活跃的窗体将继续保持活跃 |
9 |
激活并显示窗体 假设该窗体处于最小化或最大化状态,系统将恢复其原始尺寸 假设要恢复一个最小化窗体,应用程序就应该指定这个标志 |
10 |
依据启动应用程序的程序状态设置窗体显示的状态 |
以下的代码打开一个命令提示符窗体并显示驱动器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
Backspace |
{BACKSPACE}, {BS}, or {BKSP} |
Break |
{BREAK} |
(续表)
Caps Lock |
{CAPSLOCK} |
Del or Delete |
{DELETE} or {DEL} |
Down Arrow |
{DOWN} |
End |
{END} |
Enter |
{ENTER} or ~ |
Esc |
{ESC} |
Help |
{HELP} |
Home |
{HOME} |
Ins or Insert |
{INSERT} or {INS} |
Left Arrow |
{LEFT} |
Num Lock |
{NUMLOCK} |
Page Down |
{PGDN} |
Page Up |
{PGUP} |
Print Screen |
{PRTSC} |
Right Arrow |
{RIGHT} |
Scroll Lock |
{SCROLLLOCK} |
Tab |
{TAB} |
Up Arrow |
{UP} |
F1 |
{F1} |
F2 |
{F2} |
F3 |
{F3} |
F4 |
{F4} |
F5 |
{F5} |
F6 |
{F6} |
F7 |
{F7} |
F8 |
{F8} |
F9 |
{F9} |
F10 |
{F10} |
F11 |
{F11} |
F12 |
{F12} |
F13 |
{F13} |
F14 |
{F14} |
F15 |
{F15} |
F16 |
{F16} |
要发送常规字符与Shift、Ctrl或Alt键的组合,就须要创建一个复合的字符串參数以表示这样的击键组合。能够在常规击键之前加上表15-19中的一个或多个特殊字符。
表15-19
键 |
特 殊 字 符 |
Alt |
% |
Ctrl |
^ |
Shift |
+ |
当用做这样的用途时,这些特殊字符不须要被包括在花括弧中。
要表示按下其它某些键的同一时候,必须按下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属性返回一个字符串。对于集合来说,它依据给定的keyword返回一个项目。在命令行中输入參数时,能够在字符串中使用空格,仅仅要将其包括在引號中就可以。以下这行代码能够用于在命令提示符下执行脚本:
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:可选。一个字符串值,为打印机连接指定一个打印机port(在Windows NT/2000/XP系统中忽略此參数)。
● 使用这种方法加入一个打印机连接和使用控制面板中的Printer选项是非常相似的。这种方法同意创建一个打印机连接,而且可以非常方便地将其定向到某一特定port。
● 假设连接失败,就会产生一个错误。
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:可选。一个字符串值,表示username。假设使用某个其它用户,而非当前用户的參数文件映射一个远程的打印机,就能够指定strUser和strPassword。
● strPassword:可选。一个字符串值,表示用户的password。假设使用某个其它用户,而非当前用户的參数文件映射一个远程的打印机,就能够指定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,通用命名规范)名称)构成的数组。集合中的偶数元素表示打印机port,而奇数元素表示网络打印机的UNC名称。
集合中的第一个元素的索引是0。
MapNetworkDrive
MapNetworkDrive方法在计算机系统中加入一个共享网络驱动器。
object.MapNetworkDrive(strLocalName, strRemoteName, [bUpdateProfile],
[strUser], [strPassword])
● object:WshNetwork对象。
● strLocalName:一个字符串值,表示被映射驱动器在本地的名称。
● strRemoteName:一个字符串值,表示共享的UNC名称(//xxx/yyy)。
● bUpdateProfile:可选。一个Boolean值,表示映射信息是否被存储到当前用户的參数文件里。假设提供了bUpdateProfile參数而且值为True,映射信息就会被存储到用户參数文件里。默认值为False。
● strUser:可选。一个字符串值,表示username。假设使用某个其它用户,而非当前用户的凭证映射一个网络驱动器,就必须指定这个參数。
● strPassword:可选。一个字符串值,表示用户的password。假设使用某个其它用户,而非当前用户的凭证映射一个网络驱动器,就必须指定这个參数。
假设试图映射一个非共享的网络驱动器,就会导致一个错误。
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
intWindowStyle |
描 述 |
1 |
激活并显示一个窗体 假设该窗体处于最小化或最大化状态,系统将恢复其原始尺寸 假设是初次显示该窗体,应用程序就应该指定这个标志 |
3 |
激活并以最大化状态显示窗体 |
7 |
以最小化形式显示窗体 活跃的窗体将继续保持活跃 |
以下代码中的修改保证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.wrox.com"
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.wrox.com"
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.wrox.com"
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.wrox.com"
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)的实现,这样的标准的方法能够訪问管理信息,如指定的client上安装的应用程序、系统内存,以及其它client信息。
通过开发使用ADSI和WMI的WSH脚本,系统管理员能够开发脚本以便运行以下列出的这些以及其它很多其它任务:
● 訪问并操作server
● 加入或删除用户以及改动password
● 加入网络文件共享
眼下的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
扩 展 名 |
脚 本 类 型 |
描 述 |
.bat |
MS-DOS批处理文件 |
MS-DOS操作系统的批处理文件 |
.asp |
ASP页面 |
活动server网页文件 |
.htm |
HTML文件 |
Web页面 |
(续表)
扩 展 名 |
脚 本 类 型 |
描 述 |
.html |
HTML文件 |
Web页面 |
.js |
JScript文件 |
Windows脚本 |
.vbs |
VBScript文件 |
Windows脚本 |
.wsf |
Windows脚本宿主文件 |
一个Windows脚本的容器或项目文件。WSH 2.0或更高版本号支持 |
.wsh |
Windows脚本宿主文件 |
一个脚本文件的属性文件。WSH 1.0或更高版本号支持 |
这就是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
//B |
批处理模式 这样的模式下不显示脚本错误和输出信息 |
//D |
启用主动调试 |
//E:engine |
使用引擎来运行脚本 |
//H:Cscript |
将默认的脚本宿主改动为cscript.exe |
//H:Wscript |
将默认的脚本宿主改动为wscript.exe(此为默认选项) |
//I |
交互模式(此为默认选项,它与//B是两种相反的模式) |
//Job:xxxx |
运行一个WSF作业 |
//Logo |
显示logo(此为默认选项) |
//Nologo |
不显示logo。运行时不显示banner |
//S |
保存当前用户的当前命令行选项 |
//T:nn |
超时时间(以秒为单位)。该时间为脚本在中止运行之前被同意的最长运行时间 |
//X |
在调试器中运行脚本 |
//U |
使用Unicode重定向来自控制台的I/O |
能够在命令行中以开关的形式添加这些选项以便使用它们。以下的演示样例在调试器中运行一个脚本。
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
单击OKbutton后,将不会有不论什么反应。在系统级定制脚本行为的唯一方法就是使用先前曾具体介绍的cscript选项。使用.wsh文件实现的每一个脚本的独立定制将使用该对话框来完毕,这在稍后会介绍。
那么这两种执行脚本的方法之间有什么差别呢?当 调试一个出错脚本时,cscript和wscript之间的主要差别实际上变得更明显了。这是由于,相对于wscript可能产生的没完没了的弹出窗体来说,向一个控制台窗体发送错误消息显得更快更easy。在调试脚本时,推荐使用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