如何根据文件扩展名移动文件?

来源:百度文库 编辑:神马文学网 时间:2024/05/01 05:20:33
问:
您好,脚本专家!我有一个文件夹,里面有一大堆文件。我需要移动所有这些文件;唯一的问题就是这些文件需要根据它们的文件扩展名移动到不同的文件夹。例如,我想将所有的 .log 文件移动到一个地方,将所有的 .bak 文件移动到另一个地方,等等。我该如何使用脚本执行这样的操作呢?
-- SH
答:
您好,SH。据我们所知,至少有三种方法可以解决这个问题:您可以使用 WMI、FileSystemObject 或 Shell 对象。其中有没有一种最好的方法呢?这三种方法最终都能完成这项任务。与其他两种方法相比,WMI 的一个优点是:它在远程计算机上完成这项任务和在本地计算机上一样容易。当然,WMI 也有一个缺点,即它实际上没有移动文件的内置方法。但是,我们从未让这么小的一件事阻挡过我们前进的步伐,不是吗?
让我们看看以下这个脚本。此脚本将检索 C:\Payroll 文件夹中的所有文件的列表,然后将所有扩展名为 .log 的文件移动到文件夹 D:\Operation Logs 中:
strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")Set colFiles = objWMIService.ExecQuery _("ASSOCIATORS OF {Win32_Directory.Name=‘C:\Payroll‘} Where " _& "ResultClass = CIM_DataFile")For Each objFile in colFilesIf objFile.Extension = "log" ThenstrCopy = "D:\Operation Logs\" & objFile.FileName _& "." & objFile.ExtensionobjFile.Copy(strCopy)objFile.DeleteEnd IfNext 重要信息。如果运行此脚本,请确保您使用了有效的路径。假设您尝试将文件复制到 D:\Operation Logs,但是您的计算机实际上没有 D 驱动器。在这种情况下,Copy 命令将失败,但 Delete 命令可成功执行。因此您的文件没有被复制到任何地方就被删除了。
首先,我们连接到 WMI 服务,然后使用 ASSOCIATORS OF 查询来检索位于文件夹 C:\Payroll 中的所有文件。然后,我们遍历整个文件集合,检查是否有文件扩展名为“log”的文件。这就是下面所执行的操作:
If objFile.Extension = "log" Then
请注意,我们不是在查找具有“.log”文件扩展名的文件;请确保您已将点 (.) 省略。
如果我们找到具有“log”文件扩展名的文件,会发生什么呢?正如我们前面所提到的,WMI 没有用于移动文件的内置方法。我们打算通过将文件从 C:\Payroll 文件夹复制到 D:\Operation Logs 文件夹来解决这个问题。在很短的一段时间内,我们拥有该文件的两个副本:一个在 C:\Payroll 中,一个在 D:\Operation Logs 中。但是别担心:在下一行代码中,我们就将删除位于 C:\Payroll 中的副本。执行了该项操作后,我们就只拥有文件的一个副本了,即位于 D:\Operation Logs 中的那个副本。实际上,尽管我们没有使用任何一种 Move 方法,但我们确实移动了文件。
是的,我们耍了一点儿小手段。
此处唯一需要一点儿技巧的操作就是 WMI 复制文件时要求完整的路径名称。假设我们找到一个名为 March.log 的文件。若要复制此文件,需要使用完整的路径:D:\Operation Logs\March.log。因此我们使用以下这行代码构造该路径:
strCopy = "D:\Operation Logs\" & objFile.FileName _& "." & objFile.Extension
我们要执行的全部操作就是将值分配给变量 strCopy。该值恰好由以下几部分构成:“D:\Operation Logs\”加上文件名 (March),加上一个句点 (.),再加上文件扩展名 (log)。将它们放在一起就成了“D:\Operation Logs\March.log”。这正是我们要传递给 Copy 方法的路径。
是的,您可能已经注意到了,文件扩展名是从文件名中分离的属性。这就是我们将“FileName”属性、一个句点和“Extension”属性组合在一起的原因。此脚本稍微有一点儿麻烦,但是它可使编写其他脚本变得更容易,比如一个返回计算机上所有具有“log”文件扩展名的文件的脚本。
一旦构造完该路径,我们就可以将文件复制到驱动器 D,然后从驱动器 C 删除原始文件。这就是我们使用以下两行代码执行的操作:
objFile.Copy(strCopy)objFile.Delete
就是这么回事:此脚本继续循环直到它选中文件夹中的每个文件并将所有具有“log”文件扩展名的文件移动到 D:\Operation Logs 中为止。
为了保持示例脚本尽可能地短,我们只检查一个文件扩展名。不过,检查其他的文件扩展名并将这些文件移动到适当的文件夹也很容易。以下是一个修订过的脚本,此脚本也对 .bak 文件进行检查,并将它们复制到 D:\Operation Backups:
strComputer = "."Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")Set colFiles = objWMIService.ExecQuery _("ASSOCIATORS OF {Win32_Directory.Name=‘C:\Payroll‘} Where " _& "ResultClass = CIM_DataFile")For Each objFile in colFilesIf objFile.Extension = "log" ThenstrCopy = "D:\Operation Logs\" & objFile.FileName _& "." & objFile.ExtensionobjFile.Copy(strCopy)objFile.DeleteEnd IfIf objFile.Extension = "bak" ThenstrCopy = "D:\Operation Backups\" & objFile.FileName _& "." & objFile.ExtensionobjFile.Copy(strCopy)objFile.DeleteEnd IfNext
若要对更多的文件扩展名进行检查,只需添加一些其他的 If-Then 语句即可。这就是全部的工作。