Персональный сайт Александра Тауениса » Очистка очереди печати при загрузке ПК

Очистка очереди печати при загрузке ПК


Нередко бывает, что принтер отказывается печатать из-за застрявшей очереди заданий. В таких случаях приходится вручную очищать очередь, а также квитировать ошибку в самом принтере. И так каждый раз, когда недалёкие пользователи прибегают с просьбой «починить принтер» после того, как забыли вставить бумагу и даже с 20 попытки напечатать ничего не происходит. Чтобы решить эту задачу, можно пойти довольно простым путём — научить компьютер самостоятельно очищать очередь тогда, когда это надо пользователю.

Поскольку даже в Windows 10/Server 2019 нет функции автоматической очистки очереди, придётся добавить её вручную с помощью скрипта PowerShell. Этот метод предназначен только для обычных ПК с локальными принтерами. Отчасти он применим и для серверов печати, но там его стоит применять с умом, ведь тупая очистка очереди будет означать отмену абсолютно всех заданий в момент выполнения скрипта, что недопустимо в условиях активно работающего офиса.

Для начала запускаем среду разработки PowerShell ISE от имени администратора. В целом, можно использовать и обычный Блокнот, но PS ISE более удобна для работы со скриптами. В ней необходимо создать файл, например, C:\ClearSpool.ps1 со следующим содержимым:

echo "Очистка очереди печати для всех принтеров"
Get-Service *spool* | Stop-Service -Force -Verbose
Start-Sleep -Seconds 2
$path = "C:\Windows\System32\spool\PRINTERS\"
Get-ChildItem $path | Remove-Item -Force -Verbose
Get-Service Spooler | Start-Service -Verbose
echo "Принтеры готовы к использованию"

Этот скрипт будет очищать очередь, чтобы могли приниматься новые задания. Для любопытных рассмотрим принцип его действия. Сначала скрипт принудительно останавливает службу диспетчера печати (Spooler). Затем делается задержка 2 секунды, чтобы все файлы, использовавшиеся службой, освободились. Далее углубляемся в принцип работы шпулера. Все задания технически выполнены как файлы в каталоге C:\Windows\System32\spool\PRINTERS\. Этот каталог вместе с содержимым надо удалить. После чего перезапускаем службу диспетчера печати, и со стороны Windows принтеры становятся готовыми к печати новых заданий.

Казалось бы, скрипт готов, можно сохранять файл, делать ярлыки, и всё. Но нет, система Windows 7 (как и ХР, 2008, 10 и прочие) имеет многоуровневую защиту от скриптов сомнительного происхождения. При попытке запустить данный скрипт вылезает ошибка:
PS C:\Windows\system32> C:\ClearSpool.ps1
Не удается загрузить файл C:\ClearSpool.ps1, так как выполнение скриптов запрещено для данной системы. Введите "get-help about_signing" для получения дополнительных сведений.
At line:0 char:0

Чтобы Windows прекратил кочевряжиться и сдался перед повелителем, необходимо снизить уровень безопасности скриптов. С одной стороны, это опасно, т.к. любой желающий сможет запускать скрипты PowerShell и делать ими всё, что захочет. Но с другой стороны, я ещё не слышал, чтобы через такую дыру что-либо делали недоброжелатели.

Для этого достаточно одной команды PS: Set-ExecutionPolicy -ExecutionPolicy Unrestricted. Теперь скрипты PowerShell будут работать на этом компьютере.

Чтобы запустить скрипт, можно сделать ярлык на «powershell C:\ClearSpool.ps1» и запускать его с правами администратора. После выполнения скрипта, скорее всего, придётся перезапустить принтер кнопкой питания, либо сбросить ошибку соответствующей кнопкой на корпусе. Но к сожалению не каждый пользователь так может сделать, некоторые «особо одарённые» граждане в состоянии лишь перезагрузить то, к чему могут дотянуться, причём только дёрганием из розетки всех чудо-аппаратов сразу.

Чтобы оператор ЭВМ мог победить «поломку» принтера простой перезагрузкой всего, скрипт надо добавить в автозагрузку. Можно просто добавить ярлык на скрипт в меню автозагрузки, но тогда каждый раз при включении «пекарни» будет вылезать окно UAC с запросом прав администратора. Чтобы этого окна не было, самый удобный способ это запускать скрипт через Планировщик заданий («Назначенные задания» в WinXP/2003).

Запускаем Планировщик (taskschd.msc), и добавляем задачу на запуск нашего скрипта.

В разделе Параметры безопасности необходимо поставить галочку «Выполнять с наивысшими правами». Переходим к триггерам. Тут можно выбрать любой вариант, который устроит и пользователя, и администратора. Самый простой вариант — это выбрать режим «при входе в систему». Для принт-серверов подходит вариант «по расписанию», назначенный на ночь или время обеда в организации. Для ноутбуков надо обязательно перейти на вкладку «Условия», и снять 2 галочки про запуск только от сети 220В. Теперь последний штрих — вкладка «Действия». В ней нужно сделать всего одну запись: запуск программы «powershell C:\ClearSpool.ps1» (или то, что указывали в ярлыке).

Всё! Теперь операционная система будет сама чистить забившуюся очередь, и принтер будет оживать без помощи администратора даже в коллективе конченых ламеров.



Оставить комментарий

Защита от спама * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.