読者です 読者をやめる 読者になる 読者になる

Windowsでサービス状態一覧を表示するコマンドがないのはなぜだろうか?

Windows DOSbatch


Windows Nのころから、Windowsのサービスを起動、停止すことはできた。

net コマンド

起動
    net start "サービス名"
停止
    net stop "サービス名"


でも状態を確認するコマンドはなかった。
以下のコマンドがあってもいいのにないつも思ってた。


Windows XPからscコマンドが増え、サービスをコントロールをできるようになり、
ステータスの表示もできるようになった。
しかし、このコマンドの表示結果を検索しようとすると不便なのだ。


まずは、scコマンドとバッチで状態一覧を表示するようにしてみる。

scコマンドでの表示

sc query state= all type= service
SERVICE_NAME: Alerter
DISPLAY_NAME: Alerter
        TYPE               : 20  WIN32_SHARE_PROCESS 
        STATE              : 4  RUNNING 
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: ALG
DISPLAY_NAME: Application Layer Gateway Service
        TYPE               : 10  WIN32_OWN_PROCESS 
        STATE              : 4  RUNNING 
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: AntiVirSchedulerService
DISPLAY_NAME: Avira AntiVir 
        TYPE               : 110  WIN32_OWN_PROCESS (interactive)
        STATE              : 4  RUNNING 
                                (NOT_STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: AntiVirService
DISPLAY_NAME: Avira AntiVir Guard
        TYPE               : 110  WIN32_OWN_PROCESS (interactive)
        STATE              : 4  RUNNING 
                                (NOT_STOPPABLE,NOT_PAUSABLE,ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: Apache2.2
DISPLAY_NAME: Apache2.2
        TYPE               : 10  WIN32_OWN_PROCESS 
        STATE              : 1  STOPPED 
                                (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 1077	(0x435)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: Apple Mobile Device
DISPLAY_NAME: Apple Mobile Device
        TYPE               : 10  WIN32_OWN_PROCESS 
        STATE              : 4  RUNNING 
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: AppMgmt
DISPLAY_NAME: Application Management
        TYPE               : 20  WIN32_SHARE_PROCESS 
        STATE              : 1  STOPPED 
                                (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 1077	(0x435)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: aspnet_state
DISPLAY_NAME: ASP.NET 
        TYPE               : 10  WIN32_OWN_PROCESS 
        STATE              : 1  STOPPED 
                                (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 1077	(0x435)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

SERVICE_NAME: ATKKeyboardService
DISPLAY_NAME: ATK Keyboard Service
        TYPE               : 110  WIN32_OWN_PROCESS (interactive)
        STATE              : 4  RUNNING 
                                (STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0	(0x0)
        SERVICE_EXIT_CODE  : 0	(0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0
        ・
        ・
        ・

scコマンドで必要な情報だけ抽出する3行ごとの表示

@echo off
for /F  "eol=; tokens=1,2* delims= " %%i in ('"sc query state= all type= service"') DO echo %%i %%j %%k |findstr "SERVICE_NAME DISPLAY_NAME STATE"
SERVICE_NAME: Alerter  
DISPLAY_NAME: Alerter  
STATE : 4  RUNNING  
SERVICE_NAME: ALG  
DISPLAY_NAME: Application Layer Gateway Service 
STATE : 4  RUNNING  
SERVICE_NAME: AntiVirSchedulerService  
DISPLAY_NAME: Avira AntiVir  
STATE : 4  RUNNING  
SERVICE_NAME: AntiVirService  
DISPLAY_NAME: Avira AntiVir Guard 
STATE : 4  RUNNING  
SERVICE_NAME: Apache2.2  
DISPLAY_NAME: Apache2.2  
STATE : 1  STOPPED  
SERVICE_NAME: Apple Mobile Device 
DISPLAY_NAME: Apple Mobile Device 
STATE : 4  RUNNING  
SERVICE_NAME: AppMgmt  
DISPLAY_NAME: Application Management 
STATE : 1  STOPPED  
SERVICE_NAME: aspnet_state  
DISPLAY_NAME: ASP.NET  
STATE : 1  STOPPED  
SERVICE_NAME: ATKKeyboardService  
DISPLAY_NAME: ATK Keyboard Service 
STATE : 4  RUNNING  
SERVICE_NAME: AudioSrv  
DISPLAY_NAME: Windows Audio 
STATE : 4  RUNNING  
・
・
・

1行に表示する ステータス サービス名 ディスプレー名の順

@echo off
setlocal
for /F  "eol=; tokens=1,2* delims=:" %%i in ('"sc query type= service state= all" ') DO call :SERVICE "%%i %%j %%k"

GOTO :END

:SERVICE
for /F  "tokens=2" %%i in ('echo "%~1" ^|findstr SERVICE_NAME' ) DO set SERVICE_NAME=%%i && SET SNFLAG=ON
for /F  "eol=; delims=:" %%i in ('echo "%~1" ^|findstr DISPLAY_NAME' ) DO set DISPLAY_NAME="%%~i" && SET DNFLAG=ON
for /F  "tokens=4" %%i in ('echo "%~1" ^|findstr STATE') DO set STATE=%%i && SET SFLAG=ON

if {%SNFLAG%}=={ON} (
    if {%DNFLAG%}=={ON} (
        if {%SFLAG%}=={ON} (
            call :PRINT
            SET SNFLAG=OFF
            SET DNFLAG=OFF
            SET SFLAG=OFF
        )
    )
)

GOTO :EOF



:PRINT
echo %STATE:~0,7%    %SERVICE_NAME%    %DISPLAY_NAME:~14,-4%
GOTO :EOF

:END
endlocal
RUNNING    Alerter      Alerter
RUNNING    ALG      Application Layer Gateway Service
RUNNING    AntiVirSchedulerService      Avira AntiVir
RUNNING    AntiVirService      Avira AntiVir Guard
STOPPED    Apache2.2      Apache2.2
RUNNING    Apple      Apple Mobile Device
STOPPED    AppMgmt      Application Management
STOPPED    aspnet_state      ASP.NET
RUNNING    ATKKeyboardService      ATK Keyboard Service
RUNNING    AudioSrv      Windows Audio
RUNNING    BITS      Background Intelligent Transfer Service
・
・
・

ただ、残念なことに、これは遅すぎる。