Oto polecenia, które należy wykonać zadanie:
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)
Jak to działa:
Pierwszy sc query state= all | find "SERVICE_NAME"
jest prowadzony. To polecenie ma na celu podanie nazw usług, po jednym w wierszu. Opieki ^
(które usunąłem tutaj) są konieczne, aby uniknąć znaków specjalnych, które mają wpłynąć na polecenie sc
, a nie na samo polecenie for
.
Następnie pierwsze for /f
analizuje powyższe dane wyjściowe, aby usunąć standardowy prefiks "SERVICE_NAME:" z każdej linii, podając czyste nazwy usług. W tym momencie wyjście wygląda następująco:
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
To wyjście jest następnie podawany do następnego for /f
, czyli sc query servicename
, znajdzie linię ze stanem i izoluje 4th „słowo” (obecny stan).
Na koniec, drukowana jest nazwa każdej usługi wraz z jej stanem (w tym momencie możesz wybrać inną opcję, jeśli chcesz).
Ważna uwaga: W przypadku uruchomienia tego wewnątrz pliku wsadowego, znaki procent (na przykład w %s
) muszą zostać podwojona.
Dziękuję bardzo miłe wyjaśnienie – abi1964