NSIS проверяет состояние службы Windows - PullRequest
3 голосов
/ 06 мая 2011

Я пишу сценарий NSIS, и мне нужно проверить состояние службы (работает / остановлен / приостановлен / не существует) и затем выполнить некоторые действия.Но я не могу использовать какие-либо пользовательские библиотеки, такие как nsSCM.

Я нашел скрипт

sc QUERY ServiceNameHere | FIND "RUNNING"

, но не могу найти способ проверить результат возвратав сценарии NSIS.

Пожалуйста, помогите.

Ответы [ 3 ]

6 голосов
/ 06 мая 2011

Если вы можете использовать подключаемые модули:

Используя Simple Service Plugin , вы можете сделать это:

SimpleSC::GetServiceStatus "MyService"
Pop $0 ; returns an errorcode (!=0) otherwise success (0)
Pop $1 ; return the status of the service (see below)

ЕслиУспешно, статус услуги будет иметь одно из следующих числовых значений:

  1. ОСТАНОВЛЕН
  2. START_PENDING
  3. STOP_PENDING
  4. RUNNING
  5. CONTINUE_PENDING
  6. PAUSE_PENDING
  7. PAUSED

Если вы НЕ можете использовать плагины:

Обратите внимание, что я добавилОт / C до FIND.exe, чтобы вывести количество строк вместо всей строки.Также будьте осторожны, изменяя кавычки.Чтобы сделать это правильно, потребовалось несколько проб и ошибок.

StrCpy $R0 '"$SYSDIR\cmd.exe" /c "sc QUERY MyServiceName | FIND /C "RUNNING""'
nsExec::ExecToStack '$R0'
Pop $R1  # contains return code
Pop $R2  # contains output
${If} $R1 == "0"    
    # command success
    ${If} $R2 == "1"
        # it's running
    ${Else}
        # it's not running
    ${EndIf}
${Else}
    # command failed
${EndIf}

Обязательно включите библиотеку логики, поскольку NSIS требует этого для макросов условных операторов:

# Included files
!include LogicLib.nsh
3 голосов
/ 06 мая 2011

Существует несколько плагинов и вспомогательных функций NSIS, которые работают со службами NT: Lib службы NSIS , Простой плагин обслуживания NSIS и NsSCM . В вики есть обзор всех ваших вариантов .

Использование sc.exe проблематично, так как выходные данные могут быть локализованы, возможно, net.exe лучше (и он также работает на

!include LogicLib.nsh
StrCpy $1 "Event Log" ;Put your service name here
ExpandEnvStrings $0 "%comspec%"
nsExec::ExecToStack '"$0" /k "net start | FIND /C /I "$1""'
Pop $0
Pop $1
StrCpy $1 $1 1
${If} "$0$1" == "01"
    MessageBox mb_ok "Running"
${Else}
    MessageBox mb_ok "Not Running"
${EndIf}
0 голосов
/ 30 января 2015

Я проверяю, работает ли служба, используя ее имя DISPLAY (не имя службы), потому что оно имеет тенденцию быть более точным (например, имя службы JETTY, а имя DISPLAY использует имя моего продукта - я избегаю риска подсчета сервис JETTY, установленный другим продуктом).

Итак, основываясь на решении Кайла, я использую:

var running
    !macro CheckMyService
      StrCpy $running "0"
      StrCpy $cmd '"$SYSDIR\cmd.exe" /c "net start | FIND /C "MyServiceDisplayName""'
      nsExec::ExecToStack '$cmd'
      Pop $R1  # contains return code
      Pop $R2  # contains output
      StrCpy $n $R2 1
      ${If} $R1 == "0"    
          ${If} $n == "1"
              StrCpy $running "1"
          ${EndIf}
      ${EndIf}
      DetailPrint "runnning(1=yes): $running"
    !macroend
...