【发布时间】:2012-08-29 07:38:49
【问题描述】:
我想在不使用任何第三方工具的情况下获取所有 service_name 及其状态。到目前为止,SC 命令足以获取其中一个值,例如
sc query | findstr SERVICE_NAME
但对于列出的每个SERVICE_NAME,我还需要STATUS。
【问题讨论】:
我想在不使用任何第三方工具的情况下获取所有 service_name 及其状态。到目前为止,SC 命令足以获取其中一个值,例如
sc query | findstr SERVICE_NAME
但对于列出的每个SERVICE_NAME,我还需要STATUS。
【问题讨论】:
这是一个应该完成这项工作的命令:
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返回了我所期望的一切。
顺便说一句
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"
【讨论】:
PowerShell 有Get-Service。它的细节比 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.)
【讨论】:
ss64.com/nt/sc.html
sc state= active¦inactive¦all
【讨论】:
感谢@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(我喜欢对vars 使用大写)OUTPUT var(SET OUTPUT="%%S -------------------------------------------------------------"),该值被引用,因为我最初打算使用空格,但切换到破折号-,可以更改为您喜欢的任何字符,我认为* 也是。该值设置为服务名称加上任何填充字符。@ECHO !OUTPUT:~1,55!^> %%T
!OUTPUT:~1,55! 使用 !,因为延迟扩展并从第二个字符(从零开始的索引)开始使用 55 个字符,以删除前导 "
^>:^ 转义了 >,因此它不会尝试重定向到...某处。只是为了在输出行中包含>(完全没有必要)%%T,状态输出希望这对某人有所帮助!我永远记不住这些东西!
【讨论】: