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
という流れで受け継がれてます。
バッチファイル内の特殊記号
バッチファイル上で、特殊記号として扱われるものがいくつかあります。
例えば、括弧()が特殊記号です。このような記号を普通の文字として扱いたいときは、^を特殊記号の前に付ける必要があります。
例は以下の通り。
@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を参照してください。