我有一个批处理文件,它经常重新启动一组内部开发的服务。我们很快就会放弃这些服务,转而使用更稳定的服务,但目前这些服务需要经常重新启动才能正常工作。
为了简化这一过程,我有一个按计划运行的批处理文件。它看起来像这样:
@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
问题是,在某些情况下,批处理文件不会等待一项服务完全启动完毕就停止下一项服务。
您认为在 net start 命令后添加额外的 ping localhost 命令可能会有帮助吗?
答案1
您可以使用如下代码继续等待服务(在本例中我已经测试过w32时间) 已启动:
: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!
答案2
如果停止时没有进行清理,并且它们正在自己的进程中运行,则只需终止该进程。
Ping
不是小睡的正确方式。它会加载网络。您有 3 个选择。所有选项都有各种选项来显示/隐藏内容。
timeout /t 5
或者
choice /d y /t 5
或者
waitfor /t 5 FredToMarryGinger
答案3
net start 将等待服务启动完成后再返回,因此如果批处理文件在服务启动完成之前继续运行,则问题在于服务错误地报告它已启动但实际上并未启动,或者花费的时间太长导致命令超时。
理想情况下,应该修复服务,使其在启动完成之前不报告启动完成。您还可以让服务输出状态文件或其他内容来指示它已启动完成,并让您的批处理文件等待该状态文件出现后再继续。或者,如果超时是问题所在,您可以创建一个循环,使用“net start”或“sc query”不断重新检查服务状态,直到它显示为“正在运行”。
[编辑] 卡兰说了什么。