您好,DG。说实话,每当收到在重命名文件或文件夹方面寻求帮助的问题时,我们总是会在一旁暗笑。为什么?编写此专栏的脚本专家的计算机上基本上只有一个文件夹,即一个名为 Stuff 的桌面文件夹。在该文件夹里包含几个子文件夹,文件夹名分别为 Junk、New Folder 和 New Folder (2)。这些文件夹中包含的文件的名称都类似于 X.vbs、Test.txt、Sample.doc 和 Hold.xls。您确定还需要在重命名文件方面寻求帮助吗?
当然,我们只是在开玩笑:毕竟,不能仅因为我们没有很好地命名我们的文件就认为我们不能很好地做到这点(假设我们稍稍作些努力)。(编者注:您可能已经注意到称谓从“他”变成了“我们”。尽可放心,并不是所有的脚本专家都像编写此专栏的脚本专家那样没有条理。)例如,下面的脚本应该可以帮助解决您的问题:该脚本打开一个 Word 文档,读取前三个字符,然后使用这些字符重命名该文件:
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open("c:/scripts/test.doc")
Set objRange = objDoc.Range(0,3)
strNewName = "C:/Scripts/" & objRange.Text & ".doc"
objWord.Quit
Wscript.Sleep 3000
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "C:/Scripts/Test.doc", strNewName
在说明此脚本如何运行之前,我们要提出几个警告。您可能也知道,某些字符无法在文件或文件夹名称中使用;这些禁用的字符包括:
| • |
/ |
| • |
/ |
| • |
: |
| • |
* |
| • |
? |
| • |
“ |
| • |
< |
| • |
> |
| • |
| |
在此脚本中,我们不用费神去检查该文档中的前三个字符中是否出现了以上任一字符。理想情况下,您需要的脚本是能够提取文档中前三个有效字符,而不是前三个字符。我们今天先不研究如何做到这点;如果您有足够的兴趣,我们将在今后的专栏中探讨。但是这是一个需要注意的问题。
其次,此脚本在尝试保存文件之前不会验证文件名是否唯一。如果您尝试对同一文件夹中的多个 Word 文档运行此脚本,这可能就是一个问题;如果其中两个或多个文档中的前三个字符恰好为(例如)The,您终究会遇到麻烦。在一个更加完善的脚本中,您在尝试保存某文件(例如,The.doc)之前应先检查该文件是否存在。如果该文件已存在,则您需要一个应急计划以用于为新文件指定一个备用名称。同样,这也只不过是一个需要注意的问题。
但是现在我们先不去考虑以上任何问题。而只是指明我们编写的脚本最初是先创建一个 Word.Application 对象的实例,然后再使用 Open 方法打开文件 C:/Scripts/Test.doc。
|
注意:这很令人疑惑:您怎么会知道我们的示例文件会命名为 Test.doc 呢?我们的意思是先不考虑我们所有文件好像均命名为 Test.doc 的这个事实。 |
打开文档后,我们使用此行代码创建包含文档中前三个字符的 Range 对象(Range 的起点值为第一个字符,终点值为第三个字符):
Set objRange = objDoc.Range(0,3)
一旦我们知道文档中的前三个字符,我们就可以使用此行代码构造一个新文件名:
strNewName = "C:/Scripts/" & objRange.Text & ".doc"
正如您所见,我们的新文件名由三项组成:
| • |
C:/Scripts/。很显然,这是指向 C:/Scripts 文件夹的路径。但请注意,我们需要在结尾处保留一个 /。 |
| • |
objRange.Text。Text 属性包含我们的 Range 中出现的所有文本。这样,它就表示文档中的前三个字符(例如,The)。 |
| • |
.doc。我们新文件的文件扩展名(请参阅我们如何处理 Word 文档)。 |
它们组合在一起之后的拼写如下所示:
C:/Scripts/The.doc
在我们构造新的文件名之后,要退出 Word,然后将该脚本暂停 3 秒(3000 毫秒)。我们插入一段暂停时间只是使 Word 有机会关闭,并在此过程中放弃其对该文件的控制。如果没有这段暂停时间,该脚本可能会在 Word 仍在运行并且仍在打开该文件时来尝试重命名该文件。正如您所料,如果尝试重命名正在由另一应用程序使用的文件,您的脚本将失败。
说到重命名文件,以下说明了我们是如何实现的:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "C:/Scripts/Test.doc", strNewName
是的,这有一点模糊;首先,您根本就看不到 Rename 方法。但是,我们所要做的只是创建 Scripting.FileSystemObject 的一个实例,然后调用 MoveFile 方法。MoveFile 需要两个参数:现有文件的路径和该文件将要“移”至的路径。这时,我们将从路径为 C:/Scripts/Test.doc 的文件开始,将其“移”至一个路径为 C:/Scripts/The.doc 的文件。这似乎是一种比较可笑的方式,但最终结果是该文件完成了重命名。这才是我们真正关心的事情,不是吗?
我们知道这将引致下一个问题:“有没有什么方法可以让我对 C:/Scripts 文件夹中的所有 Word 文档都执行此操作?”那么,以下就是一个恰好可以实现此功能的示例脚本。今天我们不会向您深入介绍此代码,但您应发现它的大部分含义都是显而易见的。如果您对它如何运行还存在疑问,请参阅 Microsoft Windows 2000 脚本指南的 FileSystemObject 一节。
多文件脚本如下所示:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:/Scripts")
Set objWord = CreateObject("Word.Application")
For Each strFile in objFolder.Files
arrNames = Split(strFile.Name, ".")
If arrNames(1) = "doc" Then
Set objDoc = objWord.Documents.Open(strFile.Path)
Set objRange = objDoc.Range(0,3)
strNewName = "C:/Scripts/" & objRange.Text & ".doc"
objDoc.Close
Wscript.Sleep 3000
objFSO.MoveFile strFile.Path, strNewName
End If
Next
objWord.Quit
最后,也应让您放松一下了,我们要提到的是该脚本专家在为其儿子取名时确实让别人帮了一些忙。正因如此,他儿子才叫作 Dylan,而不是 Junk、Test、Stuff 或 Sample。(但坦白地讲,所有这些名字实际上都比脚本编写夫妻想出来的一些名字更好听。Dylan 完全不知道他能取名为 Dylan 是多么的幸运。)