【问题标题】:How to collect each Service name and its Status in Windows?如何在 Windows 中收集每个服务名称及其状态?
【发布时间】:2012-08-29 07:38:49
【问题描述】:

我想在不使用任何第三方工具的情况下获取所有 service_name 及其状态。到目前为止,SC 命令足以获取其中一个值,例如

sc query | findstr SERVICE_NAME

但对于列出的每个SERVICE_NAME,我还需要STATUS

【问题讨论】:

    标签: windows windows-7


    【解决方案1】:

    这是一个应该完成这项工作的命令:

    for /f "tokens=2" %s in ('sc query state^= all ^| find "SERVICE_NAME"') do
        @(for /f "tokens=4" %t in ('sc query %s ^| find "STATE     "') do @echo %s is %t)
    

    它是如何工作的:

    首先运行sc query state= all | find "SERVICE_NAME"。此命令旨在为您提供服务名称,每行一个。插入符号 ^(我已在此处删除)是必需的,以便转义要影响 sc 命令而不是 for 命令本身的特殊字符。

    然后最初的for /f 解析上述输出以从每行中删除标准的“SERVICE_NAME:”前缀,从而为您提供纯服务名称。此时输出如下所示:

    C:\>for /f "tokens=2" %s in ('sc query state^= all ^| find "SERVICE_NAME"') do @echo %s
    AdobeFlashPlayerUpdateSvc
    AeLookupSvc
    ALG
    AppIDSvc
    Appinfo
    AppMgmt
    aspnet_state
    AudioEndpointBuilder
    AudioSrv
    

    然后,此输出被馈送到下一个 for /f,它运行 sc query servicename,找到具有状态的行,并隔离第 4 个“单词”(当前状态)。

    最后,打印每个服务的名称及其状态(此时您可以根据需要选择执行不同的操作)。

    重要提示:如果您在批处理文件中运行,百分号(例如%s)需要加倍。

    【讨论】:

    • 感谢非常好的解释
    • 我发现这并没有返回内核驱动程序,但我发现sc query state=all type=all返回了我所期望的一切。
    【解决方案2】:

    顺便说一句

    sc query | findstr SERVICE_NAME
    

    将仅显示活动 (RUNNING) 服务,因此无需过滤状态 (STATE)。

    尝试使用支持多个过滤项的 findstr 语法的 SC:

    sc query state= all | findstr "SERVICE_NAME STATE"
    

    sc query state= all | findstr "DISPLAY_NAME STATE"
    

    或两者兼而有之

    sc query state= all | findstr "SERVICE_NAME DISPLAY_NAME STATE"
    

    【讨论】:

      【解决方案3】:

      尝试获取服务

      PowerShell 有Get-Service。它的细节比 sc.exe 少一点。

      试试 SC.exe

      sc.exe query state= all
      

      注意: sc query state=all 将不起作用。您需要在等号后添加空格符号。否则您会收到这个奇怪的错误:[SC] EnumQueryServicesStatus:OpenService FAILED 1060: The specified service does not exist as an installed service.

      来源:https://ss64.com/nt/sc.html

      【讨论】:

        【解决方案4】:

        ss64.com/nt/sc.html

        sc state= active¦inactive¦all
        

        【讨论】:

          【解决方案5】:

          感谢@jon 的帖子,这很有帮助。我想要一个列对齐的输出,所以我抓住了你上面的例子并创建了以下批处理文件:

          @ECHO OFF
          SETLOCAL ENABLEDELAYEDEXPANSION
          ECHO.Service                                                  State
          ECHO.-------------------------------------------------------  -------------
          
          FOR /F "TOKENS=2" %%S IN ('sc query state^= all ^| FIND "SERVICE_NAME" ^| FIND /I "myservice"') DO (
              @(FOR /f "TOKENS=4" %%T IN ('sc query %%S ^| FIND "STATE     "') DO (
                  SET OUTPUT="%%S -------------------------------------------------------------"
                  @ECHO !OUTPUT:~1,55!^> %%T
              ))
          )
          ENDLOCAL
          

          这会产生适合我正在寻找的输出,如下所示:

          Service                                                  State
          -------------------------------------------------------  -------------
          MyService.Test_1 --------------------------------------> STOPPED
          MyService.Test_2 --------------------------------------> RUNNING
          MyService.Test_3 --------------------------------------> STOPPED
          

          以下是相关更改的细分

          • 添加了额外的查找以仅过滤我想查看的服务名称而不是整个列表,在这种情况下查找包含“myservice”的服务名称FIND /I "myservice"
          • 由于在批处理文件中,将%s%t 分别更改为%%s%%t(我喜欢对vars 使用大写)
          • 添加了用于格式化的OUTPUT var(SET OUTPUT="%%S -------------------------------------------------------------"),该值被引用,因为我最初打算使用空格,但切换到破折号-,可以更改为您喜欢的任何字符,我认为* 也是。该值设置为服务名称加上任何填充字符。
          • 输出线@ECHO !OUTPUT:~1,55!^> %%T
            • 格式化输出:!OUTPUT:~1,55! 使用 !,因为延迟扩展并从第二个字符(从零开始的索引)开始使用 55 个字符,以删除前导 "
            • ^>^ 转义了 >,因此它不会尝试重定向到...某处。只是为了在输出行中包含>(完全没有必要)
            • 最后,%%T,状态输出

          希望这对某人有所帮助!我永远记不住这些东西!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-09-29
            • 1970-01-01
            • 2012-04-11
            • 1970-01-01
            • 2017-01-15
            • 2011-04-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多