您好,MF。要知道,有些事情真令人难以置信,无论其是否真实。例如,按照“大爆炸理论”,整个宇宙是在几十亿年前密度极高物质爆炸后的极小微粒形成的。这真是不可思议,但物理学家坚持说这就是事实。华盛顿大学橄榄球队在过去的 2 年里只赢了 3 场比赛?这更令人不可思议。但如 Casey Stengal 所说,这有据可查。
|
编辑附注:想听一些真正不可思议的事情吗?今天是脚本专家编辑加入团队一周年纪念日。如果您了解脚本专家及编辑的历史,您就会知道一个人能经受一整年的煎熬是多么令人难以置信。实际上,凭您对脚本专家的了解,您多半会纳闷怎么会有人可以与他们共事一整年。我知道这个编辑也在对此感到迷惑…。 |
那么您对这个问题也感到迷惑吗?您无法使用 WSH(或 WMI,就此事而论)关闭具有特定标题的命令窗口。通过 WMI 可以关闭命令窗口(或者,更准确地说,通过它可以终止在 Cmd.exe 下运行的进程),但 WMI 对命令窗口标题一无所知。如果您所依据的只有命令窗口标题,WMI 就变成了一个只能完成极端任务的工具:您要么可以关闭所有命令窗口(即所有在 Cmd.exe 下运行的进程),要么无法关闭任何命令窗口。但您无法(至少不能仅根据窗口标题)关闭特定命令窗口。
当然,有一件事是容易让人相信的:只要脚本专家告诉您某件事是办不到的,他们就多半会想出某种不可思议的变通方法来让您仍然可以完成任务。这从没有例外。也许您无法使用 WSH 关闭具有特定标题的命令窗口,但您可以使用 Microsoft Word 来关闭具有特定标题的命令窗口。
信不信由你。
例如,可使用以下脚本来关闭标题为 My Window 的命令窗口:
Set objWord = CreateObject("Word.Application")
Set colTasks = objWord.Tasks
If colTasks.Exists("My Window") Then
colTasks("My Window").Close
End If
objWord.Quit
如您所见,此脚本先是创建一个 Word.Application 对象的实例。(看到了吧?我们告诉过您可以使用 Microsoft Word 来执行此项任务!)然后我们使用以下这行代码返回计算机上运行的所有任务(进程)的集合:
Set colTasks = objWord.Tasks
|
注意:您可能注意到了,与我们使用的大多数 Word 脚本不同,此脚本中我们未将 Visible 属性设置为 True。为什么不能?是这样的,将 Visible 属性设置为 True 会使 Word 出现在屏幕上。在本例中,我们不希望(或需要)Word 出现在屏幕上;我们只需要它为我们关闭命令窗口。因此我们使其处于隐藏状态。 |
那么 Word 中的 Tasks 集合与由 WMI 的 Win32_Process 类返回的进程集之间有何区别呢?主要区别是 Word 返回的是各进程的“友好名称”。WMI 返回的是可执行文件的名称,因此您取回的信息与以下信息类似:
winword.exe
sol.exe
cmd.exe
但通过 Word 取回的信息则与以下信息类似:
Test.doc - Microsoft Word
Solitaire
My Window
一般来说,Word 返回的任务名称将是出现在应用程序窗口标题栏中的名称。(显然这对在隐藏窗口中运行的进程不成立,但现在我们不必考虑这些。)如您所见,命令窗口以 My Window 返回,而不是通常的 Cmd.exe。这意味着什么?这意味着 Word(不同于 WSH 和 WMI)可以按标题查找特定命令窗口。
而且,Word 还可以关闭这些命令窗口。返回计算机上运行的任务集合后,我们使用 Exists 方法来确定是否存在名为 My Window 的进程(或任务)。如果存在,我们调用 Close 方法来终止该进程。这只需要三行代码:
If colTasks.Exists("My Window") Then
colTasks("My Window").Close
End If
接下来我们所要做的就是使用 Quit 方法终止 Word 的不可见实例,至此大功告成。
是啊,我们知道这令人难以置信(尽管不如认为“怪物史莱克”会成为史上最受欢迎的电影之一那样令人难以置信)。但这一切都是真实的。有关 Word 中 Tasks 集合(及可以通过它完成的任务)的详细信息,请参阅文章 Build Your Own Task Manager Using Microsoft Word (No, Really)(英文)。
还有,尽管这令人沮丧,却是真的:Husky 橄榄球队在过去的两年中只赢了 3 场比赛。但其篮球队本赛季前 6 场保持全胜。加油!