您好,RW。 您有问题要问吗? 哦,对了: 打印机驱动程序。 您今天得原谅我们: 脚本专家们(或者至少其中一个脚本专家)很伤心。 那是因为由他担任助理教练的“Colt 联盟全明星”队在“西北地区比赛”中夺得了第三名。 夺得“西北”地区第三名怎么了? 嗯,其实也没什么,只不过夺得第一名的球队要去加利福尼亚参加“区域”赛,比赛的获胜者将继续参加“Colt 联盟世界”比赛, 其他人 – 包括获得第三名的球队 – 都要回家。
不管怎样,还是感谢您提问: 给些时间,我们会恢复过来的,会回到我们平时快乐的样子的。 请于一两个月之后再试一试。 或者可能是明年的什么时候。 也许要到 2008 年,我们才会准备好再回答问题。 到那时…。
嗯,不用担心: 经理刚刚通知我们:我们已经得到了明显的恢复,现在准备回答问题。 (显然他不明白“Colt 联盟”棒球是多么的重要。) 因此我们将回答您的问题。 然后我们将再次感到伤心。
因为这是一个平常要注意的与打印相关的问题: 我们可以给出一个解决方案,它在 Windows XP 和 Windows Server 2003 下很有效,但却不适用于 Windows 2000 或 Windows 的任何其他版本。 在其他平台上可通过类似下面的脚本来返回特定打印机使用的打印驱动程序的名称,不过这几乎就是我们能够得到的所有信息:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * From Win32_Printer Where DeviceID='////atl-ps-1//printer1' ")
For Each objItem in colItems
Wscript.Echo objItem.Name
Wscript.Echo objItem.DriverName
Next
我们认为,这总比什么都得不到要好,不过,单单名称不能准确地称之为打印机驱动程序的“详细情况”。 如果需要所谓的详细信息,您需要使用类似下面的脚本,该脚本只能在 Windows XP 或 Windows Server 2003 下运行:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colItems = objWMIService.ExecQuery _
("Associators Of {Win32_Printer.DeviceID='//atl-ps-01/printer1'} " _
& "WHERE AssocClass = Win32_DriverForDevice Role=Antecedent")
For Each objItem in colItems
Wscript.Echo objItem.Name
Wscript.Echo objItem.DriverPath
Next
在此我们要做的就是利用 Windows XP 和 Windows Server 2003 中所添加的两个新类。虽然没有看到它们在脚本中被明确提及,但我们仍将使用新的 Win32_PrinterDriver 类来检索同打印机驱动程序有关的信息;属性 Name 和 DriverPath(二者均在 For Each 循环中回显)是 Win32_PrinterDriver 类的属性。
第二个类 – 它在脚本中有明确的说明 – 是 Win32_DriverForDevice 类。 这是一个关联类,顾名思义,该类可在两个类之间建立一个关联;在本例中,Win32_DriverForDevice 在 Win32_Printer 类中的打印机和 Win32_PrinterDriver 类中的打印机驱动程序之间建立了一个关联。 要建立此关联,我们需要使用类似下面的 Associators Of 查询:
Set colItems = objWMIService.ExecQuery _
("Associators Of {Win32_Printer.DeviceID='//atl-ps-01/printer1'} " _
& "WHERE AssocClass = Win32_DriverForDevice Role=Antecedent")
用通俗易懂的话(并非脚本专家的专长!)解释此查询就是,“对 DeviceID 为 //atl-ps-01/printer1 的所有打印机使用 Win32_DriverForDevice 类来检索与该打印机关联的所有打印机驱动程序。”
此查询将照常返回一个集合,在本例中,返回的是与打印机 //atl-ps-01/printer1 关联的所有打印机驱动程序的集合。 在 For Each 循环中,我们遍历此集合并回显“Name”和“DriverPath”属性。 问题解决了。
您自己能够弄清楚的可能就这么多了;这个查询有点怪,但却相当直观。 有一件事情可能例外: Role=Antecedent 是什么意思? 在神奇的 WMI 世界里,antecedent 对象是关系独立的对象;换句话说,您可以具有各种打印驱动程序,这些打印驱动程序均不依赖于特定打印机。 然而,一台打印机只能具有一个打印驱动程序,这就意味着,打印机在关系方面扮演着从属角色。 (是的,这听起来确实像 Desperate Housewives(绝望的主妇)中的一段情节,不是吗?) 这就是说,我们可通过一些调整来彻底改变此脚本,使其查询 Win32_PrinterDriver 类以返回使用指定驱动程序的所有打印机的名称:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2")
Set colItems = objWMIService.ExecQuery _
("Associators Of {Win32_PrinterDriver.Name='Xerox Document Centre 255 PS,3,Windows NT x86'} " _
& "WHERE AssocClass = Win32_DriverForDevice Role=Dependent")
For Each objItem in colItems
Wscript.Echo objItem.DeviceID
Next
请试一试,看看会发生什么。
现在,如果您不介意,我们要…做…其他事情…。
(如果仍有疑问,那是因为没有书名为 The Third-Best and the Third-Brightest 的书: 季军可不像它听起来那样有趣!)