シンプル・スマートな画面録画ソフト EaseUS RecExperts

BatFilename2014-0930-202521

引き続き、バッチのお勉強として、Windows内で稼働しているサービスの状態を取得して、それをIf文などの条件式で利用する方法について掲載しておきます。

例によって、僕自身が勉強中の身なので細かい指定で「もっとこうしたらいい」というのがあれば教えてください。 とりあえずはあくまで僕の備忘録を兼ねてのご紹介です。

 
【新機能】わからないことはAIに聞いてみよう
質問内容を入力すると、皆さんの疑問にAIがお答えします。

※当機能は現在ベータ版です。 予告なく公開終了する場合があります。

ソース

@echo off

sc query W32Time | findstr STATE | findstr RUNNING > null
echo %errorlevel%

処理の内容

上記ソース内で行っている処理はこんな感じ。

サービスの状態を出力する

sc query [サービス名]

scコマンドはサービスへの状態確認や、設定変更を行うコマンドです。 sc query で、サービスの稼働状況を含めた状態が一覧表示されます。

コマンドを入力してみると出力結果はこんな感じ。

c:\>sc query W32Time

SERVICE_NAME: W32Time
        TYPE               : 20  WIN32_SHARE_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

この5行目のSTATE部分に現在のサービスの状態が表示されるので、この文字列の表示を使って判別します。

起動状態ではRUNNINGに、停止状態ではSTOPPEDと出力されるので、この文字列を判断材料にする感じです。

該当する行の該当する文字列があるかどうかを判断

sc query W32Time | findstr STATE | findstr RUNNING > null

scコマンドと一緒にfindstrコマンド(特定の文字列のみを出力)を使って、現在の状態がRUNNINGなのかSTOPPEDなのかを判断します。

findstrでは、文字列がヒットして出力した場合はエラーレベルを0、ヒットしなかった場合は1を返すので、これを使ってRUNNINGの場合は0を、STOPPEDの場合は1を返すというコマンドとして実行できます。

ちなみに > null の部分は出力内容を画面に表示させない方法です。 出力内容を、nullにリダイレクトするという処理ですね。

エラーレベルを表示

echo %errorlevel%

あとは、エラーレベルを表示するだけです。 エラーレベルには0か1の値が代入されているはずなので、この値をもとにIf文で条件分けすることもできます。

 
この記事で解決しなかった疑問は疑問はAIに聞いてみよう
質問内容を入力すると、皆さんの疑問にAIがお答えします。

※当機能は現在ベータ版です。 予告なく公開終了する場合があります。

まとめ

  • sc queryコマンドでサービスの状態を取得する
  • findstrコマンドでサービス状態の文字列を取り込む
  • findstrのエラーレベルでサービス状態の判断をする

findstrコマンドのエラーレベルを使ってIF文で判断させるのは、割と他のコマンドでも流用できそうですね。 汎用性が高そうなので、いろんなバッチが作れそうです。