如何收集每个服务名称及其在Windows中的状态?

时间:2012-08-29 07:38:50

标签: windows windows-7

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

sc query | findstr SERVICE_NAME

但我列出的每个STATUS也需要SERVICE_NAME

5 个答案:

答案 0 :(得分:6)

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

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)需要加倍。

答案 1 :(得分:1)

ss64.com/nt/sc.html

sc state= active¦inactive¦all

答案 2 :(得分:0)

尝试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

答案 3 :(得分:0)

顺便

sc query | findstr SERVICE_NAME

将仅显示活动的(运行中)服务,因此不需要过滤状态(状态)。

尝试使用支持多个过滤项的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"

答案 4 :(得分:0)

感谢 @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(我喜欢对 var 使用大写)
  • 添加了用于格式化的 OUTPUT 变量 (SET OUTPUT="%%S -------------------------------------------------------------"),该值被引用,因为我最初打算使用空格,但切换到破折号 -,可以更改为任何你喜欢的角色,我也考虑过*。该值设置为服务名称加上任何填充字符。
  • 输出行@ECHO !OUTPUT:~1,55!^> %%T
    • 格式化输出:!OUTPUT:~1,55! 由于延迟扩展而使用 ! 并从第二个字符(从零开始的索引)开始使用 55 个字符以删除前导 "
    • ^>^ 会转义 >,因此它不会尝试重定向到...某处。所有这些都是为了在输出行中包含 >(完全没有必要)
    • 最后,%%T,状态输出

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