2017-01-20 3 views
0

Я попытался использовать WMI-Object, чтобы изменить настройки лотка для бумаги в PowerShell. Однако я только что узнал, что значение, которое я пытаюсь изменить, доступно только для чтения. Может ли кто-нибудь помочь мне выполнить задачу через powershell или VBScript?Измените настройки лотка для бумаги принтера с помощью powershell

$printers = Get-WMIObject -Class Win32_PrinterConfiguration | Where-Object {$_.Name -EQ "CHK.Checks"} 
$printers.MediaType = 270 
$printers.Put() 

Я попытался это сделать, и это не сработало.

Пожалуйста, помогите!

Заранее благодарен!

+0

Было бы полезно, если бы вы сообщили о любых полученных сообщениях об ошибках или явно заявили, что не получили сообщения об ошибке. В последнем случае было бы также полезно узнать, как вы определили, что «это не сработало». –

+0

@JeffZeitlin Сообщения об ошибках здесь не будут полезны, так как Джессика заявила, что значение доступно только для чтения, что означает, что WMI, к сожалению, не будет работать. – BenH

+0

@JeffZeitlin Ошибка была «Exception call« Put »с аргументом« 0 »:« Провайдер не способен к попытке операции », который я исследовал и привел к странице, которая сказала мне, что она доступна только для чтения. –

ответ

1

Поскольку значение доступно только для чтения, вы не сможете использовать WMI для его установки. .Net имеет System.Printing имеет установку входного бина, которая не идеальна, но работает. Я сделал функцию вокруг этого в моем модуле PSPrintTools. Я думаю, что Tray1, Tray2 тоже работают как ценности, но я не помню с головы. Вне этого вы можете редактировать XML-файл PrintTicket. Вот соответствующий код только для этой функции:

$Printer = "Example Printer Name" 
$InputBin = "AutoSelect","AutoSheetFeeder","Cassette","Manual","Tractor" #choose one 
Add-Type -AssemblyName System.Printing 
$Permissions = [System.Printing.PrintSystemDesiredAccess]::AdministrateServer 
$QueuePerms = [System.Printing.PrintSystemDesiredAccess]::AdministratePrinter 
$PrintServer = new-object System.Printing.LocalPrintServer -ArgumentList $Permissions 
$NewQueue = New-Object System.Printing.PrintQueue -ArgumentList $PrintServer,$Printer,1,$QueuePerms 
$InputBinCaps = $NewQueue.GetPrintCapabilities().InputBinCapability 
if ($null -ne $InputBinCaps) { 
    if ($InputBinCaps.Contains([System.Printing.InputBin]::$InputBin)) { 
     $NewQueue.DefaultPrintTicket.InputBin = [System.Printing.InputBin]::$InputBin 
     $NewQueue.UserPrintTicket.InputBin = [System.Printing.InputBin]::$InputBin 
    } else { 
     Write-Error "$InputBin unavailable on $Printer" 
    } 
} 
$NewQueue.commit() 
$NewQueue.dispose() 
$PrintServer.commit() 
$PrintServer.dispose() 
+0

Я выполнил ваш сценарий. Я должен был добавить закрытие «}» до конца вашего оператора if, но он отлично справился с настройкой лотка! Тем не менее, мне действительно нужно изменить «Тип бумаги». Мне нужно установить это значение в качестве препринта, а не: «Использовать настройки принтера». –

+0

Исправлено отсутствие {. Это то, что я получаю от резки и склеивания. Размер страницы более приятный, это свойство 'PageMediaType'. Модуль GitHub имеет это значение как параметр для функции «Set-PSPTPrintConfiguration», или вы можете изменить мой код здесь, чтобы быть «PageMediaType», а не «InputBin». – BenH

+0

Удивительно, что я очень ценю помощь, которая работает. Но он работает только для значений, заполненных в «GetPrintCapabilities(). PageMediaTypeCapability» @BenH. Предварительная печать не является вариантом для этого поля. Если я попытаюсь изменить его на связь, он работает безупречно. Но предварительно напечатанные возвраты: «Невозможно найти перегрузку для« Содержит »и аргумент count:« 1 ​​».» –