我想在不使用任何 3rd 方工具的情况下获取所有 service_name 及其状态。到目前为止,SC命令足以获取其中一个值,例如
sc query | findstr SERVICE_NAME
但我也需要列出STATUS
每个。SERVICE_NAME
这是一个应该完成这项工作的命令:
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
)需要加倍。
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.
:)
顺便一提
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"
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
OUTPUT
用于格式化的 var ( SET OUTPUT="%%S -------------------------------------------------------------"
),该值被引用,因为我最初打算使用空格,但切换到 dash -
,可以将其更改为您喜欢的任何字符,我也考虑*
过。该值设置为服务名称加上任何填充字符。@ECHO !OUTPUT:~1,55!^> %%T
!OUTPUT:~1,55!
使用!
,并从第二个字符(从零开始的索引)开始使用 55 个字符以删除前导"
^>
:^
转义,>
因此它不会尝试重定向到...某处。所有这些都是为了>
在输出行中包含(完全没有必要)%%T
状态输出希望这对某人有帮助!我永远记不住这些东西!