Board logo

标题: [系统相关] 批处理如何循环检查多个服务是否运行? [打印本页]

作者: 5i365    时间: 2022-2-16 10:19     标题: 批处理如何循环检查多个服务是否运行?

我想使用批处理检查系统当中的三个服务是否全部都在运行状态, 如果没运行就启动, 等5秒后, 再检查运行状态, 直到全部运行
自己写了部分代码, 遇到了点问题, 求高手能支招完善一下, 非常感谢!!
问题1: 红字部分我改成ser4 也会回显  ser1服务正在运行
问题2: 现在是在检查一个服务, 如何检查三个服务同时运行, 如果没运行就启动?

@echo off
set ser1="ser1"
set ser2="ser2"
set ser3="ser3"

:label1
sc query %ser1%| find "RUNNING" >nul 2>&1 && set running=true

if defined running (echo ser1服务正在运行 ) else (
        echo net start %ser1%
        choice /t 5 /d y /n >nul
        goto :label1
        )

pause
作者: 5i365    时间: 2022-2-16 10:30

找了段PS的代码, 可以启用服务, 但是如何像批处理一样, 加标签循环检查呢? 搜索了一下, ps居然没有 goto 和 lable 命令

Function startService()
{
        $args | Foreach {
                Get-Service -Name $_ |
                where Status -NE Running |
                Start-Service
        }
}

startService "ser1" "ser2" "ser3"
作者: Batcher    时间: 2022-2-16 10:30

回复 1# 5i365


思路1:不做任何判断,直接启动服务,反正对于已经启动的服务也没啥影响。
  1. @echo off
  2. net start "ser1"
  3. net start "ser2"
  4. net start "ser3"
复制代码

作者: 5i365    时间: 2022-2-16 10:32

回复 3# Batcher


    感谢大侠支招, 有时服务不能启动似的, 要再次启动才行
作者: Batcher    时间: 2022-2-16 10:35

回复 1# 5i365


思路2:
定义一个变量 RunningCount 初始值是0
对于每一个服务用 sc + find 判断状态之后,如果是运行状态,那么 set /a RunningCount+=1
最后判断RunningCount的值是不是3就能知道是否三个服务全都是运行状态
作者: Batcher    时间: 2022-2-16 10:46

回复 4# 5i365


这种情况也不需要自己用循环来再次启动,可以在 services.msc 里面把服务的恢复设置从默认的“不操作”改为“重新启动服务”


作者: thp2008    时间: 2022-2-16 14:58

我有个现成的,差不多的,你稍微修改一下就可以用了,我是监控它在运行就自动停止。你反过来就好了。
  1. @echo off&setlocal enabledelayedexpansion
  2. %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
  3. :start
  4. cls
  5. for /f "skip=3 tokens=4" %%i in ('sc query XLServicePlatform') do set "zt=%%i" &goto :next
  6. :next
  7. if /i "%zt%"=="RUNNING" (sc stop XLServicePlatform )
  8. echo.
  9. if /i "%zt%"=="STOPPED" (echo XLServicePlatform 服务目前是停止状态,没有运行)
  10. for /f "skip=3 tokens=4" %%i in ('sc query TbtHostControllerService') do set "zt=%%i" &goto :next
  11. :next
  12. if /i "%zt%"=="RUNNING" (sc stop TbtHostControllerService )
  13. echo.
  14. if /i "%zt%"=="STOPPED" (echo TbtHostControllerService 服务目前是停止状态,没有运行)
  15. for /f "skip=3 tokens=4" %%i in ('sc query TbtP2pShortcutService') do set "zt=%%i" &goto :next
  16. :next
  17. if /i "%zt%"=="RUNNING" (sc stop TbtP2pShortcutService )
  18. echo.
  19. if /i "%zt%"=="STOPPED" (echo TbtP2pShortcutService 服务目前是停止状态,没有运行)
  20. echo.
  21. echo.
  22. echo 倒计时30秒后,将重新检测!
  23. echo.
  24. TIMEOUT /T 30 /NOBREAK
  25. goto start
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2