Aquí hay un comando que debe hacer el trabajo:
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)
Cómo funciona:
Primera sc query state= all | find "SERVICE_NAME"
se ejecuta. Este comando está diseñado para darle los nombres de los servicios, uno por línea. Las referencias ^
(que he eliminado aquí) son necesarias para escapar de los caracteres especiales que desea afectar al comando sc
y no al comando for
.
Luego, el for /f
inicial analiza el resultado anterior para eliminar el prefijo "SERVICE_NAME:" estándar de cada línea, lo que le da nombres de servicio puros. En este punto, la salida es el siguiente:
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
Esta salida se alimenta entonces a la siguiente for /f
, que se extiende sc query servicename
, encuentra la línea con el estado, y aísla la "palabra" cuarto (el estado actual).
Finalmente, el nombre de cada servicio se imprime junto con su estado (en este punto puede elegir hacer algo diferente si lo desea).
Nota importante: Si ejecuta esto dentro de un archivo por lotes, los signos de porcentaje (por ejemplo, %s
) deben duplicarse.
Gracias muy buena explicación también – abi1964