Всем здравствуйте.
Возможно ли изменить автоматически из теста принтер по умолчанию?И как это можно реализовать
Отправлено 16 июля 2014 - 09:23
Всем здравствуйте.
Возможно ли изменить автоматически из теста принтер по умолчанию?И как это можно реализовать
Отправлено 16 июля 2014 - 10:44
Можно, с помощью WMI класса Win32_Printer:
// JScript function SetDefaultPrinter() { var strPrinterName = "Adobe PDF"; // Имя принтера в Devices & Printers var oWMI = GetObject("winmgmts:root/cimv2"); try { var res = oWMI.Get("Win32_Printer.DeviceID='" + strPrinterName + "'").SetDefaultPrinter(); if (res != 0) { Log.Error(aqString.Format("Could not set the default printer. Error %d: %s", res, aqUtils.SysErrorMessage(res))); } } catch (e) { Log.Error(aqString.Format("Error %#x: %s", e.number, e.message)); } }
Отправлено 17 июля 2014 - 05:25
modbear, спасибо большое за совет.
На основании вашего кода написала для DelphiScript, возможно кому-то ещё пригодится, поэтому оставлю здесь.
function SetDefaultPrinter; var Locator, WmiService, Res, PrinterName; begin Locator: = Sys.OleObject ('WbemScripting.SWbemLocator'); WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', ''); PrinterName := 'Microsoft XPS Document Writer'; // Имя принтера в Devices & Printers try begin Res := WmiService.Get('Win32_Printer.DeviceID='+#39+'' + PrinterName + ''+#39+'').SetDefaultPrinter; result := True; if Res <> 0 then begin Log.Error(aqString.Format('Could not set the default printer', Res, aqUtils.SysErrorMessage(Res))); result := False; end; end; except begin Log.Error(aqString.Format('Error ', ExceptionMessage)); result := False; end; end; end;
Отправлено 18 июля 2014 - 03:34
Можно, с помощью WMI класса Win32_Printer:
// JScript function SetDefaultPrinter() { var strPrinterName = "Adobe PDF"; // Имя принтера в Devices & Printers var oWMI = GetObject("winmgmts:root/cimv2"); try { var res = oWMI.Get("Win32_Printer.DeviceID='" + strPrinterName + "'").SetDefaultPrinter(); if (res != 0) { Log.Error(aqString.Format("Could not set the default printer. Error %d: %s", res, aqUtils.SysErrorMessage(res))); } } catch (e) { Log.Error(aqString.Format("Error %#x: %s", e.number, e.message)); } }
modbear, возможно вы знаете как используя DelphiScript определить принтер, который используется по умолчанию.
function GetDefaultPrinter; var Locator, WmiService, PrinterName, objPrinter, WbemObject; begin Locator: = Sys.OleObject ('WbemScripting.SWbemLocator'); WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', ''); objPrinter := WMIService.Get('Win32_Printer.Default=True'); //если использовать эту строку, то в логе ошибка SWbemServicesEx //если получать принтер запросом: WbemObject := WmiService.ExecQuery('Select * from Win32_Printer Where Default = True'); //то я не знаю, как получить результат запроса, чтобы затем определить имя принтера.
в примерах http://msdn.microsof...8(v=vs.85).aspx есть код, как определить принтер по умолчанию, но у меня не получается изменить его под DelphiScript
Отправлено 18 июля 2014 - 06:49
У вас почти получилось. Надо по результатам ExecQuery пройтись enumerator'ом:
function GetDefaultPrinter; var Locator, WmiService, PrinterName, objPrinter, colPrinters, enumPrinters; begin Locator: = Sys.OleObject ('WbemScripting.SWbemLocator'); WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', ''); colPrinters := WmiService.ExecQuery('Select * from Win32_Printer Where Default = True'); enumPrinters := Enumerator(colPrinters); while not enumPrinters.AtEnd do begin objPrinter := enumPrinters.Item; Log.Message(objPrinter.Name); enumPrinters.MoveNext; end; end;
Отправлено 18 июля 2014 - 08:15
У вас почти получилось. Надо по результатам ExecQuery пройтись enumerator'ом:
function GetDefaultPrinter; var Locator, WmiService, PrinterName, objPrinter, colPrinters, enumPrinters; begin Locator: = Sys.OleObject ('WbemScripting.SWbemLocator'); WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', ''); colPrinters := WmiService.ExecQuery('Select * from Win32_Printer Where Default = True'); enumPrinters := Enumerator(colPrinters); while not enumPrinters.AtEnd do begin objPrinter := enumPrinters.Item; Log.Message(objPrinter.Name); enumPrinters.MoveNext; end; end;
у меня после выполнения теста в лог ничего не падает, тест просто проходит как успешный.
результат у запроса Select * from Win32_Printer Where Default = True есть, т.к. если в коде прописать
if colPrinters.Count>0 then Log.Message('Установлен принтер по умолчанию'), то в лог попадает сообщение.
Отправлено 18 июля 2014 - 08:44
Странно. А попробуйте так (это тот же самый ExecQuery, только через командную строку):
function GetDefaultPrinter; var oShell, oExec, str, strPrinterName; begin oShell := Sys.OleObject['WScript.Shell']; oExec := oShell.Exec('wmic printer where default="true" get name /value'); str := oExec.StdOut.ReadAll; // wmic ... get ... /value returns a string in the format "Name=PrinterName". // Remove blank lines at the beginning and end str := aqString.Trim(str, aqString.stAll); // Get just the value aqString.ListSeparator := '='; strPrinterName := aqString.GetListItem(str, 1); Log.Message(strPrinterName); end;
Отправлено 18 июля 2014 - 08:59
этот вариант через командную строку работает, спасибо за помощь
0 пользователей, 0 гостей, 0 анонимных