我正在寫NSIS腳本,我需要檢查服務狀態(運行/停止/暫停/不存在),然後進行一些操作。 但我不能使用任何用戶庫,如nsSCM。NSIS檢查Windows服務狀態
我發現了一個腳本
sc QUERY ServiceNameHere | FIND "RUNNING"
,但我不能老是覺得如何檢查在NSIS腳本的返回結果。
請幫忙。
我正在寫NSIS腳本,我需要檢查服務狀態(運行/停止/暫停/不存在),然後進行一些操作。 但我不能使用任何用戶庫,如nsSCM。NSIS檢查Windows服務狀態
我發現了一個腳本
sc QUERY ServiceNameHere | FIND "RUNNING"
,但我不能老是覺得如何檢查在NSIS腳本的返回結果。
請幫忙。
如果你可以使用插件:
使用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)
如果成功,服務狀態將具有以下數值之一:
如果您不能使用插件:
請注意,我說/ 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
有幾個NSIS插件和輔助函數,與NT服務處理:NSIS Service Lib,NSIS Simple Service Plugin和NsSCM 。該維基概述了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}
我檢查一個服務通過使用其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
你能不使用任何插件,或者只是不nsSCM?因爲在NSIS中使用插件使生活變得更加簡單。 – 2011-05-06 14:51:48
我無法使用插件,因爲我需要將此腳本提供給其他人,而且還沒有插件 – 2011-05-09 09:38:02