Managing Files
管理文件系统的最终任务还是归结为管理单独的文件。作为一个系统管理员,你的工作是跟踪存储在计算机上的文件。例如,你需要知道正确的诊断工具是否被复制到了 server 上,你需要知道特定的文件(比如游戏文件或者音乐文件)是否被复制到了文件服务器上了,尽管你用了组策略去阻止他们将文件拷贝到文件的server。你需要知道是否有的文件放在计算机上已经有几个月没有去访问了,而这些功能通过类似知道磁盘的剩余空间这样的操作是无法知道的。此外为了跟踪这些文件,你也需要动态的管理他们:需要复制,需要移动,需要重新命名,需要删除。FSO 提供了一些方法来帮助你完成这些管理任务。
Binding to a File
FSO 给你提供了一些方法,比如 CopyFile,DeleteFile
允许你的脚本不用绑定一个特定的文件就可以对文件实例进行操作。而其它的任务,就需要文件对象。比如,为了获得一些属性,你的脚本首先就需要绑定到一个文件,然后再获得文件的属性。GetFile方法允许你绑定到一个独立的文件。为了做到这点,你先创建一个 FSO 实例,然后创建一个文件对象。当你用 GetFile 方法的时候,你必须:1、确定文件的路径:这个路径可以是一个本地路径,也可以是一个 UNC 路径(例如:\\accounting\receivables\scriptlog.txt)在路径当中你不能用通配符也不能有多个文件。用 GetFile 方法你在同一个时刻只能绑定一个单独的文件。2、当绑定的对象分配给一个变量的时候就要用到 Set 这个关键词。
例如,下面脚本绑定到了文件:C:\FSO\Scriptlog.txt
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.GetFile("C:\FSO\ScriptLog.txt")
一般来讲,你最好用绝对路径来作 GetFile 的参数。这样确保脚本总是可以在文件中运行。但是,用相对路径也是可以的。例如,如下的脚本代码会绑定到
Scriptlog.txt 会成功,因为脚本和这个文件在同一个文件夹里面:
objFSO.GetFile("ScriptLog.txt")
同样,下面的代码实例如果这个脚本和这个文件在同一个文件夹也会绑定到 Scriptlog.txt:
objFSO.GetFile(".\ScriptLog.txt")
注意:FSO 不会用路径环境信息去搜索文件。例如,你可以在命令行中敲如 calc.exe 来打开计算机,而无论你当前的目录是在哪里,因为操作系统默认的情况下去搜索所有的文件的。但是用这个GetFile方法的时候,它不是这样的工作的。
如下脚本除非是在文件夹C:\Windows\System32 的文件夹下,否则都不会运行成功的。
objFSO.GetFile("calc.exe")
有时知道文件是否存在是十分重要的,这个可以作为软件清单的一部分。例如你或许希望检查所有的邮件服务器来看特定的脚本是否存在。用脚本来实现系统管理任务来说,知道脚本存在与否很重要的。比如你或许希望当你复制、移动、删除或者操作不存在的文件的时候,脚本报错。为了避免出现错误,你可以用 FileExists方法来检查文件是否存在。FileExists 方法要求一个单独的参数:文件的路径,然后返回一个特定的 Boolean 值:如果文件存在,返回的是 True,如果文件不存在,返回的是 False。
如下面脚本用 FileExists 方法来检查文件 C:\FSO\Scriptlog.txt 是否存在,如果存在,用 GetFile 方法来绑定到这个文件,如果不存在,脚本回显一个 message“file does not exist”
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 If objFSO.FileExists("C:\FSO\ScriptLog.txt") Then
3 Set objFile = objFSO.GetFile("C:\FSO\ScriptLog.txt")
4 Else
5 Wscript.Echo "File does not exist.?
6 End If
你不能用通配符来检查文件夹中特定类型的文件是否存在,你也不能用通配符拉来检查文件夹中所有的文件。如下面脚本,无论在文件夹
C:\FSO\下存在多少文件,都不会报错出来,而是总是返回一个 False.
WScript.Echo objFSO.FileExists("C:\FSO\*.*")
如果你希望遵循一些条件原则检查一些文件而不是基于路径,你有下面两个选择:
1、用 GetFolder
对象来绑定一个文件夹,然后返回文件的属性,这样重复操作直到筛选出你感兴趣的。例如,你可以列举出所有的文件和文件的扩展名,然后跟踪看有多少个后缀名
为.doc 的文件。
2、用 WMI,它允许你创建更多的目标查询。比如选出所有后缀名为.doc 的文件。你可以用计数的办法来返回你要的特定的条目。如果数值是 0,那么,最少有一个是.doc 的文件。
Deleting a File
用 FSO 来创建脚本删除文件让你可以自动执行类似与磁盘清理之类的操作。例如,你可以用脚本定期查询和删除所有的临时文件。你也可以依照一些规则来删除文件,比如删除六个月都没有被访问的文件,或者特定的后缀名的文件,比如(.bmp 或者.mp3)你可以首先创建 FSO 对象实例,然后调用 DeleteFile 方法来删除文件,输入文件路径作为参数。
如下面脚本删除了文件 C:\FSO\Scriptlog.txt
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.DeleteFile("C:\FSO\ScriptLog.txt")
默认的情况下,DeleteFile 方法不会删除只读文件。事实上,当你尝试删除一个只读文件时,脚本会报错出来。为了避免这样的错误出现,如想删除只读文件的话,需添加强制参数,当强制参数设成 True
的时候,那么 DeleteFile 可以删除任何文件。如下面这行代码可以删除文件 Scriptlog.txt,即使它只是一个只读文件。
1、 objFSO.DeleteFile("C:\FSO\ScriptLog.txt", True)
2、 Deleting a Set of Files
有时候你希望删除特定的、单独的文件。更有可能的是你可能想用脚本来删除一系列的文件。如在周末你或许想删除一些存盘了的日志文件或所有的临时文件。你可以通过通配符来删除一个文件夹之内的一些文件。但是你不能用 DeleteFile 方法来直接删除多个文件夹内部的文件。你可以通过用筛选每个数据夹的办法来逐个删除每个文件夹内部的文件。如果你想删除多个文件夹内部的特定类型的文件(比如删除计算机上全部的.TMP 文件)你应该用 WMI 而不是用 FSO。为了删除一系列文件,调用 DeleteFile 方法,根据文件的名字或者后缀名添加通配符来提供文件夹的路径。例如,下面的代码用来删除文件夹 C:\FSO 文件夹下的所有后缀名为.doc 的文件。
objFSO.DeleteFile("C:\FSO\*.doc")
下面的这行代码用来删除所有文件名带有 log 的文件:
objFSO.DeleteFile("C:\FSO\*log.* ")
正如前面提到的那样,DeleteFile 方法不删除标记为只读的文件。如果你的脚本尝试去删除一个只读的文档,脚本会报错,虽然你用了 On Error Resume Next 语句。例如你想删除 1000 个 txt 文件,并且只有一个文件标记为只读了。当脚本尝试去删除这个文件的时候,会产生一个脚本运行的错误,这个 DeleteFile 方法中止。脚本不去尝试去删除其它的文件,虽然其它的文件不是只读的。因为这个原因,你可以用可选择的:强制参数,将它的值设置成 True。当这个参数设置成 True 的时候,DeleteFile 方法可以删除只读文件。当这个参数被设置成 False 的时候,就不能删除只读文件。
下面脚本用来删除文件夹 C:\FSO 下的所有文件,为了确保删除包括只读文件在内的文件,强制参数被设置成 True。并且使用了这个 DeleteReadOnly 常量。
1 Const DeleteReadOnly = True
2 Set objFSO = CreateObject("Scripting.FileSystemObject")
3 objFSO.DeleteFile("C:\FSO\*.txt"), DeleteReadOnly
如果你想删除所有不是只读的文件怎么办呢?在这种情况下,你可以返回一个集合,用文件属性来获得文件属性,是否为只读,如果是就不删除,否则就删除。
Copying a File
拷贝文件,无论是从计算机上的一个文件夹到另外一个文件夹还是从一个计算机到另外一个计算机,都是一个非常常见的管理任务。如你希望拷贝一个监视的脚本到你所有的服务器上面来取代过去的 DLL 文件。CopyFile方法提供了这种任务管理的办法。CopyFile 方法需要两个必备参数和一个可选的参数:
1、Source - 要拷贝的文件的源文件的路径。
2、Destination — 目标文件夹的路径。为了确保在目标文件夹也是同样的名字,将一个脱尾符放在文件夹的结束之前(“ \ ”)
objFSO.CopyFile "C:\FSO\ScriptLog.txt" , "D:\Archive\"
如果你想重新命名该文件,你可以将全路径写成如下的格式:
objFSO.CopyFile "C:\FSO\ScriptLog.txt" , "D:\Archive\NewFileName.txt" 如果目标文件夹不存在,则会自动创建。
3、Overwrite可选。默认情况下,CopyFile
方法不能复制到目标文件夹存在的同名文件。这导致错误。比如你要更高的版本覆盖存在的文件,那么将这个参数设置成 True。下面脚本拷贝文件 C:\FSO\Scriptlog.txt 到文件夹 D:\Archive。
The original file, C:\FSO\ScriptLog.txt.
The copied file, D:\Archive\ScriptLog.txt.
为了保证拷贝的正常进行,即使存在 D:\Archive\Scriptlog.txt,脚本将可选参数 Overwrite设置成 True(用常量 OverWriteExisting)
1 Const OverwriteExisting = True
2 Set objFSO = CreateObject("Scripting.FileSystemObject")
3 objFSO.CopyFile "C:\FSO\ScriptLog.txt" , "D:\Archive\", overwriteExisting
当你确定一个目标文件夹的时候,脱尾的反斜线是十分必要的。(例如D:\Archive\)如果你的反斜线在,那么文件会被拷贝到 Archive
文件夹,如果反斜线不在的话,脚本的 CopyFile尝试去建立一个叫做 D:\Achive 的文件夹。如果这个文件夹存在,那么会产生一个”Permission denied Error”的错误出来,拷贝的进程会失败的。这个对于只读文件来说也是错误的,虽然你可能将强制参数设置成
True。如果没有反斜线,你必须先将原来的文件删除,然后再调用CopyFile 方法来实现。
Copying a Set of Files
通配符提供了一种拷贝整个文件夹中所有的文件的方法。你可以用脚本复制一些具有共同参数的文件。例如下列脚本拷贝在 C:\FSO 中所有的 txt 文件到 D:\Archive.
1 Const OverwriteExisting = True
2 Set objFSO = CreateObject("Scripting.FileSystemObject")
3 objFSO.CopyFile "C:\FSO\*.txt" , "D:\Archive\" , OverwriteExisting
在 CopyFile 的方法中添加通配符来拷贝文件的时候,只是拷贝当前文件夹的文件。而用CopyFolder
的方法,正好相反,它也拷贝子文件夹的信息和文件。如下的脚本代码语句拷贝文件夹 C:\FSO 中所有的文件,而不拷贝子文件夹的信息。
objFSO.CopyFile "C:\FSO\*.*" , "D:\Archive\"
Moving a File
如你的磁盘空间很低了,你或许希望将文件移动到一个新的位置;如果你的计算机换了规则,你或许希望移动特定的诊断工具取代原来的。在其它的一些情况下,你或许不希望存在这个文件的副本,而是将它移动到一个新的位置。MoveFile
方法让你将文件从一个地方移动到另外一个地方。MoveFile 方法和 CopyFile 的方法类似,你需要创建一个 FSO 对象,然后调用 MoveFile
的方法,需要两个参数:
1、需要移动文件的完整路径
2、需要移动到的目标文件夹的路径,包括脱尾符(反斜线)
下例中脚本将 C:\FSO\Scriptlog.log 移动到 D 盘的 Archive 文件夹
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.MoveFile "C:\FSO\ScriptLog.log" , "D:\Archive\"
Moving a Set of Files
你也可以用通配符来用一个操作移动多个文件。如为移动所有在文件夹 FSO 中以 data开头的文件,你可以用以下的参数: C:\FSO\Data*.*
通配符可以用来移动特定的文件。因为文件的类型一般是用后缀名来标识的。如下例中脚本移动所有的日志文件到 D:\Archive
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.MoveFile "C:\FSO\*.log" , "D:\Archive\"
Renaming a File
FSO 并没有提供一种直接的方法来重新命名一个文件。但是和 MoveFolder 的方法可以重新命名文件夹一样,你也可以用 MoveFile
的方法来重新命名文件。为了重新命名一个文件,你可以用 MoveFile 的方法,但是目标文件夹应为当前的文件夹。
如在下例脚本中,将Scriptlog.txt 重新命名为 Backuplog.txt。而在技术上是脚本实际上将 C:\FSO\Scriptlog.txt 移动到一个新的路径 C:\FSO\Backuplog.txt,结果是将文件重新命名了。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.MoveFile "C:\FSO\ScriptLog.txt" , "C:\FSO\BackupLog.txt"
文件有些属性对于文件的管理来说十分重要,如属性 DateLastAccssed 告诉你最后打开这个文件的日期。属性Size告诉你文件有多少个 bytes,系统管理员可以通过 windows 资源管理器或者命令行工具去访问文件的属性。虽然这些工具可以返回计算机上文件的信息,但是他们不是被设计成用来保存和操作文件属性的。此外,这些工具大多功能有限,不能使系统管理员很好的通过属性来周期性的清理磁盘或者寻找出满足特定属性的文件集合。
幸运的是,你可以通过 FSO 来获得计算机上任何文件的详细信息。和其它的工具相比,FSO可以让你查询一个文件或者一组文件的信息。
Attributes 文件的位图属性。
DateCreated 文件的创建日期。
DateLastAccessed 数据的最后访问日期。
DateLastModified 数据的最后更改日期。
Drive 磁盘驱动器和托尾符(例如:C:)代表文件存在的磁盘上。
Name 文件的名字,不包含文件的路径
ParentFolder 父文件夹的名字。例如,C:\Windows\System32\Scrrun.dll
的父文件夹名字是 Windows
Path 文件的路径,比如 C:\Windows\System32\Scrrun.dll
ShortName MS-DOS类型的文件名,符合8.3 命名规则的。
ShortPath MS-DOS-style 文件名字。符合 8.3 命名规则的。
Size 文件的大小,单位是 bytes
Type 文件类型,是在注册表区中对于此文件类型的字符串描述。
为了访问这些属性,你必须:
1. 创建一个 FSO 对象实例。
2. 用 GetFile 方法创建一个对象的 reference。脚本必须给 GetFile 提供文件的路径参数。
3. 用 Echo(或者其它的处理办法)来表达出文件的属性。
如下面的脚本用 GetFile 的方法来绑定到文件 C:\Windows\System32\Scrrun.dll 然后返回一些它的属性:
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll")
3 Wscript.Echo "Date created: " & objFile.DateCreated
4 Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed
5 Wscript.Echo "Date last modified: " & objFile.DateLastModified
6 Wscript.Echo "Drive: " & objFile.Drive
7 Wscript.Echo "Name: " & objFile.Name
8 Wscript.Echo "Parent folder: " & objFile.ParentFolder
9 Wscript.Echo "Path: " & objFile.Path
10 Wscript.Echo "Short name: " & objFile.ShortName
11 Wscript.Echo "Short path: " & objFile.ShortPath
12 Wscript.Echo "Size: " & objFile.Size
13 Wscript.Echo "Type: " & objFile.Type
和文件夹一样,文件有些属性可以通过 FSO 返回和配置,有些属性比如位图属性就不能通过 FSO 来获得的。
Normal 0 没有这样的属性设置为 True。??
Read-only 1 文件为只读。
Hidden 2 文件在 Windows 浏览器中是隐藏的。
System 4 文件是操作系统必须的。
Archive 32 存盘,文件标记为需要备份的。
Alias 64 此文件是其它文件的快捷方式
Compressed 2048 此文件是压缩的。
想获得文件的这些属性,用GetFile 方法来绑定一个文件,在你创建完了这个文件对象的reference
之后,你可以用逻辑与操作来决定这些属性。如果没有任何属性被设置了,那么这个值就是 0。如下面脚本绑定了文件 C:\FSO\Scriptlog.txt
然后检查每个属性并用FSO 返回属性的值。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objFile = objFSO.GetFile("C:\FSO\ScriptLog.txt")
3 If objFile.Attributes AND 0 Then
4 Wscript.Echo "No attributes set."
5 End If
6 If objFile.Attributes AND 1 Then
7 Wscript.Echo "Read-only."
8 End If
9 If objFile.Attributes AND 2 Then
10 Wscript.Echo "Hidden file."
11 End If
12 If objFile.Attributes AND 4 Then
13 Wscript.Echo "System file."
14 End If
15 If objFile.Attributes AND 32 Then
16 Wscript.Echo "Archive bit set."
17 End If
18 If objFile.Attributes AND 64 Then
19 Wscript.Echo "Link or shortcut."
20 End If
21 If objFile.Attributes AND 2048 Then
22 Wscript.Echo "Compressed file."
23 End If
Configuring File Attributes
除了列举文件的属性之外,FSO 提供了配置如下属性的一些办法:
1、ReadOnly 2、Hidden 3、System 4、Archive
为了配置文件的这些属性,脚本可以用如下的进程:
1. 用 GetFile 的方法绑定一个文件。
2. 检查你要更改的文件的属性。如你想将一个文件设置成只读的那么就检查它是否是已经是已读了。
3. 如果不是只读的,那么用逻辑 XOR 操作来触发这个开关。这样可以使文件变成只读的。但 是如果文件已经是只读的,那么不要用逻辑 XOR
操作,如果你用了,那么这个属性就被移掉了。
下面脚本用 AND 操作来检查只读开关是否已经打开,从而确定文件C:\FSO\TestScript.vbs是否为只读。如果为只读,脚本用 XOR
操作来将其改成非只读的。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objFile = objFSO.GetFile("C:\FSO\TestScript.vbs")
3 If objFile.Attributes AND 1 Then
4 objFile.Attributes = objFile.Attributes XOR 1
5 End If
你也用如下的语句来同时去更改系统、存盘、隐藏等属性
objFile.Attributes = objFile.Attributes AND 0
管理文件系统的最终任务还是归结为管理单独的文件。作为一个系统管理员,你的工作是跟踪存储在计算机上的文件。例如,你需要知道正确的诊断工具是否被复制到了 server 上,你需要知道特定的文件(比如游戏文件或者音乐文件)是否被复制到了文件服务器上了,尽管你用了组策略去阻止他们将文件拷贝到文件的server。你需要知道是否有的文件放在计算机上已经有几个月没有去访问了,而这些功能通过类似知道磁盘的剩余空间这样的操作是无法知道的。此外为了跟踪这些文件,你也需要动态的管理他们:需要复制,需要移动,需要重新命名,需要删除。FSO 提供了一些方法来帮助你完成这些管理任务。
Binding to a File
FSO 给你提供了一些方法,比如 CopyFile,DeleteFile
允许你的脚本不用绑定一个特定的文件就可以对文件实例进行操作。而其它的任务,就需要文件对象。比如,为了获得一些属性,你的脚本首先就需要绑定到一个文件,然后再获得文件的属性。GetFile方法允许你绑定到一个独立的文件。为了做到这点,你先创建一个 FSO 实例,然后创建一个文件对象。当你用 GetFile 方法的时候,你必须:1、确定文件的路径:这个路径可以是一个本地路径,也可以是一个 UNC 路径(例如:\\accounting\receivables\scriptlog.txt)在路径当中你不能用通配符也不能有多个文件。用 GetFile 方法你在同一个时刻只能绑定一个单独的文件。2、当绑定的对象分配给一个变量的时候就要用到 Set 这个关键词。
例如,下面脚本绑定到了文件:C:\FSO\Scriptlog.txt
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.GetFile("C:\FSO\ScriptLog.txt")
一般来讲,你最好用绝对路径来作 GetFile 的参数。这样确保脚本总是可以在文件中运行。但是,用相对路径也是可以的。例如,如下的脚本代码会绑定到
Scriptlog.txt 会成功,因为脚本和这个文件在同一个文件夹里面:
objFSO.GetFile("ScriptLog.txt")
同样,下面的代码实例如果这个脚本和这个文件在同一个文件夹也会绑定到 Scriptlog.txt:
objFSO.GetFile(".\ScriptLog.txt")
注意:FSO 不会用路径环境信息去搜索文件。例如,你可以在命令行中敲如 calc.exe 来打开计算机,而无论你当前的目录是在哪里,因为操作系统默认的情况下去搜索所有的文件的。但是用这个GetFile方法的时候,它不是这样的工作的。
如下脚本除非是在文件夹C:\Windows\System32 的文件夹下,否则都不会运行成功的。
objFSO.GetFile("calc.exe")
有时知道文件是否存在是十分重要的,这个可以作为软件清单的一部分。例如你或许希望检查所有的邮件服务器来看特定的脚本是否存在。用脚本来实现系统管理任务来说,知道脚本存在与否很重要的。比如你或许希望当你复制、移动、删除或者操作不存在的文件的时候,脚本报错。为了避免出现错误,你可以用 FileExists方法来检查文件是否存在。FileExists 方法要求一个单独的参数:文件的路径,然后返回一个特定的 Boolean 值:如果文件存在,返回的是 True,如果文件不存在,返回的是 False。
如下面脚本用 FileExists 方法来检查文件 C:\FSO\Scriptlog.txt 是否存在,如果存在,用 GetFile 方法来绑定到这个文件,如果不存在,脚本回显一个 message“file does not exist”
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 If objFSO.FileExists("C:\FSO\ScriptLog.txt") Then
3 Set objFile = objFSO.GetFile("C:\FSO\ScriptLog.txt")
4 Else
5 Wscript.Echo "File does not exist.?
6 End If
你不能用通配符来检查文件夹中特定类型的文件是否存在,你也不能用通配符拉来检查文件夹中所有的文件。如下面脚本,无论在文件夹
C:\FSO\下存在多少文件,都不会报错出来,而是总是返回一个 False.
WScript.Echo objFSO.FileExists("C:\FSO\*.*")
如果你希望遵循一些条件原则检查一些文件而不是基于路径,你有下面两个选择:
1、用 GetFolder
对象来绑定一个文件夹,然后返回文件的属性,这样重复操作直到筛选出你感兴趣的。例如,你可以列举出所有的文件和文件的扩展名,然后跟踪看有多少个后缀名
为.doc 的文件。
2、用 WMI,它允许你创建更多的目标查询。比如选出所有后缀名为.doc 的文件。你可以用计数的办法来返回你要的特定的条目。如果数值是 0,那么,最少有一个是.doc 的文件。
Deleting a File
用 FSO 来创建脚本删除文件让你可以自动执行类似与磁盘清理之类的操作。例如,你可以用脚本定期查询和删除所有的临时文件。你也可以依照一些规则来删除文件,比如删除六个月都没有被访问的文件,或者特定的后缀名的文件,比如(.bmp 或者.mp3)你可以首先创建 FSO 对象实例,然后调用 DeleteFile 方法来删除文件,输入文件路径作为参数。
如下面脚本删除了文件 C:\FSO\Scriptlog.txt
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.DeleteFile("C:\FSO\ScriptLog.txt")
默认的情况下,DeleteFile 方法不会删除只读文件。事实上,当你尝试删除一个只读文件时,脚本会报错出来。为了避免这样的错误出现,如想删除只读文件的话,需添加强制参数,当强制参数设成 True
的时候,那么 DeleteFile 可以删除任何文件。如下面这行代码可以删除文件 Scriptlog.txt,即使它只是一个只读文件。
1、 objFSO.DeleteFile("C:\FSO\ScriptLog.txt", True)
2、 Deleting a Set of Files
有时候你希望删除特定的、单独的文件。更有可能的是你可能想用脚本来删除一系列的文件。如在周末你或许想删除一些存盘了的日志文件或所有的临时文件。你可以通过通配符来删除一个文件夹之内的一些文件。但是你不能用 DeleteFile 方法来直接删除多个文件夹内部的文件。你可以通过用筛选每个数据夹的办法来逐个删除每个文件夹内部的文件。如果你想删除多个文件夹内部的特定类型的文件(比如删除计算机上全部的.TMP 文件)你应该用 WMI 而不是用 FSO。为了删除一系列文件,调用 DeleteFile 方法,根据文件的名字或者后缀名添加通配符来提供文件夹的路径。例如,下面的代码用来删除文件夹 C:\FSO 文件夹下的所有后缀名为.doc 的文件。
objFSO.DeleteFile("C:\FSO\*.doc")
下面的这行代码用来删除所有文件名带有 log 的文件:
objFSO.DeleteFile("C:\FSO\*log.* ")
正如前面提到的那样,DeleteFile 方法不删除标记为只读的文件。如果你的脚本尝试去删除一个只读的文档,脚本会报错,虽然你用了 On Error Resume Next 语句。例如你想删除 1000 个 txt 文件,并且只有一个文件标记为只读了。当脚本尝试去删除这个文件的时候,会产生一个脚本运行的错误,这个 DeleteFile 方法中止。脚本不去尝试去删除其它的文件,虽然其它的文件不是只读的。因为这个原因,你可以用可选择的:强制参数,将它的值设置成 True。当这个参数设置成 True 的时候,DeleteFile 方法可以删除只读文件。当这个参数被设置成 False 的时候,就不能删除只读文件。
下面脚本用来删除文件夹 C:\FSO 下的所有文件,为了确保删除包括只读文件在内的文件,强制参数被设置成 True。并且使用了这个 DeleteReadOnly 常量。
1 Const DeleteReadOnly = True
2 Set objFSO = CreateObject("Scripting.FileSystemObject")
3 objFSO.DeleteFile("C:\FSO\*.txt"), DeleteReadOnly
如果你想删除所有不是只读的文件怎么办呢?在这种情况下,你可以返回一个集合,用文件属性来获得文件属性,是否为只读,如果是就不删除,否则就删除。
Copying a File
拷贝文件,无论是从计算机上的一个文件夹到另外一个文件夹还是从一个计算机到另外一个计算机,都是一个非常常见的管理任务。如你希望拷贝一个监视的脚本到你所有的服务器上面来取代过去的 DLL 文件。CopyFile方法提供了这种任务管理的办法。CopyFile 方法需要两个必备参数和一个可选的参数:
1、Source - 要拷贝的文件的源文件的路径。
2、Destination — 目标文件夹的路径。为了确保在目标文件夹也是同样的名字,将一个脱尾符放在文件夹的结束之前(“ \ ”)
objFSO.CopyFile "C:\FSO\ScriptLog.txt" , "D:\Archive\"
如果你想重新命名该文件,你可以将全路径写成如下的格式:
objFSO.CopyFile "C:\FSO\ScriptLog.txt" , "D:\Archive\NewFileName.txt" 如果目标文件夹不存在,则会自动创建。
3、Overwrite可选。默认情况下,CopyFile
方法不能复制到目标文件夹存在的同名文件。这导致错误。比如你要更高的版本覆盖存在的文件,那么将这个参数设置成 True。下面脚本拷贝文件 C:\FSO\Scriptlog.txt 到文件夹 D:\Archive。
The original file, C:\FSO\ScriptLog.txt.
The copied file, D:\Archive\ScriptLog.txt.
为了保证拷贝的正常进行,即使存在 D:\Archive\Scriptlog.txt,脚本将可选参数 Overwrite设置成 True(用常量 OverWriteExisting)
1 Const OverwriteExisting = True
2 Set objFSO = CreateObject("Scripting.FileSystemObject")
3 objFSO.CopyFile "C:\FSO\ScriptLog.txt" , "D:\Archive\", overwriteExisting
当你确定一个目标文件夹的时候,脱尾的反斜线是十分必要的。(例如D:\Archive\)如果你的反斜线在,那么文件会被拷贝到 Archive
文件夹,如果反斜线不在的话,脚本的 CopyFile尝试去建立一个叫做 D:\Achive 的文件夹。如果这个文件夹存在,那么会产生一个”Permission denied Error”的错误出来,拷贝的进程会失败的。这个对于只读文件来说也是错误的,虽然你可能将强制参数设置成
True。如果没有反斜线,你必须先将原来的文件删除,然后再调用CopyFile 方法来实现。
Copying a Set of Files
通配符提供了一种拷贝整个文件夹中所有的文件的方法。你可以用脚本复制一些具有共同参数的文件。例如下列脚本拷贝在 C:\FSO 中所有的 txt 文件到 D:\Archive.
1 Const OverwriteExisting = True
2 Set objFSO = CreateObject("Scripting.FileSystemObject")
3 objFSO.CopyFile "C:\FSO\*.txt" , "D:\Archive\" , OverwriteExisting
在 CopyFile 的方法中添加通配符来拷贝文件的时候,只是拷贝当前文件夹的文件。而用CopyFolder
的方法,正好相反,它也拷贝子文件夹的信息和文件。如下的脚本代码语句拷贝文件夹 C:\FSO 中所有的文件,而不拷贝子文件夹的信息。
objFSO.CopyFile "C:\FSO\*.*" , "D:\Archive\"
Moving a File
如你的磁盘空间很低了,你或许希望将文件移动到一个新的位置;如果你的计算机换了规则,你或许希望移动特定的诊断工具取代原来的。在其它的一些情况下,你或许不希望存在这个文件的副本,而是将它移动到一个新的位置。MoveFile
方法让你将文件从一个地方移动到另外一个地方。MoveFile 方法和 CopyFile 的方法类似,你需要创建一个 FSO 对象,然后调用 MoveFile
的方法,需要两个参数:
1、需要移动文件的完整路径
2、需要移动到的目标文件夹的路径,包括脱尾符(反斜线)
下例中脚本将 C:\FSO\Scriptlog.log 移动到 D 盘的 Archive 文件夹
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.MoveFile "C:\FSO\ScriptLog.log" , "D:\Archive\"
Moving a Set of Files
你也可以用通配符来用一个操作移动多个文件。如为移动所有在文件夹 FSO 中以 data开头的文件,你可以用以下的参数: C:\FSO\Data*.*
通配符可以用来移动特定的文件。因为文件的类型一般是用后缀名来标识的。如下例中脚本移动所有的日志文件到 D:\Archive
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.MoveFile "C:\FSO\*.log" , "D:\Archive\"
Renaming a File
FSO 并没有提供一种直接的方法来重新命名一个文件。但是和 MoveFolder 的方法可以重新命名文件夹一样,你也可以用 MoveFile
的方法来重新命名文件。为了重新命名一个文件,你可以用 MoveFile 的方法,但是目标文件夹应为当前的文件夹。
如在下例脚本中,将Scriptlog.txt 重新命名为 Backuplog.txt。而在技术上是脚本实际上将 C:\FSO\Scriptlog.txt 移动到一个新的路径 C:\FSO\Backuplog.txt,结果是将文件重新命名了。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 objFSO.MoveFile "C:\FSO\ScriptLog.txt" , "C:\FSO\BackupLog.txt"
文件有些属性对于文件的管理来说十分重要,如属性 DateLastAccssed 告诉你最后打开这个文件的日期。属性Size告诉你文件有多少个 bytes,系统管理员可以通过 windows 资源管理器或者命令行工具去访问文件的属性。虽然这些工具可以返回计算机上文件的信息,但是他们不是被设计成用来保存和操作文件属性的。此外,这些工具大多功能有限,不能使系统管理员很好的通过属性来周期性的清理磁盘或者寻找出满足特定属性的文件集合。
幸运的是,你可以通过 FSO 来获得计算机上任何文件的详细信息。和其它的工具相比,FSO可以让你查询一个文件或者一组文件的信息。
Attributes 文件的位图属性。
DateCreated 文件的创建日期。
DateLastAccessed 数据的最后访问日期。
DateLastModified 数据的最后更改日期。
Drive 磁盘驱动器和托尾符(例如:C:)代表文件存在的磁盘上。
Name 文件的名字,不包含文件的路径
ParentFolder 父文件夹的名字。例如,C:\Windows\System32\Scrrun.dll
的父文件夹名字是 Windows
Path 文件的路径,比如 C:\Windows\System32\Scrrun.dll
ShortName MS-DOS类型的文件名,符合8.3 命名规则的。
ShortPath MS-DOS-style 文件名字。符合 8.3 命名规则的。
Size 文件的大小,单位是 bytes
Type 文件类型,是在注册表区中对于此文件类型的字符串描述。
为了访问这些属性,你必须:
1. 创建一个 FSO 对象实例。
2. 用 GetFile 方法创建一个对象的 reference。脚本必须给 GetFile 提供文件的路径参数。
3. 用 Echo(或者其它的处理办法)来表达出文件的属性。
如下面的脚本用 GetFile 的方法来绑定到文件 C:\Windows\System32\Scrrun.dll 然后返回一些它的属性:
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objFile = objFSO.GetFile("c:\windows\system32\scrrun.dll")
3 Wscript.Echo "Date created: " & objFile.DateCreated
4 Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed
5 Wscript.Echo "Date last modified: " & objFile.DateLastModified
6 Wscript.Echo "Drive: " & objFile.Drive
7 Wscript.Echo "Name: " & objFile.Name
8 Wscript.Echo "Parent folder: " & objFile.ParentFolder
9 Wscript.Echo "Path: " & objFile.Path
10 Wscript.Echo "Short name: " & objFile.ShortName
11 Wscript.Echo "Short path: " & objFile.ShortPath
12 Wscript.Echo "Size: " & objFile.Size
13 Wscript.Echo "Type: " & objFile.Type
和文件夹一样,文件有些属性可以通过 FSO 返回和配置,有些属性比如位图属性就不能通过 FSO 来获得的。
Normal 0 没有这样的属性设置为 True。??
Read-only 1 文件为只读。
Hidden 2 文件在 Windows 浏览器中是隐藏的。
System 4 文件是操作系统必须的。
Archive 32 存盘,文件标记为需要备份的。
Alias 64 此文件是其它文件的快捷方式
Compressed 2048 此文件是压缩的。
想获得文件的这些属性,用GetFile 方法来绑定一个文件,在你创建完了这个文件对象的reference
之后,你可以用逻辑与操作来决定这些属性。如果没有任何属性被设置了,那么这个值就是 0。如下面脚本绑定了文件 C:\FSO\Scriptlog.txt
然后检查每个属性并用FSO 返回属性的值。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objFile = objFSO.GetFile("C:\FSO\ScriptLog.txt")
3 If objFile.Attributes AND 0 Then
4 Wscript.Echo "No attributes set."
5 End If
6 If objFile.Attributes AND 1 Then
7 Wscript.Echo "Read-only."
8 End If
9 If objFile.Attributes AND 2 Then
10 Wscript.Echo "Hidden file."
11 End If
12 If objFile.Attributes AND 4 Then
13 Wscript.Echo "System file."
14 End If
15 If objFile.Attributes AND 32 Then
16 Wscript.Echo "Archive bit set."
17 End If
18 If objFile.Attributes AND 64 Then
19 Wscript.Echo "Link or shortcut."
20 End If
21 If objFile.Attributes AND 2048 Then
22 Wscript.Echo "Compressed file."
23 End If
Configuring File Attributes
除了列举文件的属性之外,FSO 提供了配置如下属性的一些办法:
1、ReadOnly 2、Hidden 3、System 4、Archive
为了配置文件的这些属性,脚本可以用如下的进程:
1. 用 GetFile 的方法绑定一个文件。
2. 检查你要更改的文件的属性。如你想将一个文件设置成只读的那么就检查它是否是已经是已读了。
3. 如果不是只读的,那么用逻辑 XOR 操作来触发这个开关。这样可以使文件变成只读的。但 是如果文件已经是只读的,那么不要用逻辑 XOR
操作,如果你用了,那么这个属性就被移掉了。
下面脚本用 AND 操作来检查只读开关是否已经打开,从而确定文件C:\FSO\TestScript.vbs是否为只读。如果为只读,脚本用 XOR
操作来将其改成非只读的。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objFile = objFSO.GetFile("C:\FSO\TestScript.vbs")
3 If objFile.Attributes AND 1 Then
4 objFile.Attributes = objFile.Attributes XOR 1
5 End If
你也用如下的语句来同时去更改系统、存盘、隐藏等属性
objFile.Attributes = objFile.Attributes AND 0