用于查询共享打印机的WMI的替代方法

我有一个有几百台电脑的环境。 我正在尝试编写运行的vBscript并添加适当的打印机。 打印机名称可以使用有关计算机名称的线索来确定。 我的脚本(由于debugging有点脏)如下:

'Key vars printServer = "SERVER" Set WshNetwork = CreateObject("WScript.Network") 'Extract computer name and take the first two fields cNameParts=Split(WshNetwork.ComputerName,"-") printerNamePrefix = cNameParts(0) + "-P" + cNameParts(1) Set objWMIService = GetObject("winmgmts:\\" & printServer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select Name from Win32_Printer WHERE Name LIKE '" + printerNamePrefix + "-%'",,48) 'Set colItems = objWMIService.ExecQuery("Select Name from Win32_Printer",,48) Wscript.Echo "Done querying.." printerName = "" For Each printerObj in colItems printerName = printerObj.Name Wscript.Echo printerName Next PrinterPath = "\\" + UCASE(printServer) + "\" + printerName Wscript.Echo "Adding " + PrinterPath WshNetwork.AddWindowsPrinterConnection PrinterPath, PrinterDriver WshNetwork.SetDefaultPrinter PrinterPath 

现在WMI似乎很痛苦地挂在服务器上的CPU。 当我评论第一个查询并取消注释第二个(枚举所有打印机)它似乎通过输出缓冲:

 PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME (wait a few sec) PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME PRINTER_NAME (wait a few sec) 

我知道WMI返回asynchronous,这就是为什么“完成查询”打印第一。 现在显然“净视图”不使用WMI,因为它超快。 我可以编写一个VBScript来parsing“净视图”,但看起来很笨重。 有没有更好的办法?

“Win32_Printer”和“networking视图”查询不同的对象。 “Win32_Printer”将枚举所有已安装的打印机对象,并且在打印服务器上可能会很慢。 这将暴露出大量的好数据和一些pipe理function。 但是,你只对队列的名字感兴趣,所以这可能是为了你的需要而被过度杀死的。 另一方面,“networking视图”查询共享对象列表。 它不会返回太多的数据,也不会公开任何pipe理function,但运行速度会更快。 您可以使用“Win32_Share”对象来模仿WMI。

对于您的代码,请尝试更改您的WMI查询

 Set colItems = objWMIService.ExecQuery("Select Name from Win32_Printer WHERE Name LIKE '" + printerNamePrefix + "-%'",,48) 

 Set colItems = objWMIService.ExecQuery("Select Name from Win32_Share WHERE Name LIKE '" + printerNamePrefix + "-%'",,48) 

请注意,我只是将“Win32_Printer”更改为“Win32_Share”。 这将查询服务器上的共享对象的列表,并应运行得更快。 尽pipe如此,这只会返回一个共享打印机列表。 对于打印服务器来说,这可能是确定的,您可能也会共享您感兴趣的打印机。