39

バッチファイルを使用してWindowsサービスを停止しています。私はscコマンドを使用していますが、以下の質問を考えると、他のアイデアを受け入れることができます。問題は、サービスが停止しているにバッチファイルが進行することです(stopへの引数は停止を要求scするだけのようです-停止を待機しません)。

停止が完了するまで続行しないようにバッチファイルを変更するにはどうすればよいですか?

4

7 に答える 7

33

同期を使用できますNET stop。つまり、サービスが停止するまで待機します。

参照-NETストップ

于 2010-05-20T15:00:24.230 に答える
27
sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
  timeout 1
  goto loop
)
于 2016-10-25T20:58:16.500 に答える
14

前述のように、NET STOPはサービスに停止コマンドを送信しますが、サービスに一定時間以上かかる場合(私の観察では20秒程度)、NETSTOPはサービスが実際に停止するのを待たずに戻ります。

サービスが停止するまでバッチファイルを実際に一時停止するには、次のスレッドで概説されているようなアプローチを使用する必要があります。

サービスがバッチファイルを介して実行されているかどうかを確認し、実行されていない場合は開始するにはどうすればよいですか?

リモートWindowsサービスを停止/開始し、それが開く/閉じるのを待つ

于 2013-08-07T18:36:49.520 に答える
3

net stop [Service]先に進む前に、サービスが完全に停止するまで待つ必要がある と思います。sc stop [Service]単に「停止」メッセージをサービスに送信します。

于 2010-05-20T15:03:13.700 に答える
2

で同様の問題が発生しまし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
)

実行可能ファイルが終了すると、ループが中断されます。

于 2020-12-14T11:43:21.327 に答える
1

これは少し大雑把ですが、基本的にサービスを再開するために毎日のバッチファイルをスケジュールできるようにするために機能しました。

NETSTOP[サービス]

:再試行する

タイムアウト/T10 / NOBREAK

NETSTART[サービス]

IF%ERRORLEVEL%NEQ 0 GOTO TryAgain

このコードスニペットを使用すると、サービスが正常に開始されなかった場合に無限ループが発生する可能性があることがわかります。基本的に、TIMEOUTを使用して問題を回避する方法を示したかったのですが、NETSTOPコマンドで許可されているよりもサービスの停止に時間がかかる場合があります。

于 2015-07-01T20:07:19.340 に答える
-1

&&コマンドの間に記号を使用します。&&シンボルは、次のコマンドに進む前に、前のコマンドが終了するのを待ちます。

すべてのコマンドは同じコマンド行にある必要があります。必要な数のコマンドを連続して使用できます。

コマンドも使用できますpause。これで、次の手順に進む前に、任意のキーを押すように求められます。

例えば:

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo          [ "MyServiceName" service stopped ] && echo. && pause
于 2016-11-30T14:27:38.880 に答える