Что нового

Проблемы с регуляркой

Tuxzer92

Новичок
Сообщения
64
Репутация
0
имеется скрипт. Но не работает регулярное выражение. Если служба запущена, то не определяет, а если остановлена, то норм.
Код:
#RequireAdmin

#include <Constants.au3>

$service = "dhcp"
$s = $service & " " & IsServiceInstalled($service) & @CRLF & "Статус: " & IsServiceRunning($service)
MsgBox(0, "", $s)

Func _StdOut($pid)
    Local $data
  ProcessWaitClose($pid)
  $data = StdOutRead($pid)
  If $data Then
    Return $data
  Else
    MsgBox(0, "", "Не удалось получить вывод программы.")
    Exit(1)
  EndIf
EndFunc

Func IsServiceInstalled(Const $service)
  Local $code = RunWait("sc.exe query " & $service)
  If $code = 0 Then
    Return "УСТАНОВЛЕНА"
  Else
    Return "НЕ УСТАНОВЛЕНА"
  EndIf
EndFunc

Func IsServiceRunning(Const $service)
  Local $pid = Run("sc.exe query " & $service, "", @SW_HIDE, $STDOUT_CHILD)
  Local $data = _StdOut($pid)
  If StringRegExp($data, "STATE[^\r\n]+RUNNING") Then
    Return "ЗАПУЩЕНА"
  ElseIf StringRegExp($data, "STATE[^\r\n]+STOPPED") Then
    Return "ОСТАНОВЛЕНА"
  Else
    Return "Непонятно"
  EndIf
EndFunc
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Сделайте так, посмотрите, что возвращается при остановленной службе.
Если ситуацию не прояснит - пришлите строку, которую отобразил MsgBox.
Код:
....
Local $data = _StdOut($pid)
MsgBox(0, "", $data)
  If StringRegExp($data, "STATE[^\r\n]+RUNNING") Then...
...
 
Автор
T

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Вывод норм:
Код:
C:\Windows\system32>sc query dwmrcs

Имя_службы: dwmrcs
        Тип                : 10  WIN32_OWN_PROCESS
        Состояние          : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        Код_выхода_Win32   : 0  (0x0)
        Код_выхода_службы  : 0  (0x0)
        Контрольная_точка  : 0x0
        Ожидание           : 0x0
когда остановлена:
Код:
C:\Windows\system32>sc query dwmrcs

SERVICE_NAME: dwmrcs
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 1  STOPPED
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0


Добавлено:
Сообщение автоматически объединено:

Хммм. Сделал:
Код:
If StringRegExp($data, "[^\r\n]+RUNNING") Then
    Return "ЗАПУЩЕНА"
  ElseIf StringRegExp($data, "[^\r\n]+STOPPED") Then
    Return "ОСТАНОВЛЕНА"
....

заработало. Наверно из-за вывода на разных языках не работало )


Добавлено:
Сообщение автоматически объединено:

Но теперь я не знаю насколько корректно будет работать.
Может есть способ проверки вне зависимости от того на каком языке выводится?
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Работает - не трогай! ;D

Можно добавить дополнительные elseif для разных языков.
Код:
ElseIf StringRegExp($data, "Состояние[^\r\n]+STOPPED")
ElseIf StringRegExp($data, "Состояние[^\r\n]+Остановлено")
 
Верх