2024年2月2日发(作者:)
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 = nts
For x = 0 to - 1
objArgs(x)
Next
FullName
FullName属性是一个只读的字符串,它代表宿主可执行文件(或)的有效完整路径。下面的代码使用了FullName属性。
me
这段代码产生如图15-4的输出。
图15-4
Interactive
Interactive属性设置脚本的模式,或识别脚本的模式。使用该属性会返回一个布尔值。有两种可用的模式:批处理模式和交互模式。
在交互模式下(默认情况),脚本可以与用户进行交互。可以向WSH输入信息,WSH也可以输出信息,信息被显示在对话框中,等待用户提供反馈。在批处理模式中,不支持用户交互,不支持WSH的输入和输出。
可以使用WSH命令行开关脚本模式//I(交互模式)和//B(批处理模式)来设置脚本模式。
Name
Name属性返回WScript对象(宿主可执行文件)的名称,它是一个只读的字符串。下面的代码使用了Name属性:
这段代码产生如图15-4的输出。
图15-5
Path
Path属性返回包含宿主可执行文件(或)的目录名。该属性返回一个只读的字符串。
下面的VBScript代码将显示可执行文件所在的目录名:
ScriptFullName
ScriptFullName属性返回当前正在运行的脚本的完整路径。该属性返回一个只读的字符串。
ScriptName
ScriptName属性返回当前正在运行的脚本的文件名。该属性返回一个只读的字符串。下面的代码显示了正在运行的脚本的名称,如图15-6所示:
Name
图15-6
StdErr
StdErr属性开放当前脚本的只写的错误输出流。该属性返回一个标识标准错误流的对象。只有使用时才能访问StdIn、StdOut和StdErr流。使用时如果想访问这些流就会产生一个错误。
StdIn
StdIn属性开放当前脚本的只读的输入流。该属性返回一个标识标准错误流的对象。只有使用时才能访问StdIn、StdOut和StdErr流。使用时如果想访问这些流就会产生一个错误。
StdOut
StdOut属性开放当前脚本的只写的错误输出流。该属性返回一个标识标准错误流的对象。只有使用时才能访问StdIn、StdOut和StdErr流。使用时如果想访问这些流就会产生一个错误。
下面的示例使用了这三种类型的内建流打印匹配某一特定扩展名的所有文件列表。这是通过将DOS的dir命令结果使用管道重定向到过滤器脚本来实现的,其中将扩展名字符串作为参数。
' Usage: dir | cscript ext
' ext: file extension to match
'
Dim streamOut, streamIn, streamErr
Set streamOut =
Set streamIn =
Set streamErr =
Dim strExt, strLineIn
Dim intMatch
strExt = nts(0)
intMatch = 0
Do While Not fStream
strLineIn = ne
If 0 = StrComp(strExt, Right(strLineIn, Len(strExt)), _
vbTextCompare) Then
ine strLineIn
intMatch = intMatch + 1
End If
Loop
If 0 = intMatch Then
ine "No files of type '" & strExt & "' found"
End If
因为这个示例中使用StdIn、StdOut和 StdErr进行消息的处理,所以不仅能将匹配的文件打印在屏幕上,也能够将输出结果发送到一个文本文件或其他有重定向或附加管道功能的应用程序中。例 如,可以使用下面的命令创建一个文件,包含整个目录树,包括子目录中的所有.vbs文件:
C:wsh>dir /s | cscript vbs >>
Version
该属性返回WSH的版本。下面的代码显示当前WSH的版本,如图15-7所示:
n
图15-7
2 WScript的方法
WScript对象具有下列方法:
● CreateObject
● ConnectObject
● DisconnectObject
● Echo
● GetObject
● Quit
● Sleep
CreateObject
WScript对象的这个方法用于创建一个COM对象。
Object(strProgID[,strPrefix])
● object:WScript对象。
● strProgID:值为字符串,表示想要创建的对象的程序标识符(ProgID)。
● strPrefix:可选。值为字符串,表示函数前缀。
使用CreateObject方法和strPrefix参数创建的对象是已连接对象。对象被创建后,其输出接口与脚本文件相连接。每个事件函数都由这个前缀加上事件的名称来命名。
如果创建对象时没有使用strPrefix参数,也可以使用ConnectObject方法同步对象的事件。只要对象产生一个事件,WSH就会调用一个子程序,其名称是strPrefix加上事件的名称。
下面的代码使用CreateObject方法创建一个WshNetwork对象:
Set WshNetwork = Object("k")
ConnectObject
该方法将对象的事件源连接到具有给定前缀的函数。
tObject(strObject, strPrefix)
● object:WScript对象。
● strObject:必需的。表示想要连接的对象名称的字符串。
● strPrefix:必需的。表示函数前缀的字符串。
同步一个对象的事件时,已连接对象是很有用的。对象被创建后,ConnectObject方法将对象的输出接口连接到脚本文件。事件函数的名称就是这个前缀加上事件的名称。
tObject RemoteScript, "remote_"
DisconnectObject
该方法用于断开已连接对象的事件源的连接。
nectObject(obj)
● object:WScript对象。
● obj:表示想要断开连接的对象名称的字符串。
断开一个对象的连接意味着WSH无法再响应它的事件。但是,有一点很重要,那就是断开连接后对象仍然能够产生事件。还要注意的是,如果指定的对象尚未连接,DisconnectObject方法就不会做任何事。
nectObject RemoteScript
Echo
该方法输出一个消息框或一个命令控制台窗口。
[Arg1] [,Arg2] [,Arg3] ...
● object:WScript对象。
● Arg1、Arg2、Arg3、„„:可选。表示要显示项目的列表。
根据当前使用的WSH引擎的不同,Echo方法输出的类型也有所变化(参见表15-3)。
表15-3
WSH引擎
文 本 输 出
图形消息框
命令控制台窗口
图15-8和图15-9显示了这两种输出的示例。
图15-8
图15-9
GetObject
GetObject方法根据指定的ProgID获取某个已存在对象,或从文件创建一个新的对象。
ect(strPathname [,strProgID], [strPrefix])
● object:WScript对象。
● strPathname:包含将对象保存到磁盘的文件所使用的完整的有效路径名。
● strProgID:可选。值为字符串,表示想要创建的对象的程序标识符(ProgID)。
● strPrefix:可选。进行对象事件同步时有用。如果提供了strPrefix参数,WSH就会在创建对象之后将对象的输出接口连接到脚本文件。
如果内存中存在对象的一个实例,或者想从文件创建一个对象,都需要使用GetObject方法。GetObject方法适用于所有COM类,与创建对象使用的脚本语言无关。
如果内存不存在对象的实例,也不想从文件创建对象,就可以使用CreateObject方法。
Dim MyObject As Object
Set MyObject = GetObject("C:")
MyApp = ation
Quit
该方法强制脚本在任意时刻立即停止执行。
([intErrorCode])
● object:WScript对象。
● intErrorCode:可选。返回一个整数值,作为进程的返回码。如果忽略intErrorCode参数,就不会有返回值。
Quit方法可以用于返回一个可选的错误代码。如果Quit方法是脚本中的最后一条命令(并且不需要返回一个非零值),就可以不使用任何参数,这样脚本就会正常退出。
1
' This line of code is not executed.
MsgBox "This message will never be shown!"
下面给出了Quit方法实际运行的示例。
If <> 0 Then
1 ' some failure indicator Else
0 ' success
End If
1
Sleep
该方法将脚本的执行挂起一段时间,然后接着执行。
(intTime)
● object:WScript对象。
● intTime:这是一个整数值,表示希望脚本进程保持非活跃状态的时间间隔(以毫秒为单位)。
使用这个方法时,运行脚本的线程被挂起,占用的CPU被释放。当间隔时间到,就会继续恢复执行。要想被事件所触发,脚本必须持续活跃,因为已经结束执行的脚本是肯定不能检测到任何事件的。脚本所处理的事件在脚本休眠时仍然会被执行。
向Sleep方法传递0或-1作为参数,就不会导致脚本不确定性地挂起。
15.6.2 WshArguments对象
编程过程中,参数的使用是一种非常有益的机制,可以给脚本提供输入以支持它的工作。如果考虑在DOS提示符下工作,那么多数命令行可执行文件都使用参数来确定要做的事情。例如,浏览一个目录树:
c:>cd wsh
在这个例子中,cd是一个DOS命令的名称(用于切换目录),而wsh是要激活的目录的名称—— 它是作为参数被传递给cd的。
创建使用参数的脚本是编写可重用代码的一个良好开端。创建设计用于在命令行中执行的脚本的开发人员会立竿见影地感受到使用Arguments属性带来的好处。不过,在WSH中,还有更好的理由来使用这个对象,因为这就是拖放功能得以实现的原因。
使用这个对象的最后一个好处就是它允许开发人员在其他脚本中重用脚本代码,只要以命令行运行的方式运行想重用的脚本,并给它传递可能在运行时需要的参数即可。
1. 访问WshArgument对象
它是通过使用nts属性来实现的。
Set objArgs = nts
2 WshArgument对象的属性
WshArgument对象是一个由WScript对象的Arguments属性返回的集合(nts)。
访问命令行参数集合有下列三种方法:
● 使用WshArguments对象访问整个参数集合。
● 使用WshNamed对象访问有名字的参数。
● 使用WshUnnamed对象访问没有名字的参数。
下面的例子是一个遍历WshArguments集合的简单循环,依次显示每个元素:
Set objArgs = WScript. Arguments
For x = 0 to - 1
objArgs(x)
Next
有趣的是,这段代码既适用于,也适用于,可以使用示例来尝试这一点。在命令行中运行时,传递一些参数:
c:vbsechoargs Hello, World!
图15-10显示了命令行输出。
图15-10
现在可以尝试拖动一两个文件,并将它们放到上。图15-11显示了这样做输出的结果。
图15-11
15.6.3 WshShell对象
Windows脚本宿主提供了一种便捷的方式,可以用于获取系统环境变量的访问、创建快捷方式、访问Windows的特殊文件夹,如Windows Desktop,以及添加或删除注册表条目。还可以使用Shell对象的功能创建更多的定制对话框以进行用户交互。
1 访问WshShell对象
要使用下面这一节中将要列出的属性,程序员必须创建一个对象的实例。这样以后对WshShell对象的引用实际就是对新创建实例的引用。
Set WshShell= Object( "" )
2 WshShell对象的属性
WshShell对象有三个属性:
● CurrentDirectory
● Environment
● SpecialFolders
CurrentDirectory
该属性获取或更改当前活动目录。
tDirectory
● object:WshShell对象。
CurrentDirectory属性返回一个字符串,其中包含当前活跃进程的当前工作目录的完整有效路径名。
Dim WshShell
Set WshShell = Object("")
tDirectory
Environment
该属性返回WshEnvironment对象(一个环境变量集合)。
nment ([strType])
● object:WshShell对象。
● strType:可选。指定环境变量的位置。
Environment属性包含WshEnvironment对象(一个环境变量集合)。如果指定了strType,就指定了环境变量所在的级别的值:
● System
● User
● Volatile
● Process
如果没有指定strType,Environment属性就会根据不同的操作系统返回不同的环境变量类型(表15-4所示)。
表15-4
环境变量类型
System
Process
操 作 系 统
Microsoft Windows NT/2000/XP/Vista
Windows 95/98/Me
对于Windows 95/98/Me,只允许一种strType:Process。其他类型不允许在脚本中使用。
表15-5列出了Windows操作系统提供的一些变量。
表15-5
名 称
NUMBER_OF
描 述
机器中运行的处理_PROCESSORS
器个数
PROCESSOR 用户工作站的处理_ARCHITECTURE
器类型
PROCESSOR 用户工作站的处理_IDENTIFIER
器ID
PROCESSOR 用户工作站的处理_LEVEL
器等级
PROCESSOR 用户工作站的处理_REVISION
器版本
OS 用户工作站的操作系统
COMSPEC 用户工作站的操作系统
HOMEDRIVE 主逻辑驱动器(通常是C盘)
HOMEPATH 用户的默认目录
PATH Path环境变量
System User Process(NT/2000/XP/Vista) Process(95/98/Me)
x - X -
x - X -
x - X -
x - X -
x - X -
x - X -
- - X x
- - X -
-
x
-
x
X
X
-
x
(续表)
名 称
PATHEXT
描 述
可执行文件的扩展名(一般是.com、.exe、.bat或.cmd)
PROMPT 命令提示符(一般是$P$G)
SYSTEMDRIVE 系统目录所在驱动器(一般是c:)
SYSTEMROOT 系统目录(例如c:winnt)。与WINDIR相同
WINDIR 系统目录(例如c:winnt)。与SYSTEMROOT相同
TEMP 存储临时文件的目录(例如c:temp)
TMP 存储临时文件的目录(例如c:temp)
System User Process(NT/2000/XP/Vista) Process(95/98/Me)
x - X -
-
-
-
-
-
-
X
X
X
x
-
-
x - X x
-
-
x
x
X
X
x
x
要注意的是,脚本有可能访问其他应用程序所设置的环境变量,而且上面列出的环境变量都不能是Volatile类型的。
下面是一个关于在代码中如何使用上面列出的这些变量的示例。该示例返回系统中存在的处理器个数。
Set WshShell = Object("")
Set WshSysEnv = nment("SYSTEM")
WshSysEnv("NUMBER_OF_PROCESSORS")
SpeciolFolders
该属性返回一个SpecialFolders对象(一个特殊文件夹集合)。
lFolders(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 = lFolders("StartMenu")
3. WshShell对象的方法
WshShell对象有11个方法。所有这些方法都与操作系统shell相关,可以用于控制Windows注册表,也可以创建弹出式消息框和快捷方式以及激活和控制正在运行的应用程序:
● AppActivate
● CreateShortcut
● ExpandEnvironmentStrings
● LogEvent
● Popup
● RegDelete
● RegRead
● RegWrite
● Run
● SendKeys
● Exec
AppActivate
这个方法可以用于激活一个指定的已经打开的应用程序窗口。
ivate title
● object:WshShell对象。
● title:指定要激活的应用程序。这可以是一个包含应用程序标题的字符串(就像出现在标题栏中的那样)或应用程序的进程ID。
AppActivate方法返回一个 Boolean类型的值,标志着过程调用是否成功。这个方法用于将焦点切换至指定名称的应用程序或窗口。方法的调用不影响应用程序的最大化或最小化状态。 当进行了切换焦点(或关闭窗口)的动作之后,焦点就会从已经获得焦点的应用程序上移走。
为了确定要激活的应用程序,指定的标题名称会与 每个正在运行的应用程序的标题字符串做比较。如果没有准确的匹配,那么具有以title所指定的值开始的标题字符串的应用程序就会被激活。如果还是没有能 找到合适的应用程序,那么具有以title所指定的值结束的标题字符串的应用程序就会被激活。如果存在多个名为title所指定的值的应用程序实例,就会 任意激活其中的一个。但是,无法控制具体选择哪一个。
CreateShortcut
该方法可以用于创建一个新的快捷方式,或打开一个已有的快捷方式。
Shortcut(strPathname)
● object:WshShell对象。
● strPathname:一个表示要创建的快捷方式的路径名。
CreateShortcut方法返回一个 WshShortcut对象或一个WshURLShortcut对象。调用CreateShortcut方法不会导致快捷方式的真正创建,而是将快捷方式
对象以及对其所做的修改保存在内存中,直到使用Save方法将其保存至磁盘。要真正创建一个快捷方式,必须完成下列三个步骤:
● 创建WshShortcut对象的一个实例。
● 初始化其属性。
● 使用Save方法将其保存到磁盘。
容易出问题的是将参数放到快捷方式对象的TargetPath属性中,这通常是无用的。快捷方式的所有参数都必须放在Arguments属性中。
ExpandEnvironmentStrings
该方法返回环境变量的扩充值。
EnvironmentStrings(strString)
● object:WshShell对象。
● strString:一个字符串值,表示想要扩充的环境变量的名称。
这个方法只对PROCESS环境空间内定义的环境变量进行扩充。环境变量的名称必须以“%”包围,并且是大小写不敏感的。
set WshShell = Object("")
"The path to WinDir is " _
& EnvironmentStrings("%WinDir%")
LogEvent
LogEvent方法向日志文件中添加一个事件条目。
nt(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中,事件被记录在(位于Windows目录)中。
有6种事件类型,如表15-6所示。
表15-6
类 型
0
1
2
4
8
16
值
SUCCESS
ERROR
WARNING
INFORMATION
AUDIT_SUCCESS
AUDIT_FAILURE
下面的代码显示了LogEvent的运行,它基于事件的成功与否对其进行记录。
Set WshShell = Object("")
'assume that rS contains a return code
'from another part of the code
if rS then
nt 0, "Script Completed Successfully"
else
nt 1, "Script failed"
end if
Popup
该方法用于在弹出式消息框中显示文本。
intButton = (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方法返回的。
无论使用那种宿主可执行文件(或)运行脚本,都可以使用Popup方法显示一个消息框。
要以诸如HeBrew或Arabic这样的RTL语言的格式(从右至左)正确显示文本,可以在nType参数之前加上h00100000(十进制的1048576)。
按钮类型
见表15-7。
表15-7
值
0
1
2
3
4
5
图标类型
描 述
显示OK按钮
显示OK和Cancel按钮
显示Abort、Retry和Ignore按钮
显示Yes、No和Cancel按钮
显示Yes和No按钮
显示Retry和Cancel按钮
见表15-8。
表15-8
值
16
32
48
64
描 述
显示终止(Stop Mark)图标
显示问号(Question Mark)图标
显示叹号(Exclamation Mark)图标
显示提示信息(Information Mark)图标
IntButton的返回值代表已单击的按钮编号。如果在nSecondsToWait秒之前没有单击任何按钮,inButton就被设置为-1.
表15-9列出了关闭消息框时所单击的按钮的编号。
表15-9
值
1
2
3
4
5
6
7
描 述
OK按钮
Cancel按钮
Abort按钮
Retry按钮
Ignore按钮
Yes按钮
No按钮
下面的代码显示了各种消息框按钮和图标的使用:
Dim WshShell, BtnCode
Set WshShell = Object("")
BtnCode = ("Do you like this code?", 7, "Quick survey:",
4 + 32)
Select Case BtnCode
case 6 "Glad to hear it - Thanks!"
case 7 "I’m sorry you didn’t like it."
case -1 "Helllloooooooo?"
End Select
RegDelete
该方法从注册表中删除一个键或其键值。
ete(strName)
● object:WshShell对象。
● strName:一个字符串值,表示要删除的注册表键或键值的名称。
如果strName以反斜杠结尾,就可以指定键名,如果不使用反斜杠,就可以指定键值名。
完整的有效键名和键值名是以一个根键的名称作为前缀的。使用RegDelete方法时,也可以使用根键名的缩写形式。
表15-10列出了5种可能使用的根键。
表15-10
根 键 名
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG
缩 写
HKCU
HKLM
HKCR
HKEY_USERS
HKEY_CURRENT_CONFIG
下面的脚本将创建、读取并删除Windows注册表键。高亮的部分是删除键的脚本。
Dim WshShell, bKey
Set WshShell = Object("")
te "HKCUSoftwareWROXVBScript", 1, "REG_BINARY"
te
"HKCUSoftwareWROXVBScriptProgRef","VBS_is_great","REG_SZ"
bKey = d("HKCUSoftwareWROXVBScript")
d("HKCUSoftwareWROXVBScriptProgRef")
ete "HKCUSoftwareWROXVBScriptProgRef"
ete "HKCUSoftwareWROXVBScript"
ete "HKCUSoftwareWROX"
在修改注册表设置时,需要特别的小心。对注册表进行不当的修改可能会导致系统变得不稳定,甚至使其变得完全不可用。如果不了解注册表的内部工作机制,那么强烈建议在实际操作之前就此问题阅读一些相关的资料。
RegRead
该方法返回注册表中一个键或键值的名称。
d(strName)
● object:WshShell对象。
● strName:一个字符串值,表示想获得的键或键值的名称。
RegRead方法返回的值有5种类型(如表15-11所示)。
表15-11
类 型
REG_SZ
REG_DWORD
REG_BINARY
REG_EXPAND _ SZ
REG_MULTI_SZ
描 述
字符串
数字
二进制值
可扩充字符串(例如%windir%)
字符串数组
形 式
字符串
整数
整数构成的VBArray
字符串
字符串构成的VBArray
如果strName以反斜杠结尾,就可以指定键名,如果不使用反斜杠,就可以指定键值名。
一个键值包含三部分:
● 名称(Name)
● 数据类型(Data Type)
● 值(Value)
如果指定了键名(相对于键值名来说),RegRead就会返回默认的值。所以要读取一个键的默认值,只要指定键的名称即可。
完整的有效键名和键值名是以一个根键的名称作为起始的。使用RegRead方法时,也可以使用根键名的缩写形式。表15-12列出了5种可能使用的根键。
表15-12
根 键 名
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG
缩 写
HKCU
HKLM
HKCR
HKEY_USERS
HKEY_CURRENT_CONFIG
下面的脚本将创建、读取并删除Windows注册表键。高亮的部分是读取键的脚本。
Dim WshShell, bKey
Set WshShell = Object("")
te "HKCUSoftwareWROXVBScript", 1, "REG_BINARY"
te
"HKCUSoftwareWROXVBScriptProgRef","VBS_is_great","REG_SZ"
bKey = d("HKCUSoftwareWROXVBScript")
d("HKCUSoftwareWROXVBScriptProgRef")
ete "HKCUSoftwareWROXVBScriptProgRef"
ete "HKCUSoftwareWROXVBScript"
ete "HKCUSoftwareWROX"
RegWrtie
该方法可以创建一个新键,给现有键添加另一个键值名(并指定一个值),或修改现有键值名的值。
te(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
HKEY_LOCAL_MACHINE
HKEY_CLASSES_ROOT
HKEY_USERS
HKEY_CURRENT_CONFIG
缩 写
HKCU
HKLM
HKCR
HKEY_USERS
HKEY_CURRENT_CONFIG
strType的四种可能被指定的数据类型如表15-15所示。
表15-15
类 型
REG_SZ
REG_DWORD
REG_BINARY
REG_EXPAND _ SZ
描 述
字符串
数字
二进制值
可扩充字符串(例如%windir%)
形 式
字符串
整数
整数构成的VBArray
字符串
下面的代码显示了如何访问和修改Windows注册表:
Dim WshShell, bKey
Set WshShell = Object("")
te "HKCUSoftwareWROXVBScript", 1, "REG_BINARY"
te
"HKCUSoftwareWROXVBScriptProgRef","VBS_is_great","REG_SZ"
bKey = d("HKCUSoftwareWROXVBScript")
d("HKCUSoftwareWROXVBScriptProgRef")
ete "HKCUSoftwareWROXVBScriptProgRef"
ete "HKCUSoftwareWROXVBScript"
ete "HKCUSoftwareWROX"
在修改注册表设置时,需要特别的小心。对注册表进行不当的修改可能会导致系统变得不稳定,甚至使其变得完全不可用。如果不了解注册表的内部工作机制,那么强烈建议在实际操作之前就此问题阅读一些相关的资料。
Run
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
描 述
隐藏当前窗口并激活另一个窗口
激活并显示一个窗口
如果该窗口处于最小化或最大化状态,系统将恢复其原始尺寸
如果是初次显示该窗口,应用程序就应该指定这个标志
激活并以最小化状态显示窗口
激活并以最大化状态显示窗口
以其最近位置和尺寸显示一个窗口
活跃的窗口将继续保持活跃
以其当前位置和尺寸显示一个窗口
最小化指定的窗口并将其激活为Z序列中仅次于顶层的窗口
以最小化形式显示窗口
活跃的窗口将继续保持活跃
以其当前状态显示窗口
活跃的窗口将继续保持活跃
激活并显示窗口
如果该窗口处于最小化或最大化状态,系统将恢复其原始尺寸
如果要恢复一个最小化窗口,应用程序就应该指定这个标志
根据启动应用程序的程序状态设置窗口显示的状态
2
3
4
5
6
7
8
9
10
下面的代码打开一个命令提示符窗口并显示驱动器C:的内容。
Dim oShell
Set oShell = Object ("")
"cmd /K CD C: & Dir"
Set oShell = Nothing
SendKeys
Sendkeys方法向活跃窗口发送一次或多次击键(仿佛来自键盘)。
ys(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
Break
{BACKSPACE}, {BS}, or {BKSP}
{BREAK}
(续表)
Caps Lock
Del or Delete
Down Arrow
End
Enter
Esc
Help
Home
Ins or Insert
Left Arrow
Num Lock
Page Down
Page Up
Print Screen
Right Arrow
Scroll Lock
Tab
Up Arrow
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
{CAPSLOCK}
{DELETE} or {DEL}
{DOWN}
{END}
{ENTER} or ~
{ESC}
{HELP}
{HOME}
{INSERT} or {INS}
{LEFT}
{NUMLOCK}
{PGDN}
{PGUP}
{PRTSC}
{RIGHT}
{SCROLLLOCK}
{TAB}
{UP}
{F1}
{F2}
{F3}
{F4}
{F5}
{F6}
{F7}
{F8}
{F9}
{F10}
{F11}
{F12}
{F13}
F14
F15
F16
{F14}
{F15}
{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}。
Exec
Exec方法在一个子命令解释器中运行一个应用程序,子命令解释器提供对StdIn、StdOut和StdErr流的访问。
(strCommand)
● object:WshShell对象。
● strCommand:一个字符串值,表示用于运行脚本的命令行。
Exec方法返回一个WshScriptExec对象,该对象提供使用Exec运行的脚本的状态和错误信息,也提供对StdIn、StdOut和StdErr通道的访问。Exec方法只能执行命令行应用程序,并且不能用于运行远程脚本。
15.6.4 WshNamed对象
WshNamed对象提供从命令行中对有名称参数的访问。
WshArguments对象的Named属性返回WshNamed对象,这是一个有名称参数的集合。这个集合使用了参数名称作为索引来获取每个参数的值。访问命令行参数集合有下列三种方法:
● 使用WshAruments对象访问整个参数集合。
● 使用WshNamed对象访问有名字的参数。
● 使用WshUnnamed对象访问没有名字的参数。
1. 访问WshNamed对象
该对象的访问是通过创建对象的实例实现的。
Set argsNamed =
2. WshNamed对象的属性
WshNamed对象具有两个属性:
● Item
● Length
Item
Item属性提供了对WshNamed对象中的项目的访问。
(key)
● object:WshNamed对象。
● key:想要获取的项目名称。
Item属性返回一个字符串。对于集合来说,它根据给定的关键字返回一个项目。在命令行中输入参数时,可以在字符串中使用空格,只要将其包含在引号中即可。下面这行代码可以用于在命令提示符下运行脚本:
/a:arg1 /b:arg2
如果脚本中包含下面的代码。
("b")
("a")
就会产生这样的输出结果。
arg2
arg1
Length
Length属性是一个只读的整数,可以在编写Jscript脚本时使用。同样地,这个属性不在本书的讨论范围之内。
3. WshNamed对象的方法
WshNamed对象具有两个方法:
● Count
● Exists
Count
Count方法返回WshNamed或WshUnnamed对象的选项开关个数。
● object:WshNamed对象。
Count方法用于返回一个整数值。该方法是给VBScript用户使用的,JScript用户应该使用length属性。
For x = 0 to -1
(x)
Next x
Exists
Exists方法可以用于确定某一给定的键值是否存在于WshNamed对象中。
(key)
● object:WshNamed对象。
● key:字符串值,表示WshNamed对象的一个参数。
这个方法返回一个Boolean值。如果请求的参数的确在命令行中被指定,就返回True(否则返回False)。在命令提示符中输入下面的代码运行脚本:
/a:arg1 /b:arg2
下面的代码可以用于确定是否使用了参数/a、/b和/c:
("a")
("b")
("c")
15.6.5 WshUnnamed对象
WshUnnamed对象提供了从命令行中对未命名对象的访问。它是一个由WshAruments对象的Unnamed属性返回的只读集合。从该集合中获取单个参数值时,使用由0开始的索引。
访问命令行参数集合有下列三种方法:
● 使用WshAruments对象访问整个参数集合。
● 使用WshNamed对象访问有名字的参数。
● 使用WshUnnamed对象访问没有名字的参数。
1. 访问WshUnnamed对象
该对象的访问是通过创建d对象的实例实现的。
Set argsUnnamed = d
2. WshUnnamed对象的属性
WshUnnamed对象具有两个属性:
● Item
● Length
这两个属性和WshNamed的类似,这里就不再重复介绍。
3. WshUnnamed对象的方法
WshUnnamed对象具有一个方法:
● Count
这个方法和WshNamed的类似,这里就不再重复介绍。
15.6.6 WshNetwork对象
WshNetwork对象提供对计算机所连接的网络上共享资源的访问。如果想连接到网络共享或网络打印机,从网络共享或网络打印机断开连接,映射或删除网络共享,或访问网络上某一用户的信息,都需要创建一个WshNetwork对象。
1. 访问WshNetwork对象
该对象的访问是通过创建k对象的实例实现的。
Set WshNetwork = Object("k")
2. WshNetwork对象的属性
WshNetwork对象具有三个属性:
● ComputerName
● UserDomain
● UserName
ComputerName
ComputerName属性返回计算机系统的名称。
erName
● object:WshNetwork对象。
ComputerName属性包含一个字符串值,表示计算机系统的名称。
UserDomain
UserDomain属性返回用户的域名。
main
● object:WshNetwork对象。
UserDomain属性在Windows 98和Windows Me下不可用,除非设置了USERDOMAIN环境变量。这个变量默认情况下是没有被设置的。
UserName
UserName属性返回某个用户的名称。
me
● object:WshNetwork对象。
UserName属性以字符串返回一个用户的名称。
3. WshNetwork的方法
WshNetwork对象有下列8个方法可用:
● AddWindowsPrinterConnection
● AddPrinterConnection
● EnumNetworkDrives
● EnumPrinterConnection
● MapNetworkDrive
● RemoveNetworkDrive
● RemovePrinterConnection
● SetDefaultPrinter
AddWindowsPrinterConnection
AddWindowsPrinterConnection方法在计算机系统中添加一个Windows打印机连接。
● Windows NT/2000/XP/Vista:
dowsPrinterConnection(
strPrinterPath
)
● Windows 9x/Me:
dowsPrinterConnection(
strPrinterPath,
strDriverName[,strPort]
)
• object:WshNetwork对象。
• strPrinterPath:一个字符串值,表示打印机连接的路径。
• strDriverName:一个字符串值,表示驱动器的名称(在Windows
NT/2000/XP中忽略此参数)。
• strPort:可选。一个字符串值,为打印机连接指定一个打印机端口(在Windows NT/2000/XP系统中忽略此参数)。
● 使用这个方法添加一个打印机连接和使用控制面板中的Printer选项是非常类似的。这个方法允许创建一个打印机连接,并且能够很方便地将其定向到某一特定端口。
● 如果连接失败,就会产生一个错误。
Set WshNetwork = Object("k")
PrinterPath = "printerserverDefaultPrinter"
dowsPrinterConnection PrinterPath
AddPrinterConnection
AddPrinterConnection方法在计算机系统中添加一个远程打印机连接。
nterConnection(strLocalName,
strRemoteName[,bUpdateProfile][,strUser][,strPassword])
● object:WshNetwork。
● strLocalName:一个字符串值,表示指派给以连接打印机的本地名称。
● strRemoteName:一个字符串值,表示远程打印机的名称。
● bUpdateProfile:可选。一个Boolean值,表示打印机映射是否被存储到当前用户的参数文件中。如果提供了bUpdateProfile参数并且值为True,打印机映射就会被存储到用户参数文件中。默认值为False。
● strUser:可选。一个字符串值,表示用户名。如果使用某个其他用户,而非当前用户的参数文件映射一个远程的打印机,就可以指定strUser和strPassword。
● strPassword:可选。一个字符串值,表示用户的密码。如果使用某个其他用户,而非当前用户的参数文件映射一个远程的打印机,就可以指定strUser和strPassword。
EnumNetworkDrives
EnumNetworkDrives方法返回当前网络驱动器的映射信息。
objDrives = tworkDrives
● object:WshNetwork对象。
● objDrives:一个变量,保存网络驱动器的映射信息。
这个方法返回一个集合,它是一个由关联项目对(网络驱动器本地名称与其关联的UNC(Universal Naming Convention,通用命名规范)名称)构成的数组。集合中的偶数元素表示逻辑驱动器的本地名称,而奇数元素表示其关联的UNC共享名。
集合中的第一个元素的索引是0。
EnumPrinterConnection
EnumPrinterConnection方法返回当前网络打印机的映射信息。
objPrinters = interConnections
● object:WshNetwork对象。
● objPrinters:保存网络打印机的映射信息的变量。
EnumPrinterConnection方法返回一个集合,它是一个由关联项目对(网络打印机本地名称与其关联的UNC(Universal Naming Convention,通用命名规范)名称)构成的数组。集合中的偶数元素表示打印机端口,而奇数元素表示网络打印机的UNC名称。
集合中的第一个元素的索引是0。
MapNetworkDrive
MapNetworkDrive方法在计算机系统中添加一个共享网络驱动器。
workDrive(strLocalName, strRemoteName, [bUpdateProfile],
[strUser], [strPassword])
● object:WshNetwork对象。
● strLocalName:一个字符串值,表示被映射驱动器在本地的名称。
● strRemoteName:一个字符串值,表示共享的UNC名称(xxxyyy)。
● bUpdateProfile:可选。一个Boolean值,表示映射信息是否被存储到当前用户的参数文件中。如果提供了bUpdateProfile参数并且值为True,映射信息就会被存储到用户参数文件中。默认值为False。
● strUser:可选。一个字符串值,表示用户名。如果使用某个其他用户,而非当前用户的凭证映射一个网络驱动器,就必须指定这个参数。
● strPassword:可选。一个字符串值,表示用户的密码。如果使用某个其他用户,而非当前用户的凭证映射一个网络驱动器,就必须指定这个参数。
如果试图映射一个非共享的网络驱动器,就会导致一个错误。
RemoveNetworkDrive
RemoveNetworkDrive方法在计算机系统中删除一个共享的网络驱动器。
NetworkDrive(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 = Object("k")
NetworkDrive "G:"
RemovePrinterConnection
RemovePrinterConnection方法在计算机系统中删除一个共享的网络打印机连接。
PrinterConnection(strName, [bForce], [bUpdateProfile])
● object:WshNetwork对象。
● strName:一个字符串值,表示打印机的标识名称。它可以是一个UNC名称(格式为xxxyyy)或者一个本地名称(如LPT1)。
● bForce:可选。一个Boolean值,表示是否强制删除已映射的打印机。如果指定了bForce参数并且其值为True,那么无论是否有用户正在连接,该方法都会删除打印机连接。
● bUpdateProfile:可选。一个Boolean值,如果设置为True(默认是False),所做的更改保存到用户参数文件中。
RemovePrinterConnection方法将同时删除基于Windows和基于DOS的打印机连接。
如果打印机是使用AddPrinterConnection方法连接的,strName就必须是打印机的本地名称。
如果打印机是使用AddWindowsPrinterConnection方法或手工连接的,strName就必须是打印机的UNC名称。
SetDefaultPrinter
SetDefaultPrinter方法将某个远程打印机指定为默认打印机。
aultPrinter(strPrinterName)
● object:WshNetwork对象。
● strPrinterName:一个字符串值,表示远程打印机的UNC名称。
使用基于DOS的打印机连接时,SetDefaultPrinter方法调用将失败。此外,也不能使用SetDefaultPrinter方法确定当前已安装的默认打印机名称。
15.6.7 WshEnvironment对象
WshEnvironment对象提供对Windows环境变量集合的访问。
这个对象是一个由WshShell对象的Environment属性返回的环境变量集合。该集合包含全部的环境变量(包括有名称的和没有名称的)。
要获取集合中某个具体的环境变量(及其值),可以使用环境变量名作为索引。
1. 访问WshEnvironment对象
该对象的访问是通过创建nment对象的实例实现的。下面的脚本返回运行脚本的系统中安装的处理器个数:
Set WshShell = Object("")
Set WshSysEnv = nment("SYSTEM")
WshSysEnv("NUMBER_OF_PROCESSORS")
2. WshEnvironment对象的属性
WshEnvironment对象具有两个属性:
● Item
● Length
Item
Item属性公开集合中的某一指定元素。
(natIndex)
● object:EnumNetworkDrive或numPrinterConnections方法的返回值,或由Environment或SpecialFolders属性返回的对象。
● natIndex:设置要获取的元素。
Item是每个集合的默认属性。对于EnumNetworkDrive和EnumPrinterConnections集合来说,索引是一个整数,但对于Environment和SpecialFolders来说,索引是一个字符串。
在VBScript中,如果请求的文件夹(strFolderName)不存在, (strFolderName)将返回“Empty”。
Length
Length属性是一个只读的整数,可以在编写Jscript脚本时使用。同样地,这个属性不在本书的讨论范围之内。
3. WshEnvironment对象的方法
WshEnvironment对象具有两个方法:
● Count
● Remove
Count
Count方法返回一个Long值,表示集合中元素的个数。
● object:Arguments对象
Count方法返回一个整数值。该方法是给VBScript用户使用的,JScript用户应该使用Length属性。
For x = 0 to -1
(x)
Next x
Remove
Remove方法删除一个现有的环境变量。
(strName)
● object:WshEnvironment对象。
● strName:一个字符串值,表示要删除的环境变量的名称。
Remove方法删除下列类型的环境变量:
● PROCESS
● USER
● SYSTEM
● VOLATILE
使用Remove方法删除的环境变量将在当前会话结束后被恢复。
Dim WshShell, WshEnv
Set WshShell = Object("")
Set WshEnv = nment("PROCESS")
WshEnv("tVar") = "VBScript is Cool!"
EnvironmentStrings("The value of the test
variable is:
'%tVar%’")
"tVar"
EnvironmentStrings("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的一个快捷方式:
