Windowsのバッチファイルを作る機会があったので、その時のノウハウメモ。

サービスの状態確認

サービスの起動・停止状態の出力させるには、sc.exe queryが使える。(ただし、Windows XP/Windows Server 2003以降)
後は、findstr (Windows用のgrep)と合わせて使えばいい。

たとえば、タスクスケジューラが起動しているかどうかの確認バッチファイルを
作ると以下の通り。

@echo off

sc.exe query Schedule | findstr STATE | findstr RUNNING > nul
if %ERRORLEVEL% == 1 echo Scheduler isn't running
if %ERRORLEVEL% == 0 echo Scheduler running

実行結果(タスクスケジューラ起動時)は以下の通り。

C:\>service_check.bat
Scheduler running

上のバッチファイルのコツは、

  • 無駄なecho表示を消すこと(@echo off)
  • findstrの出力をnull deviceに出力させること( > nul)
  • findstrのマッチ結果を%ERRORLEVEL%で調べること

ちなみに、nulというnull device名の歴史をたどると、古い順に、

PIP > CP/M > MS-DOS > Windows

という流れで受け継がれてます。1

バッチファイル内の特殊記号

バッチファイル上で、特殊記号として扱われるものがいくつかあります。
例えば、括弧()が特殊記号です。このような記号を普通の文字として扱いたいときは、^を特殊記号の前に付ける必要があります。

例は以下の通り。

@echo off
if 1 == 1 (
  echo foo ^(bar^) baz
)
C:\>with_hat.bat
foo (bar) baz

ちなみに^を抜くと、if文の終端(=echoの終わり)がbarの直後と判断されてしまい、
その後のbazをコマンドとみなして実行するためエラーになります。

C:\>no_hat.bat
baz の使い方が誤っています。

他の特殊記号については、このWikiを参照してください。

  1. PIPのWikipediaページとか、MSDNの予約ファイル名の説明とか参照。 []