暂停批处理文件,直到服务停止完成?

时间:2010-05-20 14:54:27

标签: batch-file servicecontroller

我正在使用批处理文件来停止Windows服务。我正在使用sc命令,但考虑到下面的问题,我对其他想法持开放态度。问题是批处理文件在服务停止时进行stop参数sc似乎只是请求停止 - 它等待停止)。

如果停止完成,如何将批处理文件修改为不继续

7 个答案:

答案 0 :(得分:25)

使用可以使用同步的NET stop,即等待服务停止。

请参阅   - NET stop

答案 1 :(得分:18)

sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
  timeout 1
  goto loop
)

答案 2 :(得分:13)

如上所述,NET STOP将向服务发送停止命令,但是,如果服务花费的时间超过一定时间(我观察的时间是20秒左右),NET STOP将不会等待服务实际停止在回来之前。

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

How to check if a service is running via batch file and start it, if it is not running?

Stopping/Starting a remote Windows service and waiting for it to open/close

答案 3 :(得分:1)

我相信net stop [Service]应该等到服务完全停止后再继续。 sc stop [Service]只是向服务发送“停止”消息。

答案 4 :(得分:1)

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

NET STOP [服务]

:TRYAGAIN

TIMEOUT / T 10 / NOBREAK

NET START [服务]

IF%ERRORLEVEL%NEQ 0 GOTO TryAgain

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

答案 5 :(得分:0)

在命令之间使用&&符号。 &&符号在继续执行下一个命令之前等待完成上一个命令。

所有命令必须位于同一命令行。您可以连续使用所需数量的命令。

您也可以使用pause命令。有了这个,请按下任意键,然后再进行下一步。

例如:

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo          [ "MyServiceName" service stopped ] && echo. && pause

答案 6 :(得分:0)

我与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
)

可执行文件完成后,循环将中断。