VBS脚本运行库手册(3)-文件夹属性

发布时间:2020-11-18编辑:脚本学堂
VBS脚本运行库手册,文件夹属性。

获得文件夹属性

因为文件夹是一个 COM 对象,它们的属性可以被获得和列举出来,为了列举详细的文件夹信息,你可以用文件夹对象,它是 FSO 的组件之一。文件夹对象的属性列举在了下表中。
Attributes             关于文件夹的属性信息。
DateCreated          文件夹创建的日期
DateLastAccessed           用户最后访问这个文件夹的日期
DateLastModified     用户最后更改文件夹属性的日期
Drive               磁盘信息包括拖尾符号(比如,C:)标识文件夹所在的磁盘
Files                存储在这个文件夹中所有文件的信息。
IsRootFolder           Boolean 值来表明这个文件夹是否是根文件夹
Name              文件夹的名字但不包括路径信息
ParentFolder           文件夹存放的父文件夹的名字
Property                Description
Path                         文件夹的路径
ShortName             MS-DOS 类型的文件夹的名字,遵循 8.3 的命名规则。
ShortPath               MS-DOS 类型的文件夹的名字,遵循 8.3 的命名规则。
Size                    文件夹的大小,单位是 bytes,包含子文件和子文件夹的大小在内。
SubFolders              第一层的子文件夹。在 Subfolders 中的子文件夹不在此列中。
Type              对于文件夹的描述

列举文件夹的属性
为了得到一个文件夹的属性,一个脚本必须:
1.创建一个 FSO 实例
2.用 GetFolder 的方法绑定特定文件夹
3.用 Echo 的方法显示属性。

当你对一个文件夹的属性进行操作的时候,注意文件的属性和子文件夹的属性是以集合的形式返回的,不是单独返回一个的。此外Attributes 属性返回一个属性值。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:FSO")
Wscript.Echo "Date created: " & objFolder.DateCreated
Wscript.Echo "Date last accessed: " & objFolder.DateLastAccessed
Wscript.Echo "Date last modified: " & objFolder.DateLastModified
Wscript.Echo "Drive: " & objFolder.Drive
Wscript.Echo "Is root folder: " & objFolder.IsRootFolder
Wscript.Echo "Name: " & objFolder.Name
Wscript.Echo "Parent folder: " & objFolder.ParentFolder
Wscript.Echo "Path: " & objFolder.Path
Wscript.Echo "Short name: " & objFolder.ShortName
Wscript.Echo "Short path: " & objFolder.ShortPath
Wscript.Echo "Size: " & objFolder.Size
Wscript.Echo "Type: " & objFolder.Type

管理文件夹的属性
文件系统支持属性的定义。就是文件夹中和文件夹名字和文件夹大小无关的信息。例如如果你在 Windows 浏览器中右击某个数据夹的时候,点 Properties 你就可以访问文件夹的属性了。
FSO 可以返回几个关于文件夹信息的重要属性。这些属性和相应的值,列举在下表中:
Hidden        2            隐藏,就是在 Windows 浏览器中不可见
System        4        表示它是一个系统文件夹。建议不要更改系统文件夹的内容。
Directory      16          应用到所有的文件夹的标准值。所有可以被 FSO 访问的文件夹读有这个值,最小位 16。
Archive        32             存盘的属性用在备份程序中,用来决定文件是否需要备份。
如果这个值 enabling 表示文件夹在下一次增量备份中会备份。如果
是disabling 表示不在下一次增量备份中备份
Compressed       2048     表明这个文件夹是否是压缩的

虽然这些看起来很简单,但是从 FSO返回的数据看起来会让你感到很迷惑。例如,你返回一个文件夹的属性值,你或许会看到20,但是这个值并不是像上面一样的标准值。此外,你可能会获得一个单独的值,虽然这个文件夹有说有的属性。这种情况是,脚本并不是返回如 2,4,16,32,2048 这样的值,而只是返回一个 2102。这是因为这些值是以位图的形式显示的。
Note:对于属性值,它返回和存储的数据是以位图的形式的。对于位图你应该不会奇怪,比如后缀名为.bmp 的图形文件

Working with Bitmaps
位图看起来就是一系列的开关。如果特定的开关是关闭的,那么这个开关的值就是 0,如果是开启的,比如文件夹对象吧,它就具有上表中所列出的值。而位图的值就是这些开关的值的总和。如果你用脚本查询这个文件夹的属性,脚本就返回一个值为 16.

与其相反,如果有三个开关是开启的:隐藏(值是2),Directory(值是16),压缩(值是 2048).那么这个位图的值应该是 2+16+2048,或者值是 2066。这个也是用脚本查询的时候返回的值。位图被设计成只是有一种办法来获取特定的值。得到值 2066 的方法只有一个就是压缩和隐藏。你不可能通过别的数学方法来算得这样的值。

