バッチファイルを使用してWindowsサービスを停止しています。私はsc
コマンドを使用していますが、以下の質問を考えると、他のアイデアを受け入れることができます。問題は、サービスが停止している間にバッチファイルが進行することです(stop
への引数は停止を要求sc
するだけのようです-停止を待機しません)。
停止が完了するまで続行しないようにバッチファイルを変更するにはどうすればよいですか?
バッチファイルを使用してWindowsサービスを停止しています。私はsc
コマンドを使用していますが、以下の質問を考えると、他のアイデアを受け入れることができます。問題は、サービスが停止している間にバッチファイルが進行することです(stop
への引数は停止を要求sc
するだけのようです-停止を待機しません)。
停止が完了するまで続行しないようにバッチファイルを変更するにはどうすればよいですか?
同期を使用できますNET stop
。つまり、サービスが停止するまで待機します。
参照-NETストップ
sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
timeout 1
goto loop
)
前述のように、NET STOPはサービスに停止コマンドを送信しますが、サービスに一定時間以上かかる場合(私の観察では20秒程度)、NETSTOPはサービスが実際に停止するのを待たずに戻ります。
サービスが停止するまでバッチファイルを実際に一時停止するには、次のスレッドで概説されているようなアプローチを使用する必要があります。
サービスがバッチファイルを介して実行されているかどうかを確認し、実行されていない場合は開始するにはどうすればよいですか?
net stop [Service]
先に進む前に、サービスが完全に停止するまで待つ必要がある と思います。sc stop [Service]
単に「停止」メッセージをサービスに送信します。
で同様の問題が発生しましnet stop
た。サービスが実際に停止したときに戻りますが、実行可能ファイルはまだ実行されている可能性があります。
アップグレードの理由から、これでは十分ではありません。プロセスが終了するまで待つ必要があります。
単純なループを使用して、サービスの実行可能ファイルが実際に終了するまで待機しました。
net stop "ServiceName"
:loop1
set _CmdResult=""
for /f "tokens=1" %%a in ('TASKLIST ^| FINDSTR ServiceName.exe') do set _CmdResult=%%a
if not %_CmdResult% == "" (
timeout 5
goto loop1
)
実行可能ファイルが終了すると、ループが中断されます。
これは少し大雑把ですが、基本的にサービスを再開するために毎日のバッチファイルをスケジュールできるようにするために機能しました。
NETSTOP[サービス]
:再試行する
タイムアウト/T10 / NOBREAK
NETSTART[サービス]
IF%ERRORLEVEL%NEQ 0 GOTO TryAgain
このコードスニペットを使用すると、サービスが正常に開始されなかった場合に無限ループが発生する可能性があることがわかります。基本的に、TIMEOUTを使用して問題を回避する方法を示したかったのですが、NETSTOPコマンドで許可されているよりもサービスの停止に時間がかかる場合があります。
&&
コマンドの間に記号を使用します。&&
シンボルは、次のコマンドに進む前に、前のコマンドが終了するのを待ちます。
すべてのコマンドは同じコマンド行にある必要があります。必要な数のコマンドを連続して使用できます。
コマンドも使用できますpause
。これで、次の手順に進む前に、任意のキーを押すように求められます。
例えば:
sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo [ "MyServiceName" service stopped ] && echo. && pause