重启服务时使批处理文件等待服务启动

Bri*_*ian 5 windows services batch command-line

我有一个批处理文件,它经常重新启动内部开发的一组服务。我们很快就会从这些转向更稳定的东西,但目前这些服务需要经常重启才能正常工作。

为了简化这一点,我有一个按计划运行的批处理文件。它看起来像这样:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
ECHO ---------------------------------------------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO -----------=========%date%=========----------->> log.txt
ECHO -----------========================----------->> log.txt
ECHO ---------------------------------------------->> log.txt

set DD=0
Set TIMESTAMP="eol=; tokens=1,2,3,4* delims=/, "
For /F %TIMESTAMP% %%i in ('DATE /t') DO (
  SET YYYYMMDD=%%l%%j%%k
  SET YYYYMM=%%l%%j
  set DD=%%k
)

echo A >> ServiceNames
echo B >> ServiceNames
echo C >> ServiceNames
echo D >> ServiceNames
echo E >> ServiceNames
echo F >> ServiceNames

for /f %%a in (ServiceNames) do (
    set timestamp=!date!!time!
    ECHO !timestamp! - Stopping Service %%a >> log.txt
    net stop /y srvService_%%a >> log.txt
    taskkill /f /im Service_%%a.exe >> log.txt

    ping localhost -n 15 > nul

    set timestamp=!date!!time!
    ECHO !timestamp! - Starting Service %%a >> log.txt
    net start srvService_%%a >> log.txt
)
if exist ServiceNames del ServiceNames
Run Code Online (Sandbox Code Playgroud)

问题是,在某些情况下,批处理文件不会等待一项服务完全启动后再停止下一项服务。

您认为在 net start 命令之后添加一个额外的 ping localhost 命令会有所帮助吗?

Kar*_*ran 4

您可以使用如下代码继续等待,直到服务(在本例中我使用w32time进行了测试)启动:

:WAIT
timeout /t 5 > NUL
for /f "tokens=4" %%s in ('sc query w32time ^| find "STATE"') do if NOT "%%s"=="RUNNING" goto WAIT
echo Service is now running!
Run Code Online (Sandbox Code Playgroud)