У меня есть среда с несколькими сотнями компьютеров. Я пытаюсь записать vBscript, который выполняет и добавляет соответствующий принтер. Названия принтера могут быть определены с помощью подсказок об имени компьютера. Мой сценарий (немного грязный из-за отладки) следующие:
'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, кажется, является крайне медленным и привязывает ЦП на сервере. Когда я комментирую первый запрос и некомментирую второе (для перечисления всех принтеров), это, кажется, буферизует путем вывода:
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, вот почему "сделанные запросы" печатают сначала. Теперь, по-видимому, "сетевое представление" не использует WMI, так как это супер быстро. Я мог записать VBScript для парсинга "сетевого представления", но это кажется очень неуклюжим. Существует ли лучший путь?
"Win32_Printer" и "net view" опрашивают различные объекты. "Win32_Printer" перечислит все установленные объекты принтера и может быть довольно медленным на серверах печати. Это приведет к появлению большого количества хороших данных и некоторых функций управления. Однако, вас интересуют только имена очередей, так что, скорее всего, это перебор для ваших нужд. С другой стороны, "net view" запрашивает список общих объектов. Он не возвращает почти столько же данных и не выставляет какие-либо функции управления, но работает намного быстрее. Вы можете имитировать это с помощью WMI, используя объект "Win32_Share".
Для вашего кода попробуйте изменить 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'. Это запросит список разделяемых объектов на сервере и должно работать намного быстрее. Однако предупреждаем, что это вернет только список SHARED принтеров. Вероятно, это нормально для сервера печати, где принтеры, которые вас интересуют, также являются общими.
.