8

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

sc query | findstr SERVICE_NAME

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

4

5 回答 5

9

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

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 个“单词”(当前状态)。

最后,每个服务的名称连同它的状态一起被打印出来(此时你可以选择做一些不同的事情,如果你愿意的话)。

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

于 2012-08-29T07:58:48.280 回答
2

尝试获取服务

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

于 2019-01-04T14:12:59.447 回答
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"
于 2019-05-19T12:12:08.440 回答
1

ss64.com/nt/sc.html

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

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

于 2021-04-01T14:42:18.717 回答