Ситуация когда простенький программный принтер вдруг «завис», включение и выключение самого принтера ничего не дают, а задание на печать из очереди не удаляется, не редка. К тому же, усугубляется она тем, что документ на печать обычно посылается ни раз и не два, а гораздо больше, а после перезапуска только и успеваешь, что вытащить из принтера бумагу, ибо он «вспоминает» о всех заданиях и пытается их выполнить.
Решение первое — быстрое, рабочее, не требующее калорий для обдумывания и осуществления:
- Создаем файл с говорящим названием, например cleanspool.cmd (название может быть любым)
- Помещаем в него следующий текст:
net stop spooler
del /F /S /Q %systemroot%\system32\spool\printers\*.*
net start spooler
net stop spooler
del /F /S /Q %systemroot%\system32\spool\printers\*.*
net start spooler - Запускаем (с правами Администратора), ждем 30-60 секунд (до закрытия окна)
- Радуемся очищенной очереди печати ВСЕХ принтеров
Дабы минимизировать расход калорий, файл можно скачать (CMD, 184B) в готовом виде. Данный файл можно поместить в автозагрузку и тогда есть шанс, что принтер не станет «вспоминать» о невыполненных заданиях каждый раз. Если пользователь не залогинился сразу, либо случилось так, что очередь до запуска скрипта не сразу дошла, принтер таки успеет что-то напечатать.
Решение второе — обстоятельное, требующее навыков, без описания деталей:
Если немного проанализировать код скрипта из первого способа, становится понятно что мы два раза подряд останавливаем службу очереди печати, очищаем некую директорию и запускаем службу вновь. Обычно, рекомендуется делать эту процедуру однократно, но у меня почему-то из пары файлов задания SPL и SHD, удаляется только один, до второго нет доступа/прав. А при повторном удалении удаляется и второй. Ключи /F /S /Q возможно излишни, но это привычка.
У данного способа есть один минус, не общий, но серьезный — чистится очередь печати ВСЕХ принтеров, иногда это неприемлемо. Для решения проблемы можно разнести директории очереди печати для разных принтеров. Делается это так:
- Создаем директории для очереди печати принтеров, например, c:\spool\aculaser4000, c:\spool\xerox1118, c:\spool\samsung3310 (это мои принтеры и мои пути, они естественно не абсолютны).
- Запускаем редактор реестра
- В редакторе реестра ищем раздел
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\ИМЯ_ПРИНТЕРА]
- Меняем значение параметра SpoolDirectory на путь к папке, которую мы создали, например, c:\spool\ИМЯ_ПРИНТЕРА
- Меняем значения указанного параметра у остальных принтеров
- Закрываем редактор реестра
- —
- Если необходимо изменить директорию очереди печати для всех принтеров, нужно поработать с параметром DefaultSpoolDirectory, находящимся по адресу:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers]
- Если захочется всё вернуть «как было», значение параметра нужно изменить на %systemroot%\system32\spool\printers или оставить пустым, несли не менялся путь в предыдущем пункте
Содержание CMD файла естественно немного изменится, думаю, не нужно объяснять как.
Чисто теоретически, службе печати можно установить тип запуска вручную и запускать её подобным методом из logon-скриптов, предварительно очистив очередь.
очередь в принтере висела и никак не хотела удаляться, а Ваши рекомендации помогли огромное-огромное спасибо!
Единственный метод который помог. Даже после перезапуска системы файл продолжал висеть в очереди на удаление и ничего не происходило.