在等待结果的情况下在远程计算机上停止/启动服务

时间:2014-03-20 12:24:11

标签: batch-file service

我正在编写一个批处理脚本,它应该停止远程计算机上的服务,复制一些内容然后重新启动它。

事实上,sc不等待服务返回完全停止/启动信号并不能满足我,因为我担心服务可能会出现不一致或失败,然后可能会损坏程序代码/数据库这取决于那些服务。

因此,我搜索了一个解决方法,使用与网络类似的东西,然后解决这个问题:

sc \\remote_server stop Service1 >> %LOGFILE%

:askservice1
for /f "tokens=4" %%a in (' sc \\remote_server query Service ^|findstr STATE') do set ServiceResult=%%a

if %ServiceResult%=STOPPED (goto nextservice2)
goto askservice1

:nextservice2

sc \\remote_service stop Service2 >> %LOGFILE%

:askservice2
for /f "tokens=4" %%a in (' sc \\remote server query Service ^|findstr STATE') do set ServiceResult2=%%a

if %ServiceResult2%=STOPPED (goto nextservice3)
goto askservice2 

这将持续6个服务,然后副本将完成,然后运行应该反过来启动

如你所见,这是一个。非常奇怪,看起来令人困惑和b,如果服务无法进入我所比较的状态,它可能会以无限循环结束......

我的问题是,如何在几次尝试之后终止goto并让它转到下一个服务?

或者你有其他任何帮助我的代码吗?我只能使用批处理或PowerShell,但由于我之前从未使用过PS,我无法理解我找到的解决方案。

2 个答案:

答案 0 :(得分:0)

试试这个,看看它是否适合你。我在我的本地机器上用2个服务进行了测试,效果很好。你必须调整一些ping超时设置并取出文件副本的echo,但总的来说它应该给你一个不错的起点。

@echo off
setlocal enabledelayedexpansion

set "stopstart=stop"
set "state=STOPPED"
set "remoteserver=REMSERV"
set "LogFile=Logfile.log"
if exist %LogFile% del /q %LogFile%

:Start
for %%S in (service1 service2 service3 service4 service5 service6) do (
    sc \\%remoteserver% %stopstart% %%S>>%LogFile%
    Call :WaitForService %remoteserver% %%S %state% ret && (
    echo Service %%S %state% 
    set /a svc+=1) || (
    Service %%S is !state!
    )
)   

if "%svc%" EQU "6" (
  echo copy file now.
  ping -n 10 127.0.0.1>nul
  set "stopstart=start"
  set "state=RUNNING"
  goto :Start  
)

if "%svc%" EQU "12" (Echo All services are now running.)

exit /b

:WaitForService <remoteserver> <service> <stopstart> <return>
setlocal
for /L %%a in (1,10,1) do (
    for /f "tokens=4" %%a in ('
      sc \\%~1 query %~2^|findstr "STATE"') do (
        ping -n 2 -w 10000 127.0.0.1>nul
        if "%%a" EQU "%~3" set %~4=%%a & exit /b 0
    )
    exit /b 1
)

它正在做的是在开始时设置一些变量然后循环遍历所有6个服务,将它们发送到子程序,该子程序检查给它的等待状态。在第一次迭代中,它是STOPPED,因此它检查循环以停止服务。一旦它被停止,它就会发送退出代码并检查退出代码以确保服务停止。此时,我们向变量添加+1以跟踪已停止的每个服务。一旦所有6个停止,我们复制有问题的文件,将服务状态翻转为RUNNING并再次运行例程,等待每个服务启动。一旦所有这些服务都启动,Echo的所有服务都在运行并结束。您可以通过检查其他状态并运行WaitForService例程来扩展它,直到所有事情都停止,如果您需要,但在我的测试中,服务刚刚停止并且没有任何打嗝而开始。

答案 1 :(得分:0)

使用this stackoverflow post中的批处理脚本等待启动/停止远程服务