我正在使用批处理文件来停止 Windows 服务。我正在使用该sc
命令,但鉴于以下问题,我对其他想法持开放态度。问题是批处理文件在服务停止时继续进行(参数stop
似乎sc
只是请求停止——它不等待停止)。
如何修改批处理文件以在停止完成之前不继续?
我正在使用批处理文件来停止 Windows 服务。我正在使用该sc
命令,但鉴于以下问题,我对其他想法持开放态度。问题是批处理文件在服务停止时继续进行(参数stop
似乎sc
只是请求停止——它不等待停止)。
如何修改批处理文件以在停止完成之前不继续?
您可以使用NET stop
,它是同步的,即它将等到服务停止。
参见 - NET 停止
sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
timeout 1
goto loop
)
如上所述,NET STOP 会向服务发送停止命令,但是,如果服务花费的时间超过一定时间(我的观察是 20 秒左右),NET STOP 不会等待服务实际停止后再返回。
要真正暂停批处理文件直到服务停止,您需要使用类似于这些线程中概述的方法:
我相信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
)
可执行文件完成后,循环将中断。
这有点粗略,但它对我有用,以确保我可以安排每日批处理文件以基本上重新启动服务。
NET STOP [服务]
:再试一次
超时 /T 10 /NOBREAK
NET START [服务]
IF %ERRORLEVEL% NEQ 0 GOTO TryAgain
我通过此代码片段意识到,如果服务无法成功启动,这可能会导致无限循环。我只是想基本上展示如何使用 TIMEOUT 来解决这个问题,其中服务可能需要比 NET STOP 命令允许的时间更长的时间才能停止。
在命令之间使用&&
符号。该&&
符号等待完成前一个命令,然后再继续执行下一个命令。
所有命令必须位于同一命令行。您可以连续使用任意数量的命令。
您也可以使用该pause
命令。这样,在进行下一个程序之前,要求按任意键。
例如:
sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo [ "MyServiceName" service stopped ] && echo. && pause