2011-05-06 318 views
2

我正在寫NSIS腳本,我需要檢查服務狀態(運行/停止/暫停/不存在),然後進行一些操作。 但我不能使用任何用戶庫,如nsSCM。NSIS檢查Windows服務狀態

我發現了一個腳本

sc QUERY ServiceNameHere | FIND "RUNNING"

,但我不能老是覺得如何檢查在NSIS腳本的返回結果。

請幫忙。

+0

你能不使用任何插件,或者只是不nsSCM?因爲在NSIS中使用插件使生活變得更加簡單。 – 2011-05-06 14:51:48

+0

我無法使用插件,因爲我需要將此腳本提供給其他人,而且還沒有插件 – 2011-05-09 09:38:02

回答

5

如果你可以使用插件:

使用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

有幾個NSIS插件和輔助函數,與NT服務處理:NSIS Service LibNSIS Simple Service PluginNsSCM 。該維基概述了all your options

使用SC.EXE是有問題的,因爲輸出可能是局部的,NET.EXE可能是更好的(它也可以退出上<的WinXP)這裏是我對這種解決辦法:

!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

我檢查一個服務通過使用其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