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 秒左右),NET STOP 不会等待服务实际停止后再返回。

要真正暂停批处理文件直到服务停止,您需要使用类似于这些线程中概述的方法:

如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?

停止/启动远程 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

这有点粗略,但它对我有用,以确保我可以安排每日批处理文件以基本上重新启动服务。

NET STOP [服务]

:再试一次

超时 /T 10 /NOBREAK

NET START [服务]

IF %ERRORLEVEL% NEQ 0 GOTO TryAgain

我通过此代码片段意识到,如果服务无法成功启动,这可能会导致无限循环。我只是想基本上展示如何使用 TIMEOUT 来解决这个问题,其中服务可能需要比 NET STOP 命令允许的时间更长的时间才能停止。

于 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 回答