您好,RR。事实上,这个问题的难度比您想像的要大。这是因为,WMI 在检索有关计算机上所安装软件的信息方面表现一般。理论上,您可以使用像下面这样一个脚本来获取 Microsoft Office 的版本信息:
strComputer = "."Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colApps = objWMIService.ExecQuery _ ("Select * from Win32_Product Where Caption Like '%Microsoft Office%'") For Each objApp in colApps Wscript.Echo objApp.Caption, objApp.Version Next
那么为什么不使用此脚本呢?有两个原因。第一,此脚本使用“Like”运算符,而只有 Windows XP 和 Windows 2003 上有这个运算符。(再者,Windows 2003 上默认情况下不安装 Win32_Product 类,这使事情变得更加复杂。)如果您仍旧运行 Windows 2000,那么您就不走运了。您顶多只能检索 Win32_Product 类的所有实例,然后检查每个实例,看看标题是否包含术语“Microsoft Office”。
第二,上述查询返回名称中包含术语“Microsoft Office”的所有软件的信息。您确实将获得有关 Microsoft Office Professional Edition 2003 的详细信息,但您同时也将获得有关 Microsoft Producer for Microsoft Office PowerPoint 2003 之类的应用程序的信息。因此,您可能必须进一步修改此脚本,以确保您获得纯粹的有关 Microsoft Office 的信息。
我已经猜到了您此时想问的问题:是的,版本信息存储在注册表中。但是,不幸的是,我们并不总是清楚地知道从注册表的哪个位置获取此信息。这个位置取决于计算机上安装的 Office 版本,还取决于这是全新安装还是对旧版本 Office 进行的升级。这表示通过查询注册表来查找计算机上安装的 Word 是什么版本也有点困难;如果是在一个组织中,则此困难尤为明显,因为组织中的各台计算机上可能运行着不同版本的 Office。
那么您如何确定计算机上安装的 Word 的版本呢?稍加思考之后,我们确定最佳方法是直接询问 Word。下面这个脚本先创建一个 Microsoft Word 实例,回显版本和内部版本号,然后终止该 Word 实例:
Set objWord = CreateObject("Word.Application") Wscript.Echo "Version: " & objWord.Version Wscript.Echo "Build: " & objWord.Build objWord.Quit
虽然只是四行简单的代码,但保证管用。另外,您创建的 Word 实例在一个不可见的窗口中运行,因此您不会看到 Word 从屏幕上弹出。您还有什么不满足吗?
如果您要查找远程计算机上安装的 Word 的版本,只需添加该计算机名称,并将该计算机名称作为可选的第二个参数传递给 CreateObject 即可。此修改后的脚本获取远程计算机 atl-ws-01 上安装的 Word 的版本:
Set objWord = CreateObject("Word.Application", "atl-ws-01") Wscript.Echo "Version: " & objWord.Version Wscript.Echo "Build: " & objWord.Build objWord.Quit
当然,这好像有点儿小题大作了,但最终您会看到此方法比使用 Win32_Product 或试图从注册表获取版本信息更容易、更可靠。