作为一个系统管理员,你的工作是跟踪存储在计算机上的文件。例如,你需要知道正确的诊断工具是否被复制到了 server 上,你需要知道特定的文件(比如游戏文件或者音乐文件)是否被复制到了文件服务器上了,尽管你用了组策略去阻止他们将文件拷贝到文件的 server。你需要知道是否有的文件放在计算机上已经有几个月没有去访问了,而这些功能通过类似知道磁盘的剩余空间这样的操作是无法知道的。此外为了跟踪这些文件,你也需要动态的管理他们:需要复制,需要移动,需要重新命名,需要删除。FSO 提供了一些方法来帮助你完成这些管理任务。
FSO 给你提供了一些方法,比如 CopyFile,DeleteFile 允许你的脚本不用绑定一个特定的文件就可以对文件实例进行操作。而其它的任务,就需要文件对象。比如,为了获得一些属性,你的脚本首先就需要绑定到一个文件,然后再获得文件的属性。GetFile 方法允许你绑定到一个独立的文件。为了做到这点,你先创建一个 FSO 实例,然后创建一个文件对象。当你用 GetFile 方法的时候,你必须:1、确定文件的路径:这个路径可以是一个本地路径,也可以是一个 UNC 路径(例如:accountingreceivablesscriptlog.txt)在路径当中你不能用通配符也不能有多个文件。用 GetFile 方法你在同一个时刻只能绑定一个单独的文件。2、当绑定的对象分配给一个变量的时候就要用到 Set 这个关键词。
例如,下面脚本绑定到了文件:C:FSOScriptlog.txt
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.GetFile("C:FSOScriptLog.txt")
一般来讲,你最好用绝对路径来作 GetFile 的参数。这样确保脚本总是可以在文件中运行。但是,用相对路径也是可以的。例如,如下的脚本代码会绑定到 Scriptlog.txt 会成功,因为脚本和这个文件在同一个文件夹里面:
objFSO.GetFile("ScriptLog.txt")
同样,下面的代码实例如果这个脚本和这个文件在同一个文件夹也会绑定到 Scriptlog.txt:
objFSO.GetFile(".ScriptLog.txt")
注意:FSO 不会用路径环境信息去搜索文件。例如,你可以在命令行中敲如 calc.exe 来打开计算机,而无论你当前的目录是在哪里,因为操作系统默认的情况下去搜索所有的文件的。但是用这个GetFile方法的时候,它不是这样的工作的。
如下脚本除非是在文件夹C:WindowsSystem32 的文件夹下,否则都不会运行成功的。
objFSO.GetFile("calc.exe")
有时知道文件是否存在是十分重要的,这个可以作为软件清单的一部分。例如你或许希望检查所有的邮件服务器来看特定的脚本是否存在。用脚本来实现系统管理任务来说,知道脚本存在与否很重要的。比如你或许希望当你复制、移动、删除或者操作不存在的文件的时候,脚本报错。为了避免出现错误,你可以用 FileExists方法来检查文件是否存在。FileExists 方法要求一个单独的参数:文件的路径,然后返回一个特定的 Boolean 值:如果文件存在,返回的是 True,如果文件不存在,返回的是 False。
如下面脚本用 FileExists 方法来检查文件 C:FSOScriptlog.txt 是否存在,如果存在,用 GetFile 方法来绑定到这个文件,如果不存在,脚本回显一个 message“file does not exist”
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("C:FSOScriptLog.txt") Then
Set objFile = objFSO.GetFile("C:FSOScriptLog.txt")
Else
Wscript.Echo "File does not exist.?
End If
你不能用通配符来检查文件夹中特定类型的文件是否存在,你也不能用通配符拉来检查文件夹中所有的文件。如下面脚本,无论在文件夹 C:FSO下存在多少文件,都不会报错出来,而是总是返回一个 False.
WScript.Echo objFSO.FileExists("C:FSO*.*")
如果你希望遵循一些条件原则检查一些文件而不是基于路径,你有下面两个选择:
1、用 GetFolder 对象来绑定一个文件夹,然后返回文件的属性,这样重复操作直到筛选出你感兴趣的。例如,你可以列举出所有的文件和文件的扩展名,然后跟踪看有多少个后缀名 为.doc 的文件。
2、用 WMI,它允许你创建更多的目标查询。比如选出所有后缀名为.doc 的文件。你可以用计数的办法来返回你要的特定的条目。如果数值是 0,那么,最少有一个是.doc 的文件。
删除一个文件
用 FSO 来创建脚本删除文件让你可以自动执行类似与磁盘清理之类的操作。例如,你可以用脚本定期查询和删除所有的临时文件。你也可以依照一些规则来删除文件,比如删除六个月都没有被访问的文件,或者特定的后缀名的文件,比如(.bmp 或者.mp3)你可以首先创建 FSO 对象实例,然后调用 DeleteFile 方法来删除文件,输入文件路径作为参数。
如下面脚本删除了文件 C:FSOScriptlog.txt
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile("C:FSOScriptLog.txt")
默认的情况下,DeleteFile 方法不会删除只读文件。事实上,当你尝试删除一个只读文件时,脚本会报错出来。为了避免这样的错误出现,如想删除只读文件的话,需添加强制参数,当强制参数设成 True 的时候,那么 DeleteFile 可以删除任何文件。如下面这行代码可以删除文件 Scriptlog.txt,即使它只是一个只读文件。
objFSO.DeleteFile("C:FSOScriptLog.txt", True)
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 常量。
Const DeleteReadOnly = True
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile("C:FSO*.txt"), DeleteReadOnly
如何删除所有非只读的文件?此种情况,可以先返回一个集合,然后获取文件属性,根据是否具有只读属性删除之。