我正在使用批处理文件停止Windows服务。我正在使用sc
命令,但考虑到下面的问题,我也可以接受其他想法。问题在于,当服务停止时(对sc
的stop
参数似乎只是请求停止而不等待停止),批处理文件会继续执行。
如何修改批处理文件,以便在停止完成之前不继续执行?
我正在使用批处理文件停止Windows服务。我正在使用sc
命令,但考虑到下面的问题,我也可以接受其他想法。问题在于,当服务停止时(对sc
的stop
参数似乎只是请求停止而不等待停止),批处理文件会继续执行。
如何修改批处理文件,以便在停止完成之前不继续执行?
sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
timeout 1
goto loop
)
另一个带有重复次数限制的版本:
sc stop webdriveservice
set count=1
set limit=10
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
timeout 1
set /a count += 1
if %count% lss %limit% goto loop
)
timeout 5 /nobreak
只会在CTRL+C被按下时退出。 - ssh如上所述,NET STOP将向服务发送停止命令,但是如果服务需要更长的时间(我观察大约要20秒左右),NET STOP在返回之前将不会等待服务实际停止。
要实际暂停批处理文件直到服务停止,您需要使用像这些线程中概述的方法:
NET STOP
会等待服务停止,直到某个时间点。我从来没有遇到过一个服务尝试停止整整四分钟,所以我不能说NET STOP
等待多长时间,但它确实等待了相当长的一段时间,与sc stop
不同。 - LittleBobbyTables - Au RevoirHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout
。默认值显然为20秒,但在我的Windows 8.1 Enterprise版本上为5秒(可能被组策略修改)。 - StajsHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout
设置为 DWORD 120000,但它完全没有效果 - 即使服务正在关闭但尚未停止,net stop 仍在10-15秒后返回,不会在另外45秒内停止。 - DisappointedByUnaccountableMod我认为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
)
在命令之间使用&&
符号。 &&
符号等待前一个命令完成后再执行下一个命令。
所有命令必须在同一行上。您可以在一行中使用任意多个命令。
您还可以使用pause
命令。这样,它会要求在继续下一个过程之前按任意键。
例如:
sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo [ "MyServiceName" service stopped ] && echo. && pause
net stop
将抛出一般错误代码 2(访问被拒绝)。 - Wernightnet stop
返回后,如果您使用sc query "My Service Name" | find "STATE"
检查状态,则某些服务可能处于STOP_PENDING
状态。 - ssh