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

Batch file 停止批处理文件,直到服务停止完成?,batch-file,servicecontroller,Batch File,Servicecontroller,我正在使用批处理文件停止Windows服务。我正在使用sc命令,但考虑到下面的问题,我愿意接受其他想法。问题是批处理文件在服务停止时继续运行(sc的stop参数似乎只是请求停止,而不是等待停止) 如何修改批处理文件,使其在停止完成之前不继续进行?您可以使用同步的NET stop,即它将等待服务停止 看 -我认为净停止[服务]应该等到服务完全停止后再继续sc-stop[Service]只向服务发送一条“stop”消息。如上所述,NET-stop将向服务发送一条stop命令,但是,如果服务花费的时间

我正在使用批处理文件停止Windows服务。我正在使用
sc
命令,但考虑到下面的问题,我愿意接受其他想法。问题是批处理文件在服务停止时继续运行(sc的
stop
参数似乎只是请求停止,而不是等待停止)


如何修改批处理文件,使其在停止完成之前不继续进行?

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


-

我认为
净停止[服务]
应该等到服务完全停止后再继续
sc-stop[Service]
只向服务发送一条“stop”消息。

如上所述,NET-stop将向服务发送一条stop命令,但是,如果服务花费的时间超过某一特定时间(我观察到大约20秒),NET-stop将不会等待服务在返回之前实际停止

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


这有点粗糙,但它对我来说很有效,以确保我可以安排每天的批处理文件来重新启动服务

净停止[服务]

:TryAgain

超时/T 10/NOBREAK

净启动[服务]

如果%ERRORLEVEL%NEQ 0转到TryAgain


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

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

sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
  timeout 1
  goto loop
)
所有命令必须位于同一命令行。可以在一行中使用任意数量的命令

您也可以使用
暂停
命令。在进行下一步骤之前,要求按任意键

例如:

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

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

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

但是,如果服务已停止,则
net stop
将抛出一般错误代码2(拒绝访问)。这并不完全正确。如果服务实际完全停止并退出需要4分钟,则“净停止”命令将在20-40秒后返回,但服务进程尚未终止。它返回“服务无法停止”。。。但这是误导。该服务已发送一个停止命令,但在SCM超时时间内尚未完全退出。我知道此线程很旧,但我刚刚在Windows Server 2012 R2上测试了此线程-我有一个服务需要大约三分钟才能停止。。。运行“net stop”时,在CMD文件完成之前,直到服务可执行文件实际停止并从任务管理器中消失,命令才会完成。它在更新后的服务器上工作,与一些旧的评论相反,这些评论说它不工作。在
net stop
返回后,如果您使用
sc查询“我的服务名称”|查找“状态”
检查状态,则某些服务可能处于
stop\u挂起状态
state@Jonesome-为什么不提供一个更好的答案,而不是否决票?公平的决定!完成!拒绝投票的原因是两个答案都包含错误的信息(我在win7和win2008上进行了测试,并且根据经验知道XP和其他版本的行为相同)。不是拒绝投票的人(虽然我可以猜出是谁),但这个答案也包含错误的信息<代码>净停止将在一定程度上等待服务停止。我从来没有尝试过在整整四分钟内停止服务,所以我不能说
NET STOP
等待了多长时间,但它确实等待了相当长的一段时间,而不是
sc STOP
\@LittleBobbyTables这篇文章已经更新,以说明你所观察到的情况。如果您查看microsoft团队编写的内容(下面的链接),您将看到SCM一次只与一个服务对话,因此它不会永远等待任何一个服务。NET发送只是将cmd发送到SCM的一种方式,与服务管理器中的方式相同。从@Jonesome链接的博客中获取更多信息:控制超时的注册表项是
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout
。默认值显然是20秒,但在我的Windows 8.1 Enterprise box上是5秒(可能会被组策略更改)@Stajs在Windows 2012上,我将我的
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout
设置为DWORD 120000,但它完全没有效果-即使服务正在关闭但尚未停止,网络停止在10-15秒后仍会返回,不会再停止45秒。只是一个问题:为什么超时而不睡觉?按键可以绕过超时,我认为这在批处理文件中不是理想的效果(在关注cmd窗口时很容易出错按键)。实际上,它是2003资源工具包的一部分。我以为这是在标准Windows安装中,我的错误。
超时5/nobreak
将仅在CTRL+C时退出