我想在不使用任何第三方工具的情况下获取所有service_name及其状态。到目前为止,SC命令足以获取其中一个值,如
sc query | findstr SERVICE_NAME
但我列出的每个STATUS
也需要SERVICE_NAME
。
答案 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 query state= all
(注意: sc query state=all
将不起作用。您需要在等号后加空格符号。否则,您将得到以下奇怪错误:[SC] EnumQueryServicesStatus:OpenService FAILED 1060: The specified service does not exist as an installed service.
)
答案 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
以下是相关变化的细目
FIND /I "myservice"
的服务名称%s
和 %t
分别更改为 %%s
和 %%t
(我喜欢对 var 使用大写)OUTPUT
变量 (SET OUTPUT="%%S -------------------------------------------------------------"
),该值被引用,因为我最初打算使用空格,但切换到破折号 -
,可以更改为任何你喜欢的角色,我也考虑过*
。该值设置为服务名称加上任何填充字符。@ECHO !OUTPUT:~1,55!^> %%T
!OUTPUT:~1,55!
由于延迟扩展而使用 !
并从第二个字符(从零开始的索引)开始使用 55 个字符以删除前导 "
立>
^>
:^
会转义 >
,因此它不会尝试重定向到...某处。所有这些都是为了在输出行中包含 >
(完全没有必要)%%T
,状态输出希望这对某人有所帮助!我永远不会记得这些东西!