检查 windows 服务列表是否为 运行,如果不是从批处理文件启动

check if a list of windows services are running and start if not from batch file

我正在寻找一个批处理脚本来检查是否有一些服务 运行 如果没有启动它们,这就是我到目前为止要检查的特定服务是否 运行:

for /F "tokens=3 delims=: " %%H in ('sc query "service1" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   net start "service1"
  )

但是,我想修改这个for循环来检查是否有匹配其他服务,如“service2”、“service3”、“service4”和“service5”,但我不知道如何去做这样做。是否可以将这些匹配包含在同一个 For 循环中?

谢谢

这里有一个你可能没有考虑过的替代方案,(忽略了我之前评论中的建议),可以直接在, or from a 中运行 :

%SystemRoot%\System32\wbem\WMIC.exe Service Where "Name='Service1' Or Name='Service2' Or Name='Service3' Or Name='Service4 Or Name='Service5 And Started='TRUE' And State !='Running'" Call StartService >NUL 2>&1

您需要自己决定 Started='TRUE' 部分是否是必需的,但我建议您一定要先保留它。

如果您想在一个循环中使用 FOR 批量执行此操作:

FOR /F "tokens=2,3 delims=: " %%H IN ('^(SC QUERY "Service1" ^& SC QUERY "Service2"^) ^| FINDSTR /C:"SERVICE_NAME" /C:"        STATE" ') DO (IF NOT "%%H" == "" (IF "%%I" == "" SET LOCALV_SERV=%%H) & IF NOT "%%I" == "" (IF /I "%%I" NEQ "RUNNING" CALL NET START %%LOCALV_SERV%%))

我们通过连接多个 SC 输出一次查询多个服务,然后在这里使用 FINDSTR 一次搜索多个字符串的能力以获得服务名称和服务状态。

正如@Compo 所建议的,您应该测试许多其他服务状态。

那么对于您的用例,命令应该是:

FOR /F "tokens=2,3 delims=: " %%H IN ('^(SC QUERY "Service1" ^& SC QUERY "Service2" ^& SC QUERY "Service3" ^& SC QUERY "Service4" ^& SC QUERY "Service5"^) ^| FINDSTR /C:"SERVICE_NAME" /C:"        STATE" ') DO (IF NOT "%%H" == "" (IF "%%I" == "" SET LOCALV_SERV=%%H) & IF NOT "%%I" == "" (IF /I "%%I" NEQ "RUNNING" CALL NET START %%LOCALV_SERV%%))

将 Service1、Service2、Service3、Service4、Service5 替换为您要定位的服务名称。

由于@Compo 指出使用 CALL 进行后期扩展可能不合适,这里是明确启用延迟扩展的同一脚本:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=2,3 delims=: " %%H IN ('^(SC QUERY "Service1" ^& SC QUERY "Service2"^) ^| FINDSTR /C:"SERVICE_NAME" /C:"        STATE" ') DO (IF NOT "%%H" == "" (IF "%%I" == "" SET LOCALV_SERV=%%H) & IF NOT "%%I" == "" (IF /I "%%I" NEQ "RUNNING" NET START !LOCALV_SERV!))

根据评论,这是我的答案的扩展,它仅在循环中需要的地方启用延迟扩展。此版本还删除了对 %PATH%%PATHEXT% 的依赖,并提高了可读性:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "SC=%SystemRoot%\System32\sc.exe"
Set "FS=%SystemRoot%\System32\findstr.exe"

For /F "Tokens=2-3 Delims=: " %%G In ('
    (%SC% Query "Service1" ^&
     %SC% Query "Service2" ^&
     %SC% Query "Service3" ^&
     %SC% Query "Service4" ^&
     %SC% Query "Service5"^) 2^>NUL
     ^| %FS% /BIC:"SERVICE_NAME:" /C:"        STATE "
') DO (
    If Not "%%G" == "" If "%%H" == "" Set "LOCALV_SERV=%%G"
    If Not "%%H" == "" If /I Not "%%H" == "RUNNING" (
        SetLocal EnableDelayedExpansion
        %SC% Start !LOCALV_SERV!
        EndLocal
    )
)