
欢迎进入 Office Space 专栏,本专栏提供 Microsoft® Office 应用程序脚本编写的提示和技巧。我们在每周的周二和周四发布新的提示信息;要查看以前发布的提示信息的存档,请访问 Office Space Archive。如果您遇到了有关 Microsoft Office 脚本编写的具体问题,可将它们随意发送到 scripter@microsoft.com。我们虽然不能保证回答收到的所有问题,但会竭尽全力。
毫无疑问,你们中的许多人在无所事事时都会这么想“我纳闷儿这些脚本专家干嘛不把触角伸到乡下、将‘脚本领地!’或‘WMI 地盘!’标语喷涂在他们所能找到的每一栋建筑、每一个地铁车辆或其它空白表面上。那样做会发生什么情况呢?”
这个问题提得相当好,我们没有这样做实际上有若干个原因。其一,我们这些脚本专家即便不是自找苦吃,也往往会陷入足够我们应付的麻烦之中;我们很少需要外出搜寻使人们向我们发难的理由。其二,在全国的空白墙壁上喷涂‘脚本领地’听起来工作量可不小。让我们直面它:您最近一次看到词语脚本专家和工作出现在同一句子中是在什么时候?
嗯,好吧:使用短语从不像是在连接这两个词语的情况除外。
这两个原因都很有说服力,但我们不在所到之处喷涂标语还有一个更有说服力的原因:那就是喷漆桶没有内置拼写检查器。
没错,就像当今这个时代的许多人一样,至少可以这样讲:“脚本专家”的拼写技能变得有点儿退化了。应该拼作 occurrence 还是 occurrance,或许甚至应拼作 occurence?正确的拼写是 Ocassion 还是 occasion 呢?嗨,这又有什么关系:拼写检查器会替我们搞定。
的确如此,拼写检查器真的会为我们代劳……当然,前提是要有拼写检查器。遗憾的是,并非每个应用程序都有拼写检查器。例如,有一位脚本专家使用“记事本”键入他的所有脚本,但“记事本”并没有拼写检查器。您是否曾觉得奇怪:为什么他的所有消息框看上去都是那么简练?为什么这些消息框从不包含超过 3 或 4 个字母的单词?现在您明白了吧。
当然,解决这个问题的一种方法就是让“脚本专家”学习正确的拼写。但这种方法似乎太老土了。因此,我们想到了另一种方法来规避这一问题:我们只是接入 Microsoft Word 的拼写检查功能,然后创建自己的自定义拼写检查器应用程序。
如上述所暗示的,可以通过脚本访问拼写检查器,这与 Word 中的所有其它功能极其相似。我们先来看一个初级脚本,它的作用是返回给定单词是否有拼写错误的报告。(是否应写作拚写错误?)我们将先说明脚本的工作方式,然后对其稍加修改,使它更有用处
以下是我们的起步脚本:
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add()
If objWord.CheckSpelling("mispelled") Then
Wscript.Echo "The word is spelled correctly."
Else
Set colSuggestions = objWord.GetSpellingSuggestions("mispelled")
For Each strSuggestion in colSuggestions
Wscript.Echo strSuggestion
Next
End If
objWord.Quit
我们先创建一个 Word.Application 对象实例,然后使用 Add() 方法创建一个新的空白文档。您可能注意到了,在该脚本中我们没有将 Visible 属性设置为 True。这是因为就这个脚本而言,我们想要让 Word 在不可见的窗口中打开,而不想让它显示在屏幕上。
接着,我们使用下面这行代码来确定单词 mispelled 的拼写是否正确:
If objWord.CheckSpelling("mispelled") Then
这行代码的作用是调用 CheckSpelling 方法,将待检查的单词作为单个参数进行传递。CheckSpelling 将返回一个布尔值:如果单词的拼写正确,将返回 True;不正确则返回 False。如果 CheckSpelling 返回 True,将回显一条说明单词拼写正确的消息,然后调用 Quit 方法终止不可见的 Microsoft Word 实例。我们的脚本会在此时正常结束
但如果 CheckSpelling 返回 False 呢?如您所熟知的,发生拼写错误时大多数情况下 Microsoft Word 会提供一些拼写建议。例如,如果在 Word 中键入 rin,可以右键单击拼错的单词以显示拼写建议列表:

