引き続き、バッチのお勉強として、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文で判断させるのは、割と他のコマンドでも流用できそうですね。 汎用性が高そうなので、いろんなバッチが作れそうです。