Перезапуск службы «Диспетчер очереди печати» при ее зависании

Заметил общий глюк принтеров HP LaserJet, связанный скорей всего в ошибках драйверов. Глюк следующий: при постановке в печать документов иногда происходит зависание службы печати. Просто отключение и включение принтера, очистка очереди печати и прочие манипуляции не помогают, единственное это перезагрузка ПК. Однако еще можно остановить службу печати, очистить очередь печати и заново ее запустить, тогда принтер оживает и начинает нормально функционировать. Чтобы не лазить постоянно в службы и не лезть в папку Windows для очистки очереди я использую следующий cmd-файл:

@net stop spooler
@del %WINDIR%\SYSTEM32\spool\Printers\*.* /q
@net start spooler

Или VBS-скрипт:

Option Explicit
Dim objFSO
Dim strComputer
Dim objWMIService
Dim colServiceList, objService, errReturn
strComputer = "."


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")
RecourseDeleteByMask objFSO.GetFolder("%WinDir%\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"

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

Данный скрипт останавливает службу, затем очищает очередь (файлы в папке %WinDir%\System32\spool\Printers), а затем запускает снова службу «Диспетчер очереди печати«.

comments powered by HyperComments
Anonymous
2013-07-06 11:45:31
то, что надо!
Hellsman
2013-07-12 10:01:40
я рад что вам это пригодилось :)