Reputation: 12347
I want to fetch all service_name and its status without using any 3rd party tool. So far SC command was good enough to fetch one of the values, something like
sc query | findstr SERVICE_NAME
but I also need STATUS
for each SERVICE_NAME
listed.
Upvotes: 10
Views: 55298
Reputation: 173
Thanks @jon for the post, that was very helpful. I wanted a column aligned output, so I grabbed your example above and created the following batch file:
@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
That produces an output suitable for what I was looking for like this:
Service State
------------------------------------------------------- -------------
MyService.Test_1 --------------------------------------> STOPPED
MyService.Test_2 --------------------------------------> RUNNING
MyService.Test_3 --------------------------------------> STOPPED
Here's a breakdown of the relevant changes
FIND /I "myservice"
%s
and %t
to %%s
and %%t
respectively (I like to use caps for vars)OUTPUT
var for formatting (SET OUTPUT="%%S -------------------------------------------------------------"
), the value is quoted since I initially intended to use spaces, but switched to a dash -
, that can be changed to any character you like, I considered *
as well. The value is set to the service name plus whatever padding character.@ECHO !OUTPUT:~1,55!^> %%T
!OUTPUT:~1,55!
uses !
because of the delayed expansion and takes 55 characters starting at the 2nd character (zero based index) in order to remove the leading "
^>
: the ^
escapes the >
so it does not attempt to redirect to... somewhere. All in order to just include the >
in the output line (totally not necessary)%%T
, the state outputHope this helps someone! I can never remember this stuff!
Upvotes: 1
Reputation: 3108
PowerShell has Get-Service
. It has a little less detail than sc.exe.
sc.exe query state= all
(Note: sc query state=all
will NOT work. You NEED the space sign after the equals sign. Otherwise you will get this weird error: [SC] EnumQueryServicesStatus:OpenService FAILED 1060: The specified service does not exist as an installed service.
)
Source: https://ss64.com/nt/sc.html
Upvotes: 2
Reputation: 51
By the way
sc query | findstr SERVICE_NAME
will show only active (RUNNING) services, so there is no need to filter status (STATE).
Try SC with findstr syntax that supports multiple filtered items:
sc query state= all | findstr "SERVICE_NAME STATE"
or
sc query state= all | findstr "DISPLAY_NAME STATE"
or both
sc query state= all | findstr "SERVICE_NAME DISPLAY_NAME STATE"
Upvotes: 5
Reputation: 437844
Here's a command that should do the job:
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)
How it works:
First sc query state= all | find "SERVICE_NAME"
is run. This command is designed to give you the service names, one per line. The carets ^
(which I have removed here) are necessary in order to escape the special characters that you want to affect the sc
command and not the for
command itself.
Then the initial for /f
parses the above output to remove the standard "SERVICE_NAME:" prefix from each line, giving you pure service names. At this point the output looks like this:
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
This output is then fed to the next for /f
, which runs sc query servicename
, finds the line with the state, and isolates the 4th "word" (the current state).
Finally, the name of each service is printed along with its state (at this point you can choose to do something different if you wish).
Important note: If you run this inside a batch file, the percent signs (e.g. at %s
) need to be doubled.
Upvotes: 10