いち、プログラマのyu1rowです。
今回は小ネタです。
タスクスケジューラなんかで、以下のような事をしようとしまして
- Apacheを終了
- なんかゴニョゴニョ作業する
- またApacheを起動
> sc stop Apache2.2
起動する場合は、こう
> sc start Apache2.2
しかし、バッチファイルで連続して処理を行う場合は、sc stopコマンドはすぐ終わってしまいますが、終了処理に時間がかかるのでサービスはまだ停止していない、みたいな事になります。
これを待ちたいなぁと思いまして。
なんとかして作ったバッチファイルが、これ
@ECHO OFF SET servicename=Apache2.2 REM ***** Apacheの停止 sc stop %servicename% > NUL REM ***** Apacheの停止待ち :JOIN ping localhost -n 1 > NUL sc stop %servicename% > NUL SET status=%ERRORLEVEL% IF %status%==1061 GOTO JOIN REM ***** ゴニョゴニョなんか処理する REM GONYOGONYO REM ***** Apacheの開始 sc start %servicename% > NUL
※Windows 7でしか試してません
※管理者権限じゃないといけません
大事なのは、9行目と11行目。
完全に停止していないうちにもう一回sc stopすると、ERRORLEVELに1061が返ります。
そして、完全に停止していたら1062が返ります。
多分、これでうまくいくんちゃうかな?
ご利用は自己責任で☆
※追記
ERRORLEVELに返って来る1061や1062だとかいうコード、一体何か?
ADVAPI32.DLLのControlServiceが返すコードの模様。
以下1061,1062についてのみ抜粋
コード | 意味 |
---|---|
ERROR_SERVICE_CANNOT_ACCEPT_CTRL(1061) | サービスの状態が SERVICE_STOPPED、SERVICE_START_PENDING、SERVICE_STOP_PENDING のいずれかであるため、要求された制御コードをこのサービスへ送信できません。 |
ERROR_SERVICE_NOT_ACTIVE(1062) | このサービスはまだ開始されていません。 |
詳しくはココ
ループの途中にstopを時間指定でいれたほうがよくない・・・?
返信削除某元空手部より
面倒やしイヤやなぁとか思ったけど、簡単に実現できそうだから追記した!THX!
返信削除