サードパーティのツールを使用せずに、すべての service_name とそのステータスを取得したいと考えています。これまでのところ、 SCコマンドは次のような値の 1 つを取得するのに十分でした。
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"
実行です。このコマンドは、サービス名を 1 行に 1 つずつ表示するように設計されています。キャレット(ここでは削除しました) は、コマンド自体ではなく、コマンド^
に影響を与えたい特殊文字をエスケープするために必要です。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
) を 2 倍にする必要があります。
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.
:)
ss64.com/nt/sc.html
sc state= active¦inactive¦all