您的想法绝对正确:我们可以通过脚本返回拼写建议。事实上,如果目标单词的拼写错误,我们正是这样做的:
Set colSuggestions = objWord.GetSpellingSuggestions("mispelled")
For Each strSuggestion in colSuggestions
Wscript.Echo strSuggestion
Next
在以上代码中,我们调用 GetSpellingSuggestions 方法,传递拼错的单词。GetSpellingSuggestions 会返回一组该单词的拼写建议。(请注意,有时甚至连 Word 也无法弄清您试图拼写的单词。在这种情况下,可能不会有任何拼写建议,返回的列表可能是空的。)调用该方法后,我们只需遍历返回的项,在屏幕上回显每个拼写建议。运行这个特定脚本时,应该会得到像下面这样的输出:
misspelled
到此您已得到了答案:对单词 mispelled 的拼写建议。酷。
是有点儿酷。这个脚本的确非常有效,但每次要检查某个单词的拼写时都需要修改脚本,要知道我们在值 mispelled 中进行了硬编码。(不仅如此,还必须对脚本的两处进行修改。我们不想提到是哪位“脚本专家”在将脚本修改了三次以后才搞明白为什么检查 rin 的拼写时总是返回拼写错误。)此外,每次运行该脚本时都会有等待 Word 加载的瞬时延迟。您知道什么才会是真正的酷吗?想像一个在命令窗口中运行的脚本。脚本启动时会加载 Word,然后要求您键入要检查的单词。您照做后脚本会检查单词,然后完成循环,之后要求您键入下一个要检查的单词。这一过程会一直持续到您不键入单词便敲击 Enter 时为止,届时脚本会终止自身及 Word 实例的运行。
您说对了:想像一个那样的脚本有点儿难,是吧?既然如此,我们还是改为给您看一段代码吧:
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add()
Do While True
WScript.StdOut.Write "Please enter the word to be checked: "
strInput = WScript.StdIn.ReadLine
If strInput = "" Then
Exit Do
End If
If objWord.CheckSpelling(strInput) Then
Wscript.Echo "The word is spelled correctly."
Else
Set colSuggestions = objWord.GetSpellingSuggestions(strInput)
For Each strSuggestion in colSuggestions
Wscript.Echo strSuggestion
Next
End If
Wscript.Echo
Loop
objWord.Quit
在尝试运行该脚本前,请注意必须在命令窗口中运行它,而且必须在 CScript 下运行;这是因为它使用 StdIn 和 StdOut,而 WScript 下并未提供这两者。我们不会在今天的专栏中讨论 StdIn 和 StdOut,如果您不清楚它们的功能,请浏览一下 Microsoft Windows 2000 Scripting Guide。
作为替代,我们将只为您显示一个小自定义拼写检查器运行中的图像:

如您可以看到的,我们键入了 rin,脚本的响应是为我们显示一个拼写建议列表。您可能也注意到了,与右键单击拼错的单词相比,通过脚本实际上可以得到更多拼写建议;这是因为 Word 对右键单击单词后显示的拼写建议数量施加了限制。通过脚本得到的那组拼写建议与实际运行拼写检查器所得到的那组拼写建议是相同的。
如果条件允许,我们可能已经外出花两美元买了一本平装小词典,使用它来查找单词的拼写。但那还有什么趣味可言呢?此外,您可以借助接入 Word 的拼写检查器功能实现众多其它目的。例如,可以为 HTA 添加拼写检查器。这有点儿超出了本专栏的范围,但实现的可能性非常高。这么说吧,没有什么能够限制脚本和 Microsoft Word 的能力。
既然已配备了能够通过便携式计算机搬来移去的自定义拼写检查器,我们现在可以四处走动在空白的墙壁和地铁车辆上喷涂“ADSI 万岁!”了吧?我们当然不会指望采用这种方法。我们已经解决了拼写问题,但那个彻头彻尾的懒惰问题还有待应对。我们暂时还是只撰写脚本专栏文章。再贝,下星期见。
哦,应该是再见,下星期见。