这个设计可以返回值并且决定哪个开关没有开哪个没有开。这个可以允许你来判断文件夹的哪个属性设定了。如果你得到了这个 2066 的值,那么它的属性就是隐藏压缩的文件夹。幸运的是,你不必去作任何单独的数字运算,你可以用逻辑与 AND 操作来决定哪个开关是否是on 还是 off。例如如下代码查询文件夹是否是隐藏的,如果是回显一个信息框: Hidden folder
If objFolder.Attributes AND 2 Then
   Wscript.Echo "Hidden folder."
End If
或者:  If objFolder.Attributes AND 16 Then

下列脚本先绑定文件夹 C:FSO,然后回显文件夹属性:
注:这个其实是挨个匹配的,所以你要是测试了两个属性,它都会显示出来的。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:FSO")
If objFolder.Attributes AND 2 Then
   Wscript.Echo "Hidden folder."
End If
If objFolder.Attributes AND 4 Then
   Wscript.Echo "System folder."
End If
If objFolder.Attributes AND 16 Then
   Wscript.Echo "Folder."
End If
If objFolder.Attributes AND 32 Then
   Wscript.Echo "Archive bit set."
End If
If objFolder.Attributes AND 2048 Then
  Wscript.Echo "Compressed folder."
End If

改变文件夹属性

文件夹的每个属性可以看成一个个开关,如果关于隐藏的开关是ON 的,那么这个文件夹就是隐藏的,如果这个开关是 OFF 的,那么这个文件夹就不是隐藏的,你可以选择打开或者关掉它们,对于文件夹的属性也是如此:对于其它的开关,你可以将属性设置为开或者设置为关,你可以用脚本来控制这些开关的,最简单的控制属性开关的办法是用如下的程序:
1. 用 GetFolder 的方法来绑定到一个文件夹。
2. 检查你需要更改的值。例如你想隐藏一个文件夹,看这个文件夹是否是已经隐藏了
3. 如果这个文件夹是隐藏的,用 XOR 操作来将开关转换成非隐藏的。如果这个文件夹不是隐藏的,注意不要用 XOR,如果你用了,开关会被触发,文件夹会中止于隐藏。例如,下列脚本用 AND 来判断文件夹 C:FSO 的隐藏属性开关是否开着。如果它是开的,脚本用 XOR 操作来将开关关闭来显示文件夹。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:FSO")
If objFolder.Attributes AND 2 Then
   objFolder.Attributes = objFolder.Attributes XOR 2
End If

除非很少的一些情况以外,文件夹用来作为单独存放文件的地方。有时候,这些文件夹是系统需要的。例如操作系统希望在特定的文件夹内找到特定的文件。在其它的一些时候,文件夹是系统管理员管理计算机的一种工具也是用户管理文件的工具。系统管理员可能希望将脚本放在叫做Scripts 的文件夹,将一些 trouble-shooting 的工具放在叫做 Diagnostic Tools 的文件夹。用户或许将他们预算信息放在叫做 Budgets 的文件夹,而将薪水的信息放在叫做 Timecards 的文件夹。当然,文件夹一般是限制使用的,你必须知道这个文件夹是存放的是什么文件。系统管理员需要知道是不是有个特定的脚本存在 C:Scripts 文件夹中,用户需要知道是不是有个特定的窗体存在C:Budgets 的文件夹中。文件夹对象包含了一些属性可用来返回存储在文件夹内文件集合的信息,为了得到这些信息,你的脚本必须:
1. 创建一个 FSO 对象实例。
2. 用 GetFolder 的方法来绑定到一个适当的文件夹。
3. 设置一个对象 reference 来指向文件夹的属性
4. 用 For Each 循环来列举出所有的文件和他们的属性。脚本不必去绑定到每一个单独的文件去获得文件的信息。

在下列脚本中返回在文件夹 C:FSO 下所有文件的信息并且回显他们的名字和大小:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:FSO")
Set colFiles = objFolder.Files
For Each objFile in colFiles
   Wscript.Echo objFile.Name, objFile.Size
Next

对于大多数返回的集合来说,你不能控制输出信息的顺序。就是说你不能将输出的格式定义为按照名字,按照大小或者其它别的原则。如果你想让输出的东西按照特定的格式,你就必须将他们拷贝到数组,目录或者一个 disconnected recordset 然后将他们分类排列。

为了需要知道文件夹中存放的文件,你需要知道文件夹子文件夹,这样,你才能更好的了解文件夹的整体结构。文件夹对象包含了一个 Subfolders 属性,用来放会在文件夹下的 top-level 子文件夹的信息。

Top-level 子文件夹是直接在文件夹下面的。在子文件夹中的子文件夹不在这个范围之内。例如,在下例中,只有 Subfolder1 Subfolder2 是文件夹 scripts 的 top-level 的子文件夹。所以,如果用 Subfolders 这个属性来返回值的话,就只是会返回 Subfolder1 和Subfolder2。