我正在使用批处理文件来停止Windows服务。我正在使用sc
命令,但考虑到下面的问题,我对其他想法持开放态度。问题是批处理文件在服务停止时进行(stop
参数sc
似乎只是请求停止 - 它等待停止)。
如果停止完成,如何将批处理文件修改为不继续?
答案 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
)
可执行文件完成后,循环将中断。