Windows Script Host. 第 7 章 - 内置 WSHand VBScript 对象






4.42/5 (8投票s)
2001年3月13日

168401
本章详细介绍了一些作为 VBScript 或 Windows Script Host 的一部分而提供的对象,因此系统脚本作者可以使用它们。
![]() |
|
第 7 章 - 内置 WSHand VBScript 对象
上一章介绍了对象和面向对象范例。本章详细介绍了一些作为 VBScript 或 Windows Script Host 的一部分而提供的对象,因此系统脚本作者可以使用它们。
WSH 提供的对象可供所有系统脚本使用,无论使用何种语言。VBScript 提供的对象仅在脚本使用 VBScript 语言时才可用。因此,如果您使用其他脚本语言,则无法访问 VBScript 对象。
文件系统对象也作为 VBScript 的一部分提供。此对象在第 8 章“文件系统对象”中有描述。
注意
与本书中的所有示例脚本一样,本章中的脚本应使用 CSCRIPT host 运行,除非另有说明。所示示例假定 CSCRIPT 是默认的 WSH host。 (有关选择默认 WSH host 的信息,请参阅第 1 章“Introducing WSH”。)
VBScript 对象
VBScript 为脚本提供了以下对象:
Err
对象,它提供对运行时错误信息的访问。RegExp
对象,它将字符串与称为正则表达式的特殊文本模式进行匹配。Dictionary
对象,它提供项目索引功能。
Err 对象
Err
对象封装了 VBScript 脚本的错误。到目前为止,本书中的所有示例脚本都使用了默认的错误处理。默认情况下,如果发生错误,VBScript 会终止脚本执行,WSH 会将错误报告给用户。但是,有时默认的错误处理并不理想。在这种情况下,可以使用 Err
对象和 On Error
语句让脚本执行自己的错误处理。
Err
对象是一个预定义的全局对象,无需声明即可使用。该对象用于封装与错误条件相关的所有信息。这些信息以一系列属性的形式呈现,如下所示:
- .
Number
属性是错误的错误号(或代码)。这是 Err 对象的默认属性。 - .
Source
属性包含一个字符串,指定错误的来源,通常是生成错误的对象的 ProgID(程序标识符)。 - .
Description
属性包含一个描述错误的字符串。 - .
HelpFile
和.HelpContext
属性存储有关在帮助文件中引用帮助主题的信息。这允许错误将用户引向有关错误可能原因的信息。
要生成用户定义的运行时错误,请先使用 .Clear
方法清除 Err 对象,然后使用 .Raise
方法引发错误。此方法最多可接受五个参数,这些参数按顺序对应于前面列出的属性。例如:
Err.Clear Err.Raise 1000, "This is a script-defined error", "Test Script"
此示例显示一条消息,其中包含描述字符串,后跟冒号和源字符串。
要拦截运行时错误并在脚本中进行处理,请使用 On Error
语句。此语句的语法是:
On Error Resume Next
执行此语句后,后续的运行时错误不会导致脚本执行终止。而是将 Err
对象的属性设置为反映错误信息,并且处理将继续执行下一条语句。例如:
Err.Clear On Error Resume Next Err.Raise 100,"Script Error" If Err.Number Then Wscript.Echo "Error=", Err.Number
在此示例中,使用 Err.Raise
方法引发运行时错误。通常,这会终止脚本执行。但是,前面的 On Error
语句允许脚本继续执行,因此 If 语句执行并显示错误号。
在上例中,错误是由 Err.Raise
方法生成的。但是,相同的处理适用于任何运行时错误,无论其生成方式如何。例如:
On Error Resume Next Err.Clear x = CInt("foo") If Err.Number <> 0 Then Wscript.Echo Err.Number, Err.Description, Err.Source
在这里,尝试将字符串“foo”转换为整数。由于这是一个无效转换,因此会生成运行时类型不匹配错误。此错误的信息将放入 Err 对象中,然后由 If 语句处理。
执行 On Error
语句后,它将继续在执行它的过程的其余部分中生效。如果 On Error
语句在全局范围内执行,则它将一直生效直到脚本终止。嵌套的过程可以有自己的 On Error
语句。例如,子例程 A 可以执行 On Error
语句,然后执行子例程 B,而子例程 B 又执行 On Error
语句。
如果在 On Error
语句处于活动状态时发生错误,执行将继续执行与最近执行的 On Error
语句相同范围内的下一条语句。例如:
On Error Resume Next Wscript.Echo "Begin" Sub1 Wscript.Echo "End" Sub Sub1 Wscript.Echo "Enter Sub1" Err.Raise 100 Wscript.Echo "Leave Sub1" End Sub
在此示例中,在全局范围执行了 On Error
语句,然后执行了 Sub1
过程。在此过程中,使用 Err.Raise
方法生成错误。由于最近执行的错误在全局范围,因此下一条执行的语句是全局范围的 Wscript.Echo
语句,而不是 Err.Raise
语句后面的 Wscript.Echo
语句。实际上,此错误会导致 VBScript 放弃对 Sub1
中语句的进一步执行,并在全局范围继续执行。因此,此脚本的输出为:
Begin Enter Sub1 End
请注意,Sub1
中的最后一条 Wscript.Echo
语句永远不会执行。发生错误时,VBScript 会立即放弃执行任何正在运行的过程,以便在错误后恢复到原始过程调用之后的正确语句。例如:
On Error Resume Next Wscript.Echo "Begin" Sub1 Wscript.Echo "End" Sub Sub1 Wscript.Echo "Enter Sub1" Sub2 Wscript.Echo "Leave Sub1" End Sub Sub Sub2 Wscript.Echo "Enter Sub2" Err.Raise 100 Wscript.Echo "Leave Sub2" End Sub
在这里,Err.Raise
方法调用嵌套得更深。在这种情况下,发生错误时,VBScript 会放弃对 Sub1 和 Sub2 的进一步执行,以在全局级别继续执行。
由于 VBScript 仅在找到最近执行的 On Error
语句之前放弃过程的执行,因此可以通过将 On Error 语句放在该过程中来捕获过程中的错误。例如:
On Error Resume Next Wscript.Echo "Begin" Sub1 Wscript.Echo "End" Sub Sub1 Wscript.Echo "Enter Sub1" On Error Resume Next Sub2 Wscript.Echo "Leave Sub1" End Sub Sub Sub2 Wscript.Echo "Enter Sub2" Err.Raise 100 Wscript.Echo "Leave Sub2" End Sub
此示例通过向 Sub1
过程添加 On Error
语句来修改前面的示例。因此,当 Sub2
中的 Err.Raise
方法执行时,执行将在 Sub1
中继续执行下一条语句。请注意,“Leave Sub2”行永远不会执行。此示例的输出为:
Begin Enter Sub1 Enter Sub2 Leave Sub1 End
结构化异常处理
On Error
语句是结构化异常处理技术的一种简单形式。该技术背后的基本思想是将所有错误处理代码集中在程序主“流程”外部的单个位置。这就是 On Error
语句行为异常复杂的原因。
假设一个大型脚本可能包含许多以复杂方式交互的过程。当过程深度嵌套时,可能会发生错误。如果没有 On Error
语句,每个过程都必须将其错误代码返回给调用它的过程。反过来,该过程也必须执行相同的操作,依此类推,直到所有嵌套的过程。这会大大增加脚本的复杂性。
有了 On Error
语句,就可以避免这种复杂性。发生错误时,VBScript 会自动处理从复杂的过程嵌套中展开,返回到原始过程调用之后的语句。
RegExp 对象
第 3 章“VBScript 数据存储”中描述的 InStr
函数可用于搜索字符串以查看它是否包含另一个字符串。RegExp
对象通过使用正则表达式提供了更复杂的字符串搜索功能。
正则表达式是描述匹配模式的字符串。匹配模式提供了一个模板,可用于测试另一个字符串(搜索字符串)是否包含匹配的子字符串。在其最简单的形式中,匹配模式字符串只是一个必须匹配的字符序列。例如,模式“fred”匹配此确切的字符序列,并且仅匹配此序列。更复杂的正则表达式可以匹配文件名、路径名和 Internet URL 等项。因此,RegExp
对象通常用于验证数据的正确形式和语法。
要测试搜索字符串与匹配模式的匹配,请创建 RegExp
对象并设置匹配模式。然后使用 .Test
方法测试匹配。例如:
Dim oRE, bMatch Set oRE = New RegExp oRE.Pattern = "fred" bMatch = oRE.Test("His name was fred brown")
正则表达式对象使用 New
关键字创建,该关键字在第 9 章“Creating VBScript Classes”中有描述。这是 VBScript 的一个异常,因为除了用户定义的对象外,它是唯一以这种方式创建的对象。一旦这样创建,就可以像平常一样访问对象的属性和方法。
.Pattern
属性定义匹配模式,.Test
方法将提供的字符串与此匹配模式进行测试,如果字符串中找到匹配模式,则返回 True。在上例中,将 bMatch
设置为 True,因为显然存在匹配。
RegExp
对象的 .Execute
方法也检查模式匹配,但它返回一个 Matches
集合对象,其中包含有关每个模式匹配的详细信息。Matches
对象是一个普通集合对象,包含 .Count
属性和默认的 .Item
属性。Matches
对象中的每个项都是一个 Match
对象,用于描述特定的模式匹配。调用 .Execute
方法后,返回的 Matches
对象将包含搜索字符串中找到的每个匹配项的一个 Match
对象。
每个 Match
项有三个属性。.Value
属性包含搜索字符串中实际匹配的文本。.FirstIndex
属性包含匹配项在搜索字符串中第一个字符的索引。.Length
属性包含匹配字符串的长度。与其他 VBScript 字符串索引不同,.FirstIndex
属性使用 0 作为字符串中第一个字符的索引。因此,在使用此值与其他 VBScript 字符串函数结合使用之前,始终加一。
默认情况下,.Execute
方法仅匹配模式的第一个出现。如果将 .Global
属性设置为 True,则该方法会匹配字符串中的所有出现,并为每个匹配项返回一个 Match
对象。例如:
Dim oRE, oMatches Set oRE = New RegExp oRE.Pattern = "two" oRE.Global = True Set oMatches = oRE.Execute("two times three equals three times two") For Each oMatch In oMatches Wscript.Echo "Match:", oMatch.Value, "At:", oMatch.FirstIndex + 1 Next
此示例列出了在指定字符串中与模式“two”的所有匹配项。
像上例所示的简单匹配模式,其功能并不比 InStr
函数提供的更多。然而,通过使用搜索模式的特殊正则表达式功能,可以实现更强大的搜索。最容易通过第 7.1 节所示的 RegExp.vbs 示例脚本来探索这些功能。
Listing 7.1 RegExp.vbs Script '//////////////////////////////////////////////////////////////////////////// ' $Workfile: ShowArgs2.vbs $ $Revision: 5 $ $Date: 4/24/99 11:36a $ ' $Archive: /Scripts/ShowArgs2.vbs $ ' Copyright (c) 1999 Tim Hill. All Rights Reserved. '//////////////////////////////////////////////////////////////////////////// ' Process a regular expression pattern match ' First arg=regexp match pattern, second arg=search string Option Explicit ' Check for sufficient command line arguments Dim sPattern, sSearch If Wscript.Arguments.Count < 2 Then Wscript.Echo "usage: regexp <match-pattern> <search-string>" Wscript.Quit(1) End If sPattern = Wscript.Arguments(0) sSearch = Wscript.Arguments(1) ' Do the regular expression match Dim oRE, oMatches Set oRE = New RegExp oRE.Global = True oRE.IgnoreCase = True oRE.Pattern = sPattern Set oMatches = oRE.Execute(sSearch) ' Now process all the matches (if any) Dim oMatch Wscript.Echo "Pattern String: " & Chr(34) & sPattern & Chr(34) Wscript.Echo "Search String: " & Chr(34) & sSearch & Chr(34) & vbCRLF Wscript.Echo oMatches.Count, "Matches:" Wscript.Echo " " & sSearch For Each oMatch In oMatches Wscript.Echo " " & String(oMatch.FirstIndex, " ") & String(oMatch.Length, "^") Next '////////////////////////////////////////////////////////////////////////////
要使用 RegExp.vbs 脚本,请使用两个命令行参数执行该脚本。将匹配模式作为第一个参数,将搜索字符串作为第二个参数。如果任何参数包含空格或特殊 shell 字符,请将该参数括在双引号中。该脚本使用 RegExp
对象的 .Execute
方法查找所有匹配项,然后以图形方式显示这些匹配项。使用此脚本来试验以下段落中描述的各种高级正则表达式功能。(几个前面的 Wscript.Echo
语句使用了表达式 Chr( )
。这只是简单地求值为双引号字符。)
正则表达式语法
在匹配模式中,字母、数字和大多数标点符号会简单地匹配搜索字符串中的相应字符。这些字符的序列匹配搜索字符串中的等效序列。但是,匹配模式中的一些字符具有特殊含义。例如,“.”(句点)字符匹配除换行符以外的任何字符。因此,匹配模式“a.c”会匹配“abc”或“adc”或“a$c”。匹配模式“..”匹配任何两个字符的序列。
特殊字符“^”匹配字符串的开头。因此,匹配模式“^abc”匹配字符串“abc”,但不匹配“123abc”,因为该字符串不以“abc”开头。类似地,特殊字符“$”匹配字符串的结尾,因此模式“red$”匹配搜索字符串“fred”,但不匹配“fred brown”。
同时使用这两个字符允许正则表达式匹配完整的字符串。例如,模式“abc”匹配“123 abc that”以及任何包含“abc”的其他字符串,而模式“^abc$”仅匹配精确字符串“abc”。
字符“*”、“+”和“?”称为修饰符。这些字符会修改前面的字符。“*”修饰符匹配前面的字符零次或多次,“+”修饰符匹配前面的字符一次或多次,“?”修饰符匹配前面的字符零次或一次。例如,模式“a+”匹配任何由一个或多个“a”字符组成的序列,而模式“ab*c”匹配“abc”、“abbbbbc”和“ac”,但不匹配“adc”或“ab”。
括在方括号中的字符列表称为范围,它匹配搜索字符串中的单个字符与方括号中的任何字符。例如,模式“[0123456789]”匹配搜索字符串中的任何数字字符。像这样的范围,其中字符是连续的,可以缩写为“[0-9]”。例如,模式“[0-9a-zA-Z_]”匹配数字、字母(大写或小写)或下划线字符。如果范围的第一个字符是“^”,则该范围匹配列出的所有字符。例如,“[^0-9]”匹配任何非数字字符。
范围可以与修饰符结合使用。例如,模式“[0-9]+”匹配任何由一个或多个数字字符组成的序列。模式“[a-zA-Z][a-zA-Z_0-9]*”匹配有效的 VBScript 变量名,因为它仅匹配以字母开头并后跟零个或多个字母、数字或下划线字符的序列。
要匹配一个字符确切的次数,请在模式中将该字符后面跟上所需的匹配次数,并用花括号括起来。例如,模式“a{3}”匹配正好三个“a”字符,它等同于模式“aaa”。如果计数后有逗号,则该字符至少匹配指定的次数。例如,“a{5,}”匹配五个或更多“a”字符。最后,使用两个计数来指定下限和上限。例如,模式“a{4,8}”匹配四个到八个“a”字符。
与其他修饰符一样,模式计数修饰符可以与范围结合使用。例如,模式“[0-9]{4}”匹配正好四个数字。
在匹配模式中使用圆括号将单个项目分组。然后可以将修饰符应用于整个项目组。例如,模式“(abc)+”匹配序列“abc”的任何重复次数。模式“(a[0-9]c){1,2}”匹配字符串,如“a0c”和“a4ca5c”。
使用 RegExp 对象匹配模式“abc”和模式“(abc)+”之间存在差异。将模式“abc”与搜索字符串“abcabcabc”匹配会生成三个单独的匹配,并导致 Matches
集合中有三个 Match
对象。将模式“(abc)+”与同一字符串匹配会生成一个匹配,该匹配匹配整个字符串。
“|”竖线字符分隔备选子表达式列表。例如,模式“ab|ac”匹配字符串“ab”或“ac”。竖线分隔整个正则表达式。模式“^ab|ac$”匹配搜索字符串开头的字符串“ab”或搜索字符串结尾的字符串“ac”。使用圆括号在更大的模式中指定备选。例如,模式“^(ab|ac)$”仅匹配精确字符串“ab”或“ac”。
要字面上匹配模式中的任何特殊字符,它们必须前面加上反斜杠字符,这称为转义。例如,要匹配字面星号,请在模式中使用“\*”。要匹配反斜杠本身,请在匹配模式中使用两个反斜杠字符。在字面上用作匹配模式时,必须转义以下字符:
. (period) * + ? \ ( ) [ ] { } ^ $
还有几个额外的转义序列提供了对更复杂模式的有用快捷方式:
- “\d”转义匹配任何数字,等同于“[0-9]”。“\D”转义匹配任何非数字,等同于“[^0-9]”。
- “\w”转义匹配任何单词字符,等同于“[0-9a-zA-Z_]”,而“\W”转义匹配任何非单词字符。
- “\b”转义匹配单词边界,即任何单词字符与非单词字符之间的边界,而“\B”匹配非单词边界。
- “\s”转义匹配任何空白字符,包括空格、制表符、换行符等,而“\S”转义匹配任何非空白字符。
最后,某些转义可以匹配非打印字符,如下所示:
- “\f”转义匹配换页符。
- “\n”转义匹配换行符。
- “\r”转义匹配回车符。
- “\t”转义匹配制表符。
- “\v”转义匹配垂直制表符。
- “\onn”转义匹配八进制码为 nn 的字符。
- “\xnn”转义匹配十六进制码为 nn 的字符。
特殊转义“\n”,其中 n
是数字,匹配由圆括号中的子表达式先前匹配的搜索文本。匹配模式中的每个子表达式从左到右编号,转义“\n”匹配第 n 个子表达式。例如,模式“(..)\1”匹配任何重复两次的两个字符序列,如“abab”。第一个子表达式匹配前两个字符“ab”,然后“\1”转义再次匹配这两个相同的字符。
正则表达式示例
正则表达式匹配模式提供了一种验证字符串语法的功能。例如,脚本可以获取一个命令行参数,该参数是要创建的文件名。在创建文件之前,脚本可能希望验证命令行参数是否为有效文件名。可以使用正则表达式来实现此目的。
第 3 章中的 ParseArgs.vbs 脚本处理了 name=value 形式的命令行参数。此脚本很简单,因为它只是在“=”符号处拆分每个参数 - 没有尝试检查名称和值部分是否有效。以下正则表达式匹配这些命令行参数:
[^=]+=.*
此匹配模式的解释如下:范围“[^=]”匹配任何不是“=”符号的字符。“+”修饰符跟随该范围,表示该模式匹配任何由一个或多个不是“=”符号的字符组成的集合。模式中的下一个“=”符号匹配一个字面的“=”符号(即,名称和值部分之间的分隔符)。最后,“.*”模式匹配零个或多个字符的任何序列。
可以使用圆括号使含义更清晰。例如:
([^=]+)=(.*)
此示例与前面的示例相同,但圆括号有助于使模式的各个部分更易于理解。
通常,上例中的名称应限制为有效名称。我们将有效名称定义为以字母开头,后跟零个或多个字母、数字或下划线。这会产生一个新的正则表达式,如下所示:
([a-zA-Z]\w*)=(.*)
在这里,模式“[a-zA-Z]”匹配任何单个字母。然后模式“\w*”匹配零个或多个字母、数字或下划线,使用“\w”转义作为“[0-9a-zA-Z]”的快捷方式。
前面的正则表达式不允许名称前后有空格。例如,只有第一个字符串与表达式匹配:
account=123456 account = 575888 account = 5544
以下正则表达式通过在名称周围添加可选的前导和尾随空格来纠正此问题:
(\s*)([a-zA-Z]\w*)(\s*)=(.*)
新增的“\s*”匹配零个或多个空白字符。
这是一个使用此表达式验证命令行参数的示例脚本:
Dim oRE, oMatches, oMatch, sArg Set oRE = New RegExp oRE.Global = True oRE.IgnoreCase = True oRE.Pattern = "(\s*)([a-zA-Z]\w*)(\s*)=(.*)" For Each sArg In Wscript.Arguments Set oMatches = oRE.Execute(sArg) If oMatches.Count > 0 Then Wscript.Echo "Valid argument: " & sArg Else Wscript.Echo "Invalid argument: " & sArg End If Next
另一个示例,我们可以将命令行开关定义为以下形式的参数:
/name[:|=value]
另一种定义命令行开关的方法是,以斜杠开头并以名称结尾的参数。名称后可以跟一个可选的值,该值由冒号或等号分隔。以下是有效的示例开关:
/b /file=c:\myfile.txt /debug:on
这是匹配命令行开关的正则表达式:
(\s*)/([a-zA-Z]\w*)((=I:)(.*)I)
这个复杂的表达式分解如下:
- “(\s*)/”模式匹配任何前导空格后跟斜杠字符。
- “([a-zA-Z]\w*)”模式匹配名称,如前例所示。
- “(=|:)(.*)”模式匹配等号或冒号,后跟任意字符序列。
- “((=|:)(.*))?”使“(=|:)(.*)”成为可选的,通过匹配此模式或不匹配。
使用 .Replace
方法
将模式与字符串匹配允许脚本确定字符串是否遵循特定语法,如前面的示例所示。RegExp
对象还可用于协助修改搜索字符串。此功能由 .Replace
方法提供,该方法接受两个参数:搜索字符串和替换字符串,并返回一个新字符串,其中搜索字符串中的所有匹配项都已替换为替换字符串。例如:
Set oRE = New RegExp oRE.Global = True oRE.Pattern = "a" Wscript.Echo oRE.Replace("all a’s are replaced", "X")
在此示例中,任何“a”字符在搜索字符串中都被替换为“X”字符。模式和替换字符串不必长度相同。例如:
oRE.Pattern = "\s+" Wscript.Echo oRE.Replace("compress all whitespace ", " ")
在这里,所有空白序列都被替换为单个空格字符。
在替换字符串中,允许使用特殊字符序列“$n”。如果存在,此序列将被模式中第 n 个子表达式匹配的文本替换。例如:
oRE.Pattern = "^\s*(\w+)\s*=\s*(\w+)\s*$" sSearch = " this = that" Wscript.Echo oRE.Replace(sSearch, "$1,$2")
此示例的工作原理如下:
- 模式同时包含字符串开头“^”和字符串结尾“$”字符。这意味着该模式要么匹配整个搜索字符串,要么根本不匹配。
- 该模式匹配任何空白字符和后跟一个或多个单词字符的序列,然后是更多空白字符,一个“=”号,更多空白字符,另一组单词字符,最后是更多空白字符。
- 单词模式都放在圆括号中,将它们标记为子表达式 1 和 2,分别。
- 当调用 .
Replace
方法时,它会成功匹配整个搜索字符串。这意味着替换字符串替换了搜索字符串的全部内容,因为整个字符串匹配正则表达式。因此,.Replace
返回的字符串就是替换字符串。 - 替换字符串是“$1,$2”。如前所述,模式中的两个子表达式包含在搜索字符串中匹配的两个单词,在本例中为“this”和“that”。因此,替换字符串变为“this,that”,这就是返回的值。
此处理的结果是,RegExp
对象已使用匹配模式验证了搜索字符串,并从搜索字符串中提取了所需的元素。在第 11 章“A Script Developer’s Toolkit”中可以找到此 RegExp
对象用法的其他示例。
Dictionary 对象
Dictionary
对象用于以(键,项)对的形式存储一组数据值。字典有时称为关联数组,因为它将键与项关联起来。键的行为类似于数组中的索引,只是数组索引是数字的,而键是任意字符串。单个 Dictionary
对象中的每个键都必须是唯一的。
Dictionary
对象的 ProgID 是“Scripting.Dictionary”,因此以下示例创建一个 Dictionary
对象:
Dim oDict
Set oDict = CreateObject("Scripting.Dictionary")
Dictionary 对象有一个属性,在存储任何数据值到字典之前应该设置该属性。.CompareMode
属性有两种模式,用于控制如何比较单个键。如果模式为 vbBinaryCompare
(默认),则键中的大写和小写字母被视为不同。如果模式为 vbTextCompare,则键中的大写和小写字母被视为相同。这意味着二进制模式下的 Dictionary
对象可以包含两个键“Key”和“key”,而在文本模式下,它们将被视为相同的键。
要向 Dictionary 添加值,请使用 .Add
方法。例如:
Dim oDict Set oDict = CreateObject("Scripting.Dictionary") oDict.CompareMode = vbBTextCompare oDict.Add "Pastrami", "Great" oDict.Add "Roast Beef", "OK on Sunday" oDict.Add "Salami", "Not so good"
.Add
方法的第一个参数是键值,第二个参数是项值。可以添加到字典中的值数量没有限制。要从字典中删除值,请使用 .Remove
方法并指定要删除的键。例如:
oDict.Remove "Salami"
要删除所有值并清空字典,请使用 .RemoveAll
方法。使用 .Count
属性获取字典中值的计数。
.Exists
方法在指定的键存在于字典中时返回 True。例如:
If oDict.Exists("Pastrami") Then Wscript.Echo "Pastrami is available today."
要检索给定键的项值,请使用 .Item
属性。这是 Dictionary
对象的默认属性。例如:
If oDict.Exists("Salami") Then Wscript.Echo oDict("Salami")
在这里,Wscript.Echo
语句显示存储在字典中“Salami”键的项值。
使用 .Key
属性更改给定键的键值。例如:
oDict.Key("Salami") = "Italian Salami"
.Keys
和 .Items
方法返回一个包含字典中所有键或项的数组。例如:
aMeats = oDict.Keys aComments = oDict.Items
字典通常用于需要按名称存储和检索某些项的情况。例如,字典可以包含系统定义的全部环境变量或注册表项关联的全部值。但是,字典每个键值只能存储一项。也就是说,字典键必须全部唯一。
WSH 对象
Windows Script Host 为脚本提供了以下对象:
Wscript
对象,它提供对核心 WSH 操作的访问。WshArguments
对象,它提供对命令行参数的访问。WshNetwork
对象,它提供对网络共享和信息的访问。WshShell
对象,它提供对杂项系统功能的访问。WshEnvironment
对象,它提供对系统环境变量的访问。- WshShortcut 和
WshUrlShortcut
对象,它们提供对文件系统快捷方式的访问。
Wscript 对象
Wscript
对象提供对核心 WSH 信息。此对象由 WSH 为所有脚本预定义,无需声明或创建。Wscript
对象的方法已在其他地方介绍过。.CreateObject
和 .GetObject
方法在第 6 章“Introducing Objects”中进行了描述,而 .Echo
和 .Quit
方法在第 2 章“VBScript Language Essentials”中作为特殊“语句”进行了描述,尽管现在应该清楚这些实际上是对象方法。
除了这些方法之外,Wscript
对象还具有一些属性:
- .
FullName
属性包含用于运行脚本的 WSH 可执行文件的完整路径名。 .Name
属性包含用于运行脚本的 WSH 可执行文件的友好名称(标题)。- .
Path
属性包含 WSH 可执行文件的路径(即文件夹名称)。 - .
ScriptFullName
属性包含脚本文件的完整路径。 - .
ScriptName
属性包含脚本文件的完整名称,不包含路径。 - .
Version
属性以字符串形式包含 WSH 的版本。请注意,这与使用ScriptEngineMajorVersion
和ScriptEngineMinorVersion
函数恢复的 VBScript 版本不同。这些函数返回 VBScript(脚本引擎)的版本,而.Version
属性返回 WSH(脚本主机)的版本。有关主机和引擎的讨论,请参阅引言。
Wscript
对象不提供脚本文件所在的文件夹名称。但是,可以很容易地从 .ScriptFullName
属性派生出该信息。例如:
g_sScriptPath = Wscript.ScriptFullName g_sScriptName = Wscript.ScriptName g_sScriptFolder = Left(g_sScriptPath, Len(g_sScriptPath) - Len(g_sScriptName))
Wscript
对象的 .Sleep
方法使脚本执行暂停指定的毫秒数。例如:
Wscript.Sleep 5000
这会暂停脚本执行 5 秒钟。在脚本执行暂停期间,仍会处理对象事件。
WshArguments 对象
WshArguments
对象封装了提供给脚本的命令行参数。此对象已在示例(如 ShowArgs1.vbs)中广泛使用。Wscript
对象的 Wscript.Arguments
属性返回此对象。
.Count
属性返回命令行参数的数量,而 .Item
属性通过索引返回单个参数。这是 WshArguments
对象的默认属性。
当 WSH 将命令行解析为参数时,它首先删除 WSH 可执行程序直接处理的参数。这些参数都以双斜杠开头,并且不会作为 WshArguments
对象的一部分传递给脚本。然后,剩余的参数通过此对象传递给脚本。单个命令行参数由一个或多个空格分隔。要在参数中包含空格,请将参数括在双引号中。双引号本身不包含在 WshArguments
对象返回的参数文本中。
WshNetwork 对象
WshNetwork
对象提供用于操作网络打印机和驱动器管理的方法。该对象的 ProgID 是“Wscript.Network”,因此以下示例创建一个 WshNetwork
对象:
Dim oNet
Set oNet = CreateObject("Wscript.Network")
WshNetwork
对象支持以下属性:
- .
ComputerName
属性返回计算机的 NetBIOS 名称。 - .
UserDomain
属性返回用户所属的域的名称。 - .
UserName
属性返回当前登录用户的名称。
例如
Dim oNet Set oNet = CreateObject("Wscript.Network") Wscript.Echo "User: " & oNet.UserDomain & "\" & oNet.UserName
WshNetwork
对象可以管理到远程计算机共享目录的连接。使用 .MapNetworkDrive
方法将网络驱动器映射到本地驱动器号。第一个参数指定驱动器号;第二个参数指定要映射的网络共享的 UNC 名称。例如:
oNet.MapNetworkDrive "S:", "\\SERVER1\Setup" oNet.MapNetworkDrive "L:", "\\SERVER1\Library"
.MapNetworkDrive
方法最多支持三个可选参数。第一个参数指定驱动器映射是否应持久化。默认值为 False。如果此参数为 True,则驱动器映射会记录在注册表中,并在用户下次登录时恢复。最后两个参数可以指定用于连接到指定共享的备用用户名和密码。例如:
oNet.MapNetworkDrive "P:", "\\Server2\BobConner", False, "MYDOMAIN\BConner", "secret"
此示例将一个非持久化共享映射到本地驱动器 P:
,使用指定的域帐户和密码。
.RemoveNetworkDrive
方法删除网络驱动器映射。指定要删除的驱动器的驱动器号。例如:
oNet.RemoveNetworkDrive "S:"
此方法还支持两个可选参数。第一个参数(如果为 True)指定即使驱动器映射当前正在使用,也要删除它。默认值为在使用时删除映射。第二个参数(如果为 True)指定删除是持久的。也就是说,如果驱动器映射先前设置为持久化,则删除该驱动器映射的注册表数据。
.EnumNetworkDrives
方法返回一个 WshCollection
对象,其中包含当前所有网络驱动器映射的列表。WshCollection
对象中的项是成对的。对中的第一项是本地驱动器号;第二项是 UNC 路径。该集合还包括所有直接连接到共享而没有中间驱动器号的网络共享连接。对于这些连接,驱动器号字符串为空。例如,此脚本在其输出中用“- -”替换没有驱动器号的驱动器:
Dim oNet, oDrives, ix, sDrive, sUNCPath Set oNet = CreateObject("Wscript.Network") Set oDrives = oNet.EnumNetworkDrives Wscript.Echo oDrives.Count / 2, "Network Connections" For ix = 0 To oDrives.Count - 2 Step 2 sDrive = oDrives(ix) sUNCPath = oDrives(ix+1) If sDrive = "" Then sDrive = "--" Wscript.Echo "Drive: " & sDrive, "UNC Path: " & sUNCPath Next
WshNetwork
对象可以以与处理网络共享连接类似的方式管理网络打印机连接。.AddPrinterConnection
方法添加新的打印机连接。它使用与 .MapNetworkDrive
方法相同的参数,不同之处在于第一个参数映射的是打印机端口名称。例如:
<CODE>oNet.AddPrinterConnection "LPT1:", "\\PrintServer\HPLaser1"
.AddPrinterConnection
方法还支持 .MapNetworkDrive
方法的相同三个可选参数。
.RemovePrinterConnection
方法删除网络打印机连接。它支持与 .RemoveNetworkDrive
方法相同的参数。.SetDefaultPrinter
方法选择默认打印机。打印机名称可以是本地打印机名称(如“LPT1:”)或共享名称(如“\\Server\HP100”)。
.EnumPrinterConnections
方法以类似于 .EnumNetworkDrives
方法的方式枚举打印机连接。它返回一个 WshCollection
对象,其中包含字符串对,指定本地打印机名称和打印机共享名称。例如:
Dim oNet, oPrinters, ix, sPrinter, sUNCPath Set oNet = CreateObject("Wscript.Network") Set oPrinters = oNet.EnumPrinterConnections Wscript.Echo oPrinters.Count / 2, "Network Connections" For ix = 0 To oPrinters.Count - 2 Step 2 sPrinter = oPrinters(ix) sUNCPath = oPrinters(ix+1) If sPrinter = "" Then sPrinter = "--" Wscript.Echo "Printer: " & sPrinter, "UNC Path: " & sUNCPath Next
注意
WshNetwork
对象管理的打印机连接与NET USE
shell 命令管理的打印机连接相同。Windows NT 和 Windows 2000 计算机并不总是以这种方式使用映射到本地设备的打印机,因此并非所有活动打印机都显示为打印机连接。
WshShell 对象
WshShell
对象提供对多个系统级功能的访问,包括注册表、系统环境变量、特殊文件夹和快捷方式。WshShell
对象的 ProgID
是“Wscript.Shell”。
.SpecialFolders
属性提供对 Windows 环境中具有特殊外壳意义的各种文件夹的访问。切勿直接按名称访问这些文件夹,因为名称因区域设置而异,用户也可能更改名称。相反,使用 .SpecialFolders
属性间接访问文件夹信息。此属性返回一个集合对象,其中包含所有特殊文件夹的名称。然后通过指定所需文件夹的类型来间接访问它们。例如:
Dim oShell, oSpecialFolders Set oShell = CreateObject("Wscript.Shell") Set oSpecialFolders = oShell.SpecialFolders Wscript.Echo "Your documents are stored in: " & oSpecialFolders("MyDocuments")
表 7.1 列出了可以通过此集合访问的各个特殊文件夹。
表 7.1 特殊文件夹
文件夹名称 含义
"AllUsersStartMenu" | 存储所有用户开始菜单中项目的文件夹 |
"AllUsersDesktop" | 存储所有用户桌面上可见的项目的文件夹 |
"AllUsersPrograms" | 存储所有用户开始程序菜单中项目的文件夹 |
"AllUsersStartup" | 存储所有用户开始程序启动菜单中项目的文件夹 |
"Desktop" | 此用户桌面项目的文件夹 |
"Favorites" | 此用户 Internet 收藏夹的文件夹 |
"Fonts" | 存储字体的文件夹 |
"MyDocuments" | 用户存储文档的默认文件夹 |
"Programs" | 存储此用户开始程序菜单中项目的文件夹 |
"Recent" | 存储此用户最近打开的文档快捷方式的文件夹 |
"StartMenu" | 存储此用户开始菜单中项目的文件夹 |
"Startup" | 存储此用户开始程序启动菜单中项目的文件夹 |
WshShell
对象的 .Run
方法允许脚本执行任何其他应用程序或命令行。该方法至少需要一个参数,该参数指定要执行的命令行,包括任何命令行参数。例如:
Dim oShell Set oShell = CreateObject("Wscript.Shell") oShell.Run("notepad")
此示例启动了一个 Windows Notepad 的副本。.Run
命令接受可以在 Windows 命令行提示符下输入的任何命令。
.Run
方法接受两个可选参数。第一个参数指定如何出现在桌面上的任何应用程序,如下所示:
- 值为 0 时,应用程序以隐藏方式启动。用户在桌面上看不到该应用程序。
- 值为 1(默认)时,应用程序以正常窗口方式启动。
- 值为 2 时,应用程序最小化启动。
- 值为 3 时,应用程序最大化启动。
- 值为 10 时,应用程序以与脚本本身相同的状态启动。例如,如果脚本最小化,应用程序也将最小化。
.Run
方法的最后一个参数决定脚本是否等待命令完成执行。如果此参数为 False(默认),脚本将立即继续执行,不等待命令完成。在这种情况下,.Run
方法始终返回 0。如果参数为 True,脚本将暂停执行直到命令完成,并且 .Run
方法的返回值是应用程序的退出代码。例如:
Dim oShell, nError Set oShell = CreateObject("Wscript.Shell") nError = oShell.Run("net start spooler", 1, True) If nError = 0 Then Wscript.Echo "Spooler service started."
使用 WshShell 对象进行注册表访问
WshShell
对象提供了三个方法,可提供对系统注册表的基本访问:
- .
RegDelete
方法删除注册表项或值。 - .
RegRead
方法读取注册表值。 - .
RegWrite
方法写入注册表值。
注意
修改注册表,虽然有时是必要的,但应谨慎进行。注册表的无意更改可能导致系统不稳定或无法正确启动操作系统。始终在不包含实时数据且可在发生灾难时恢复的测试系统上调试和验证修改注册表的脚本。
所有方法都通过键名或值名访问注册表项。名称必须以预定义的键名之一开头:
HKEY_CURRENT_USER
或HKCU
,用于访问当前用户的每个用户信息。HKEY_LOCAL_MACHINE
或HKLM
,用于访问每台计算机信息。HKEY_CLASSES_ROOT
或HKCR
,用于访问每台计算机的类信息。HKEY_USERS
,用于访问其他用户和默认用户。HKEY_CURRENT_CONFIG
,用于访问配置数据。
在预定义的键名之后,是一个或多个由反斜杠分隔的键名。以反斜杠结尾的名称假定为指定键名,否则该名称假定为指定值名。
使用 .RegDelete
方法从注册表中删除项或值。指定要删除的项的名称。例如:
Dim oShell Set oShell = CreateObject("Wscript.Shell") oShell.RegDelete "HKCU\Software\AcmeCorp\WindowSize" oShell.RegDelete "HKCU\Software\AcmeCorp\"
在这里,删除了一个注册表值,然后是一个项。.RegDelete
方法不能删除包含任何子项的项,尽管它可以删除包含一个或多个值的项。
.RegRead
方法从注册表中读取值。如果名称指定了一个项,则读取该项的默认值,否则从指定的项中读取指定的值。例如:
Wscript.Echo oShell.RegRead _
"HKLM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName"
.RegWrite
方法将值写入注册表。如果名称指定了一个项,则写入该项的默认值。否则,写入指定的值。例如:
oShell.RegWrite "HKCU\Software\AcmeCorp\LastRunDate", Date
.RegWrite
方法支持一个可选参数,该参数指定要写入注册表的数据类型。它可以是以下之一:
- "REG_SZ" 或 "REG_EXPAND_SZ",用于写入字符串值。
- "REG_DWORD",用于写入 32 位整数值。
- "REG_BINARY",用于写入 32 位二进制值。
使用 WshShell 对象进行应用程序控制
WshShell
对象提供对两个方法的访问,可用于控制 Windows 应用程序。这些方法仅与非 COM 应用程序一起使用。COM 应用程序和对象使用第 6 章中介绍的对象技术进行操作。
对于较旧的遗留应用程序,WshShell
对象提供了 .AppActivate
和 .SendKeys
两个方法,可用于控制该应用程序。
.AppActivate
方法用于激活正在运行的应用程序并将输入“焦点”切换到该应用程序。此方法不运行应用程序,仅切换到该应用程序的焦点。要运行应用程序,请使用 .Run
方法。
要激活应用程序,请将其窗口标题(显示在窗口顶部的文本)作为单个参数指定。例如:
Dim oShell Set oShell = CreateObject("Wscript.Shell") oShell.AppActivate "Calculator"
在这里,应用程序“Calculator”(Windows 计算器小程序)被激活。
.AppActivate
方法首先尝试查找一个窗口,其标题文本与提供的参数完全匹配。如果未找到匹配项,该方法会查找一个标题以指定文本开头的窗口。最后,如果仍未找到匹配项,该方法会查找一个标题以指定文本结尾的窗口。这允许 .AppActivate
与将文档名称添加到窗口标题文本的应用程序一起工作。
提供的第二个用于控制遗留应用程序的方法是 .SendKeys
,它用于将击键发送到当前具有焦点的应用程序。因此,在使用 .SendKeys
之前,通常会使用 .AppActivate
方法来确保正确的应用程序接收指定的击键。
.SendKeys
方法将击键发送到应用程序,就像它们是从系统键盘输入一样。因此,通过发送正确的击键序列,可以像交互使用一样通过脚本来驱动应用程序。
要使用 .SendKeys
,请将击键序列指定为字符串参数。例如:
Dim oShell Set oShell = CreateObject("Wscript.Shell") oShell.AppActivate "Calculator" oShell.SendKeys "1000"
在这里,计算器程序被发送值 1000。
.SendKeys
方法的字符串参数中的某些字符具有特殊含义。表 7.2 显示了这些字符。
表 7.2 .SendKeys 字符串中的特殊字符
字符 含义
{BS} | 发送退格键。 |
{BREAK} | 发送 Break 键。 |
{CAPSLOCK} | 发送大写锁定键。 |
{DEL} | 发送 Delete 键。 |
{DOWN} | 发送向下箭头键。 |
{END} | 发送 End 键。 |
{Enter} 或 ~ | 发送 Enter 键。 |
{ESC} | 发送 Esc 键。 |
{HELP} | 发送帮助(F1)键。 |
{HOME} | 发送 Home 键。 |
{INS} | 发送 Insert 键。 |
{LEFT} | 发送左箭头键。 |
{NUMLOCK} | 发送 Num Lock 键。 |
{PGDN} | 发送 Page Down 键。 |
{PGUP} | 发送 Page Up 键。 |
{RIGHT} | 发送右箭头键。 |
{SCROLLLOCK} | 发送 Scroll Lock 键。 |
{TAB} | 发送 Tab 键。 |
{UP} | 发送向上箭头键。 |
{Fn} | 发送 Fn 键(例如,{F1} 发送 F1,{F10} 发送 F10 等)。 |
{+} | 发送 + 键。 |
{^} | 发送 ^ 键。 |
{%} | 发送 % 键。 |
{~} | 发送 ~ 键。 |
{(} | 发送开圆括号键。 |
{)} | 发送闭圆括号键。 |
{{} | 发送开花括号键。 |
{}} | 发送闭花括号键。 |
+key | 按住 Shift 键发送 key。 |
^key | 按住 Ctrl 键发送 key。 |
%key | 按住 Alt 键发送 key。 |
{keycount} | 将 key 发送 count 次。 |
在 .SendKeys
字符串中,具有特殊含义的字符(例如“+”或“~”)如果需要字面上发送,则必须括在花括号中。否则,如表 7.2 所示,它们用于修改字符的发送方式。例如,字符串“^S”将单个 Ctrl+S 击键发送到应用程序,而字符串“{^}S”则发送一个插入符号字符后跟一个大写 S。
“+”、“^”和“%”字符可以组合使用。例如,字符串“+^A”将 Shift+Ctrl+A 击键发送到应用程序。
要发送带有修饰键(Ctrl 等)按下的击键序列,请将击键括在圆括号中。例如,字符串“+(ABC)”将“A”、“B”和“C”三个键发送,同时按住 Shift 键。
要指定重复的击键,请在花括号中指定键和重复计数。例如,字符串“{X 10}”将 10 个“X”键发送到应用程序。
将事件添加到事件日志
WshShell
对象提供一个方法 .LogEvent
,用于将事件添加到系统事件日志。在 Windows NT 和 Windows 2000 上,此方法将事件添加到应用程序事件日志。在 Windows 9x 上,此方法将事件添加到 Windows 目录中名为 WSH.log 的文件中。
.LogEvent
方法接受三个参数。第一个参数指定事件类型。事件类型如表 7.3 所示。
表 7.3 事件类型
代码 含义
0 | 成功事件。表明某个操作已成功。 |
1 | 错误事件。表明发生错误。 |
2 | 警告事件。表明应纠正但未致命的情况。 |
4 | 信息事件。提供一般信息。 |
8 | 审核成功。一个已成功的审计事件。 |
16 | 审核失败。一个失败的审计事件。 |
.LogEvent
方法的第二个参数指定要记录的任意文本字符串。这通常包含描述正在记录的事件的信息性消息。
最后一个参数(在 Windows NT 和 Windows 2000 上是可选的,在 Windows 9x 上被忽略)指定要在其上记录事件的计算机名称。如果未指定,则默认在本机计算机上记录事件。
例如
Dim oShell Set oShell = CreateObject("Wscript.Shell") oShell.LogEvent 1, "Script processing failed."
WshEnvironment 对象
WshShell
提供了两种访问系统环境字符串的方法。.ExpandEnvironmentStrings
方法处理一个字符串,并将任何对环境变量的引用替换为这些变量的值。环境变量像往常一样用“%”符号括起来,用于命令 shell 处理。例如:
Dim oShell Set oShell = CreateObject("Wscript.Shell") Wscript.Echo oShell.ExpandEnvironmentStrings("The temp dir is %TEMP%")
WshShell
对象的 .Environment
属性返回一个 WshEnvironment
对象,然后该对象可以访问单个环境变量。返回的对象可以通过指定字符串参数来访问四组中的一个环境变量,如下所示:
- "System" 系统环境变量,存储在注册表的
HKEY_LOCAL_MACHINE
部分。 - "User" 用户环境变量,存储在注册表的
HKEY_CURRENT_USER
部分。 - "Volatile" 易失性环境变量,在系统启动和登录过程中即时构建。
- "Process" 进程环境变量。这些包括所有系统、用户和易失性变量,还包括当前进程或启动当前脚本的进程创建的任何变量。
通常在读取变量时使用“Process”集。要使对变量的更改持久化,请使用“System”或“User”集。
获得 WshEnvironment
对象后,可以单独操作变量。WshEnvironment
是一个集合对象。例如:
Dim oShell, oEnv Set oShell = CreateObject("Wscript.Shell") Set oEnv = oShell.Environment("Process") For Each sItem In oEnv Wscript.Echo sItem Next
要更改环境变量的值或添加新变量,请指定要更改或添加的项的名称并为其分配一个值。例如:
oEnv("Path") = oEnv("Path") & ";c:\myapp"
此示例将一个附加的路径名添加到 PATH 环境变量的末尾。
.Remove
方法删除一个环境变量。例如:
oEnv.Remove "TempDir"
请注意,对进程集环境变量的更改仅限于脚本进程及其使用 WshShell.Run
方法创建的任何进程。它们对系统中的其他进程不可见。
WshShortcut 和 WshUrlShortcut 对象
WshShell
对象提供对两种不同类型的快捷方式的访问:文件快捷方式和 URL 快捷方式。两者都存储在小型文件中。文件快捷方式提供对另一个位置的文件的链接,而 URL 快捷方式提供对网站或 Internet 资源的链接。
要创建快捷方式,请使用 .CreateShortcut
方法。指定要创建的快捷方式文件的完整路径名。此文件名必须以 .LNK
(常规文件快捷方式)或 .URL(Internet URL 快捷方式)的文件类型结尾。例如:
Dim oShell, oSC, oURL Set oShell = CreateObject("Wscript.Shell") Set oSC = oShell.CreateShortcut("c:\MyDocs.LNK") Set oURL = oShell.CreateShortcut("c:\MySite.URL")
创建快捷方式对象后,设置快捷方式的属性,然后使用 .Save
方法将信息保存在快捷方式文件中。
常规文件快捷方式支持以下属性:
.Arguments
使用此属性设置在快捷方式执行时传递给目标应用程序的其他参数。.Description
使用此属性为快捷方式添加描述性文本。.IconLocation
使用此属性指定快捷方式图标的位置。指定一个包含路径名和图标索引的字符串。如果未指定图标,则使用适合快捷方式目标的图标。.TargetPath
使用此属性指定目标应用程序或文档的完整路径名。始终指定完整路径名,包括驱动器号或 UNC 名称。.WorkingDirectory
使用此属性指定快捷方式执行时用作工作目录的目录。默认值为当前工作目录。.WindowStyle
使用此属性指定应用程序启动时的初始窗口位置。有关窗口样式的更多信息,请参阅本章前面关于WshShell.Run
方法的讨论。
Internet URL 快捷方式支持以下属性:
.TargetPath
使用此属性指定 Internet 位置的完整 URL。
例如
Dim oShell, oSC, oURL Set oShell = CreateObject("Wscript.Shell") oSC = oShell.CreateShortcut("c:\MyDocs.LNK") oURL = oShell.CreateShortcut("c:\MySite.URL") oSC.TargetPath = "e:\Users\Me\MyDocs" oURL.TargetPath = "http://www.macmillantech.com" oSC.Save oURL.Save
摘要
VBScript 的 Err
、RegExp
和 Dictionary
对象提供了其他功能来协助脚本的开发。RegExp
对象特别适合解码和验证文本信息。当需要按文本键存储和索引信息项时,字典非常有用。
Wscript
对象提供对各种脚本级别信息的访问,例如当前正在执行的脚本的名称。该对象还提供对 WshArguments
对象的访问,该对象封装了脚本命令行参数。
WshNetwork
对象提供对登录帐户信息以及文件和打印机共享的访问。WshShell
对象提供对其他几个内部对象的访问,包括用于操作系统环境字符串和系统快捷方式的对象。它还提供对系统注册表和各种特殊文件夹的访问。