И снова о принтерах HP LJ серии 1018, 1020 и аналогичных

Обсуждения проблем с железом. Полезные советы по теме.


Модератор: UncleFather

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1505
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

И снова о принтерах HP LJ серии 1018, 1020 и аналогичных

Сообщение UncleFather »

Проблема:

У некоторых принтеров HP LaserJet (обычно, это простенькие персональные принтеры, подключаемые по USB типа HPLJ 1018 и HP LJ 1020) существует проблема, связанная, скорее всего, с ошибкой драйверов.
Проблема такая: при постановке на печать некоторых документов иногда происходит зависание (непредвиденная остановка) службы печати (spooler).
При этом, обычное отключение и включение принтера, очистка очереди печати и прочие манипуляции не помогают. Не всегда помогает даже полная перезагрузка компьютера.

Решение:

Самым действенным показал себя следующий метод:

  1. Выключаем принтер

  2. Останавливаем службу печати

    Код: Выделить всё

    net stop spooler
  3. Очищаем файлы очереди принтера (все файлы с расширением shd и spl из папки %systemroot%\system32\spool\printers):

    Код: Выделить всё

    del %systemroot%\system32\spool\printers\*.shd
    del %systemroot%\system32\spool\printers\*.spl

    При необходимости, устанавливаем права на папку %systemroot%\system32\spool\printers:

    Код: Выделить всё

    cacls %systemroot%\system32\spool\printers /E /C /G Администраторы:F
  4. Запускаем службу печати:

    Код: Выделить всё

    net start spooler

После этого принтер должен вновь нормально работать. Однако!!!, встречаются такие документы, которые при печати на вышеназванные принтеры HP LaserJet вызывают ошибку КАЖДЫЙ РАЗ. Такие документы нужно печатать на альтернативных (дополнительных) принтерах, подключенных к компьютеру. Как вариант - можно распечатать их на виртуальный принтер, а затем, этот преобразованный документ уже можно отправлять на реальный принтер HP LJ.

Для автоматизации очистки очереди и перезапуска службы печати можно пользоваться следующим ПО:

  • MicrosoftFixit-portable. Зеркало:

    MicrosoftFixit-portable.rar
    (198.13 КБ) 889 скачиваний
  • MicrosoftFixit.Printing.Run. Зеркало:

    MicrosoftFixit.Printing.Run.rar
    (198.12 КБ) 880 скачиваний
  • Командным файлом:

    Код: Выделить всё

    @Echo Off
    net stop spooler
    cacls %systemroot%\system32\spool\printers /E /C /G Ђ¤¬Ё­Ёбва в®ал:F
    del %systemroot%\system32\spool\printers\*.shd
    del %systemroot%\system32\spool\printers\*.spl
    net start spooler

    Перед выполнением файла необходимо отключить принтер, а после окончания выполнения - включить.

    Скачать этот файл:

    ClearSpoolerBat.rar
    (765 байт) 927 скачиваний

    Для Windows 7 и Vista:

    Этот скрипт необходимо запускать от имени администратора!!!

  • Слегка доработанным скриптом VBS (Visual Basic Script) от автора Hellsman:

    Код: Выделить всё

    Option Explicit
    Dim WshShell
    Dim objFSO
    Dim strComputer
    Dim objWMIService
    Dim colServiceList, objService, errReturn
    strComputer = "."
    
    MsgBox "Отключите проблемный принтер",0,"Внимание!!!"
    
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
     
     Set colServiceList = objWMIService.ExecQuery("Associators of " _
       & "{Win32_Service.Name='Spooler'} Where " _
            & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
      
    For each objService in colServiceList
        objService.StopService()
    Next
    
    
    Wscript.Sleep 20000
    
    
    Set colServiceList = objWMIService.ExecQuery _
            ("Select * from Win32_Service where Name='Spooler'")
    For each objService in colServiceList
        errReturn = objService.StopService()
    Next
    
    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    set WshShell = WScript.CreateObject("WScript.Shell")
    REM WshShell.Run "xcacls " & objFSO.GetFolder(objFSO.GetSpecialFolder(0) & "\system32\spool\PRINTERS\") & " /T /E /G Администраторы:F"
    WshShell.Run "cacls " & objFSO.GetFolder(objFSO.GetSpecialFolder(0) & "\system32\spool\PRINTERS\") & "  /E /C /G Администраторы:F"
    REM WshShell.Run "cacls " & objFSO.GetFolder(objFSO.GetSpecialFolder(0) & "\system32\spool\PRINTERS\") & "  /E /C /G Administrators:F"
    RecourseDeleteByMask objFSO.GetFolder(objFSO.GetSpecialFolder(0) & "\system32\spool\PRINTERS\"), "*.*"
    Set objFSO = Nothing
    
    
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='Spooler'")
    For each objService in colServiceList
        errReturn = objService.StartService()
    Next
    Wscript.Sleep 20000
    Set colServiceList = objWMIService.ExecQuery("Associators of " _
       & "{Win32_Service.Name='Spooler'} Where " _
            & "AssocClass=Win32_DependentService " & "Role=Dependent" )
    For each objService in colServiceList
        objService.StartService()
    Next
    
    WScript.Echo "Служба очереди печати перезапущена, нажмите OK"
    MsgBox "Включите принтер",0,"Можно печатать"
    
    WScript.Quit 0
    '================================================
    Sub RecourseDeleteByMask(objFolder, strMask)
        Dim objSubFolder
        Dim strFullMask
        
        'WScript.Echo objFolder.Path    Выводим путь обрабатываемой папки (для отладки; имеет смысл за комментировать).
            strFullMask = objFSO.BuildPath(objFolder.Path, strMask) ' Строим полный путь.
        
        objFSO.DeleteFile strFullMask, True ' Удаляем файлы по маске.
        
        On Error Resume Next  ' Обрабатываем ошибки, возможные в случае, когда нет доступа к содержимому папки(пример - «System Volume Information».
        For Each objSubFolder In objFolder.SubFolders
            If Err.Number = 0 Then    ' Удалось получить доступ к содержимому папки?
                RecourseDeleteByMask objSubFolder, strMask ' Вызываем процедуру для каждой из под папок.
            Else                                                         ' Если не удалось —
                Err.Clear' сбрасываем состояние ошибки и движемся дальше.
                'WScript.Echo "Can't enumerate subfolders for folder [" & objFolder.Path & "]."
            End If
        Next
        
        On Error Goto 0  ' Восстанавливаем стандартную обработку ошибок
    End Sub

    Скачать этот скрипт:

    ClearSpoolerVBS.rar
    (2.29 КБ) 897 скачиваний

    Для Windows 7 и Vista:

    Этот скрипт необходимо запускать от имени администратора!!!
    Для этого создаем ярлык для объекта "%SystemRoot%\System32\wscript.exe", в параметрах запуска которого указываем полный путь к скачанному скрипту VBS, например: "%UserProfile%\Desktop\ClearSpooler.vbs" чтобы получилось как-то так:

    01.jpg

    Нажимаем кнопку "Дополнительно" устанавливаем галочку "Запуск от имени администратора" и сохраняем измененные параметры:

    02.jpg
    02.jpg (36.82 КБ) 7887 просмотров

Дополнения:


Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение