Что нового

Процессы Как проверить статус службы?

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
92
Репутация
-1
Нашёл на англофоруме такой скрипт
Код:
$servicename = 'TotalCMD'

$stdout = Run('sc.exe query ' & $servicename, '', @SW_HIDE, 2)
$data = _StdOut($stdout)

Func _StdOut($stdout)
    Local $data
    Local $Status
    While 1
        $data = StdOutRead($stdout)
        If @error Then $Status = 'Error'
        If $data Then
            $data = StringStripWS($data, 4)
            Select
                Case StringInStr($data, 'STATE : 1')
                    $Status = 'Stopped'
                Case StringInStr($data, 'STATE : 4')
                    $Status = 'Running'
                Case Else
                    $Status = 'Not Installed'

            EndSelect
        Else
            Sleep(100)
        EndIf
        MsgBox(0, 'Service Status', $Status)
    WEnd
EndFunc

Но при выполнении ругается на $Status в MsgBox
Как это поправить?
 

All2khoff

Продвинутый
Сообщения
376
Репутация
68
дабы исключить "кракозябры" с локализацией вывода русских букв я статус отслеживал собственно по буквенному описанию статуса..
Так же очень помогает вывод в консоль той информации с которой требуется работать, потом просто убираем вывод в консоль.
1730356701211.png
Код:
ConsoleWrite($data&@CRLF)
        If @error Then $Status = 'Error'
        If $data Then
            $data = StringStripWS($data, 4)
            Select
                Case StringInStr($data, 'Stopped')
                    $Status = 'Stopped'
                Case StringInStr($data, 'Running')
                    $Status = 'Running'
                Case Else
                    $Status = 'Not Installed'
            EndSelect
        Else
            Sleep(100)
        EndIf
 
Автор
BlagoYar

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
92
Репутация
-1
дабы исключить "кракозябры" с локализацией вывода русских букв я статус отслеживал собственно по буквенному описанию статуса..
Так же очень помогает вывод в консоль той информации с которой требуется работать, потом просто убираем вывод в консоль.
Посмотреть вложение 6296
Код:
ConsoleWrite($data&@CRLF)
        If @error Then $Status = 'Error'
        If $data Then
            $data = StringStripWS($data, 4)
            Select
                Case StringInStr($data, 'Stopped')
                    $Status = 'Stopped'
                Case StringInStr($data, 'Running')
                    $Status = 'Running'
                Case Else
                    $Status = 'Not Installed'
            EndSelect
        Else
            Sleep(100)
        EndIf
Извиняюсь, ничего не понял.
 

All2khoff

Продвинутый
Сообщения
376
Репутация
68
У англоязычников нет проблем со статусом служб ибо у них и операционная система на английском.
А у вас же скорее всего как и у меня операционная система переведена на русский.
И как следствие некоторые слова у нас написаны не так как у англоязычников...
так попробуйте.
Код:
$servicename = 'TotalCMD'

$stdout = Run('sc.exe query ' & $servicename, '', @SW_HIDE, 2)
$data = _StdOut($stdout)

Func _StdOut($stdout)
    Local $data
    Local $Status
    While 1
        $data = StdOutRead($stdout)
        ConsoleWrite($data&@CRLF)
        If $data Then
            $data = StringStripWS($data, 4)
            Select
                Case StringInStr($data, 'Stopped')
                    $Status = 'Stopped'
                Case StringInStr($data, 'Running')
                    $Status = 'Running'
                Case Else
                    $Status = 'Not Installed'
            EndSelect
        Else
            Sleep(1000)
        EndIf
        ConsoleWrite('Service Status '& $Status&@CRLF)
    WEnd
EndFunc

заменил мсбокс на консоль и поправил опечатку
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,444
ругается на $Status
Что значит "ругается"? У меня этот код выводит сначала 'Not Installed', потом 'Error'. И это правильно при отсутствии службы TotalCMD.

Попробуйте так.
Код:
$servicename = 'TotalCMD'

$stdout = Run('sc.exe query ' & $servicename, '', @SW_HIDE, 2)
ProcessWaitClose("sc.exe")

$data = StdOutRead($stdout)
$data = DllCall('user32.dll', 'bool', 'OemToCharA', 'str', $data, 'str', 0)[2]
MsgBox(0, '', $data)
$Status = 'error'
If $data Then
    $data = StringStripWS($data, 4)
    Select
        Case StringInStr($data, 'Stopped')
            $Status = 'Stopped'
        Case StringInStr($data, 'Running')
            $Status = 'Running'
        Case Else
            $Status = 'Not Installed'
    EndSelect
EndIf
ConsoleWrite($servicename & " : " & $Status & @CRLF)
MsgBox(0, '', $Status)
 

Alecsis

Осваивающий
Сообщения
122
Репутация
43
А может не морочиться с бомжовым ANSI-выхлопом, а попросту употребить власть WinAPI? :acute:
Навскидку так. почти без дуракозащиты:
Код:
#pragma compile(Console, True)
#pragma compile(x64,     True)
; ──────────────
Opt('MustDeclareVars', True)
; ──────────────────────────────────────
#include <AutoItConstants.au3>
#include <FileConstants.au3>
; ──────────────
Local Const  _
  $csSvcDLL     = 'advapi32.dll', _
  $csQSvcStat   = _
    'struct; '                            & _ ;   https://learn.microsoft.com/en-us/windows/win32/api/winsvc/ns-winsvc-service_status
      'DWORD dwServiceType; '             & _
      'DWORD dwCurrentState; '            & _
      'DWORD dwControlsAccepted; '        & _
      'DWORD dwWin32ExitCode; '           & _
      'DWORD dwServiceSpecificExitCode; ' & _
      'DWORD dwCheckPoint; '              & _
      'DWORD dwWaitHint; '                & _
    'endstruct'

Local Const _ ; https://learn.microsoft.com/en-us/windows/win32/api/winsvc/ns-winsvc-service_status_process
  $SERVICE_CONTINUE_PENDING = 0x00000005, _ ; The service is about to continue.
  $SERVICE_PAUSE_PENDING    = 0x00000006, _ ; The service is pausing.
  $SERVICE_PAUSED           = 0x00000007, _ ; The service is paused.
  $SERVICE_RUNNING          = 0x00000004, _ ; The service is running.
  $SERVICE_START_PENDING    = 0x00000002, _ ; The service is starting.
  $SERVICE_STOP_PENDING     = 0x00000003, _ ; The service is stopping.
  $SERVICE_STOPPED          = 0x00000001    ; The service has stopped.
;
Local _
  $sSvcName,  _ ; имя службы
  $vDLL,      _ ; результат вызова DllCall
  $hAPI,      _ ; хендл DLL с ф-циями втч отн к службам
  $hSvcMgr,   _ ; -"- диспетчера служб
  $hSvc,      _ ; -"- проверяемой службы
  $tSvcStat,  _ ; структура с инф о состоянии службы
  $iState,    _ ; код состояния службы
  $sMsg
  ;
  $sSvcName = 'spooler' ; имя интересующей службы
;~   $sSvcName = 'TotalCMD' ; имя интересующей службы
  ;
  $hAPI = DllOpen($csSvcDLL)

; Открыть диспетчер служб без всяких заморочек для локального компа
; https://learn.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-openscmanagerw
;
$vDLL = DllCall($hAPI, 'HANDLE', 'OpenSCManagerW', 'ptr', 0, 'ptr', 0, 'DWORD', $GENERIC_READ)
$hSvcMgr = $vDLL[0]
;

; Заполучить хендл искомой службы. Не факт, что таковая существует
; https://learn.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-queryservicestatus
;
;
  $vDLL = DllCall($hAPI, 'HANDLE', 'OpenServiceW', 'HANDLE', $hSvcMgr, 'wstr', $sSvcName, 'DWORD', $GENERIC_READ)
  If @Error Then
    MsgBox(0x30, @ScriptName, 'Что-то не так со службой ' & $sSvcName)
    Exit 362
  EndIF
  $hSvc = $vDLL[0]
  ;
  $tSvcStat = DllStructCreate($csQSvcStat)  ; структура ответа на опрос в какой позе служба
  $vDLL = DllCall($hAPI, 'BOOL', 'QueryServiceStatus', 'HANDLE', $hSvc, 'struct*', $tSvcStat)
  If @Error Or $vDLL[0] = 0 Then
    MsgBox(0x30, @ScriptName, 'Что-то не так со службой ' & $sSvcName)
    Exit 412
  EndIF
  ;
  $iState = DllStructGetData($tSvcStat, 'dwCurrentState') ; вытащить состояние службы
  $sMsg = $sSvcName & ' ' & ($iState = $SERVICE_RUNNING ? 'работает' : 'не работает')
  MsgBox(0, @ScriptName, $sMsg)
  #cs
  убрать за собой мусор :)
  #ce
  DllClose($hSvc)
  DllClose($hAPI)
Exit
 
Последнее редактирование:
Автор
BlagoYar

BlagoYar

Русь Великая, Очнись! Поднимись с колен Родная!
Сообщения
92
Репутация
-1
Что значит "ругается"?
Да, чёт изначально выложил то, что уже сам пытался подправить, MsgBox был в самом низу и ругался
Код:
$servicename = 'TotalCMD'

$stdout = Run('sc.exe query ' & $servicename, '', @SW_HIDE, 2)
$data = _StdOut($stdout)

Func _StdOut($stdout)
    Local $data
    Local $Status
    While 1
        $data = StdOutRead($stdout)
        If @error Then $Status = 'Error'
        If $data Then
            $data = StringStripWS($data, 4)
            Select
                Case StringInStr($data, 'STATE : 1')
                    $Status = 'Stopped'
                Case StringInStr($data, 'STATE : 4')
                    $Status = 'Running'
                Case Else
                    $Status = 'Not Installed'

            EndSelect
        Else
            Sleep(100)
        EndIf

    WEnd
EndFunc

MsgBox(0, 'Service Status', $Status)




Что значит "ругается"? У меня этот код выводит сначала 'Not Installed', потом 'Error'. И это правильно при отсутствии службы TotalCMD.
Попробуйте так.
А вот так работает.
А может не морочиться с бомжовым ANSI-выхлопом
Да может, а бы знал как :smile:

Работает, но нужно проверить именно статус, то бишь нужно знать служба Остановлена/Не установлена/Приостановлена/и т.д.
 
Верх