コマンドについて詳しく解説します
引き続き、バッチのお勉強として、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文で判断させるのは、他のコマンドでも応用できそうです。
汎用性が高いため、様々なバッチスクリプトが作れそうですね。