ボーカルリムーバーオンライン無料

コマンドについて詳しく解説します


BatFilename2014-0930-202521

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

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

ソース

@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文で条件分けすることも可能です。

まとめ

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

findstrコマンドのエラーレベルを使ってIF文で判断させるのは、他のコマンドでも応用できそうです。

汎用性が高いため、様々なバッチスクリプトが作れそうですね。