Windows bat: サービスの状態監視をする

Windowsのサービスの状態監視をするbatプログラムのサンプルです。OVOなどの監視サービスを利用することを想定し、実行中以外の場合にエラーログ(Error.log)に出力します。もっともサービス監視はどの監視サービスにもありますし、監視機能を自前で用意する場合もJavaなどで実装しますが。

CheckServiceState.bat

@setlocal enabledelayedexpansion
@echo off

rem ******************************************************************
rem * CheckServiceState.bat: サービスの状態をチェックし、ログに出力する
rem * [引数]
rem * ・%1: サービス名
rem * ・%2: 出力先ログファイルパス
rem ******************************************************************
rem echo CheckServiceState.bat %1 %2

call :GetServiceState %1

if not "%SERVICE_STATE%"=="" (
    if not "%SERVICE_STATE%"=="RUNNING" (
        call :Log %2 "[ERROR] %~1 is not RUNNING, state = %SERVICE_STATE%."
    )
) else (
     call :Log %2 "[ERROR] %~1 is not found."
)

endlocal
exit /b


:GetServiceState
rem ******************************************************************
rem * GetServiceState: サービスの状態を取得する
rem * [引数]
rem * ・%1: サービス名
rem ******************************************************************
rem echo GetServiceState %1

set SERVICE_STATE_CODE=
set SERVICE_STATE=

for /f "tokens=1,2* delims=:" %%i in ('sc query %1 ^| findstr /c:"STATE"') do (  
    for /f "tokens=1,2* delims= " %%A in ("%%j") do (  
        SET SERVICE_STATE_CODE=%%A
        SET SERVICE_STATE=%%B
        rem echo %SERVICE_STATE_CODE%
        rem echo %SERVICE_STATE%
    )
)

exit /b


rem ******************************************************************
rem * Log: ログを出力する
rem * [引数]
rem * ・%1: ログファイルパス
rem * ・%2: メッセージ
rem ******************************************************************
:Log
rem echo Log %1 %2

echo %date% %time% %~2 2>&1 >> %1

exit /b

実行用.bat

@setlocal
@echo off

set ERROR_LOG=Error.log

rem 空白なし
call CheckServiceState.bat "vmicrdv" "%ERROR_LOG%"

rem 空白あり
call CheckServiceState.bat "Bluetooth Device Manager" "%ERROR_LOG%"

rem 存在しない
call CheckServiceState.bat "あいうえお" "%ERROR_LOG%"

exit /b 

実行結果(Error.logに出力)

2017/04/19 17:24:37.31 [ERROR] vmicrdv is not RUNNING, state = STOPPED. 
2017/04/19 17:24:37.40 [ERROR] あいうえお is not found.