2

У меня есть устаревшее приложение, которое печатает, и я не могу отключить это в приложении. Эта задача печатает в определенную Windows очередь принтера. Проблема, с которой я сталкиваюсь, заключается в том, что без реального подключенного принтера очередь печати наполняется, а затем задания, которые печатаются, останавливаются, ожидая, пока очередь ответит, что задание принято.

Устаревшее приложение печатает с помощью скриптов Powershell.

if( sm_control_flag )
{
    get-content $TO_PRINTER | Out-Printer -name $cfgs.PRINTER_QUEUE
}

Проблема в том, что эти сценарии нельзя изменить, поскольку они находятся в производстве в распределенных местах. Существует целый ряд сценариев, которые выполняют этот процесс.

Out-Printer должен вернуть успех, а не ошибку, иначе скрипт будет прерван с ошибкой печати. Следовательно, очередь должна существовать (это, в основном, принтер, определенный в ОС Windows Server).

Если в очереди не определен и не подключен настоящий принтер, Windows примет задание и поставит выходные данные на печать. Проблема в том, что очередь в конечном итоге заполнит свободное место на сервере, а затем заблокирует всю печать. Out-Printer сценария Powershell также приостановит и будет ожидать освобождения места в очереди, когда очередь заполнится.

Я не могу отключить печать на компьютере и удалить задания, так как другие принтеры подключены и нуждаются в печати. Мне нужен драйвер принтера, который просто принимает задание на печать, но ничего с ним не делает. Мне не нужно его печатать, просто удалите.

Я также пытался просто напечатать в файл, чтобы я мог повторно использовать одно и то же имя файла каждый раз, что переписывало бы последний вывод на печать и отвечало моим потребностям. Проблема в том, что печать в файл всегда, кажется, запрашивает у пользователя имя файла. Поскольку это сервер Windows, пользователь не может запрашивать имя файла, поэтому он блокирует очередь и также приостанавливает выполнение сценария.

Кто-нибудь знает способ принять задания, а затем просто удалить вывод, а не распечатать задание?

2 ответа2

2

Откройте Control Panel и выберите « Devices and Printers .

Когда откроется окно « Device and Printers , выберите « Add Printer . Что будет дальше, зависит от вашей сети и от того, какая у вас версия Windows, но вам может потребоваться выбрать нужный The printer I want isn't listed.

В этот момент у вас должно появиться окно с переключателем для Add a local printer or network printer with manual settings . Выберите эту опцию и нажмите кнопку Next .

Отсюда вы можете Use an existing port: и выбрать nul: (Local Port) из выпадающего списка.

Снова нажмите кнопку Next и теперь вы можете выбрать практически любой драйвер принтера, присвоить ему имя и завершить настройку.

Принтер, который вы только что создали, будет черной дырой в системе. Он будет обрабатывать задания на печать с использованием выбранного вами драйвера, в том числе очищать задание из очереди на печать, но вывод не будет выполнен.

1
strPort="<printer port name"
strNameSpace= "root\cimv2"
#the sql/wql query can be changed to go on other values.

#prepare to connect to a remote computer
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
#connect to a remote computer 
#strUser local or domain admin username
#strPassword password for above
Set oService = oLocator.ConnectServer(strServer, strNameSpace, strUser, strPassword)
#Set administrator privileges
oService.Security_.impersonationlevel = 3
oService.Security_.Privileges.AddAsString "SeLoadDriverPrivilege"
#Query the internal representation of the printer
Set oPrinter=oService.ExecQuery("SELECT * FROM Win32_Printer where DeviceID like'"&strPort&"%'")
#alternative query option
#Set oPrinter=oService.ExecQuery("SELECT * FROM Win32_Printer where Name like'"&strPort&"%'")
#If you give the strPort and exact name only 1 printer will match
#It can match multiple printers if two printer have similiar names
# printer:  me-1 and me-2 with both be matched by strPort="me"
For Each Printer In oPrinter
#pause the printer
uResult = Printer.Pause()
#cancel all jobs
uResult = Printer.CancelAllJobs()
#if any error occures uResult will not be 0
if uResult <>0 then wscript.echo "Error occured"
Next

Если вы запускаете скрипт на компьютере с очередью печати, вам могут не потребоваться учетные данные.

Сохранить как файл vbs cscript what.vbs

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .