Batch file 正在停止/启动远程计算机上的服务,并等待结果

Batch file 正在停止/启动远程计算机上的服务,并等待结果,batch-file,service,Batch File,Service,我正在编写一个批处理脚本,它应该停止远程计算机上的服务,复制一些内容,然后重新启动它 sc不等待服务返回完全停止/启动信号这一事实并不能让我满意,因为我担心服务可能不一致或失败,然后可能会损坏依赖于这些服务的程序代码/数据库 因此,我寻找了一个解决方法,找到了一个类似于网络使用的方法,并解决了以下问题: sc \\remote_server stop Service1 >> %LOGFILE% :askservice1 for /f "tokens=4" %%a in (' sc

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

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并让它转到下一个服务


或者你还有其他代码可以帮我吗?我仅限于使用batch或powershell,但由于我以前从未使用过PS,我无法理解我找到的解决方案。

试试这个,看看它是否适合您。我在本地机器上用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
)
@echo关闭
延迟扩展
设置“停止开始=停止”
设置“状态=停止”
设置“remoteserver=REMSERV”
设置“LogFile=LogFile.log”
如果存在%LogFile%del/q%LogFile%
:开始
对于(服务1服务2服务3服务4服务5服务6)中的%%S,请执行以下操作(
sc\\%remoteserver%%stopstart%%%S>>%LogFile%
调用:WaitForService%remoteserver%%%S%state%ret&&(
回显服务%%S%状态%
设置/a svc+=1)|(
服务%%S是!状态!
)
)   
如果“%svc%”等于“6”(
立即复制文件。
ping-n10127.0.0.1>nul
设置“stopstart=start”
设置“状态=运行”
后藤:开始
)
如果“%svc%”等于“12”(回显所有服务现在正在运行。)
退出/b
:WaitForService
setlocal
对于(1,10,1)do中的/L%%a(
对于/f“令牌=4”%%a,在('
sc\\%~1查询%2^ findstr“STATE”do(
ping-n2-w 10000 127.0.0.1>nul
如果“%%a”eq“%%3”集合%%4=%%a&退出/b 0
)
退出/b 1
)

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

您是否正在等待所有6项服务在复制之前停止?是的,我想。我正在复制数据库的实例目录,为了保持数据库的一致性和可恢复状态,使用DB的服务不应运行以阻止对文件的访问。如果我将服务停止/启动放在远程计算机上本地的批处理文件上,并从我正在复制的文件开始,这是否是一种解决方案?在此范围内,我可以使用净启动/停止,并获得所需的成功信号。如何等待远程批处理完成,然后在我正在使用的机器上继续?