0

シナリオ :

特定の Windows サービスのステータスを調べるためのシェル スクリプトの方法 (コマンド ライン メソッド) を見つけようとしています。たとえば、Telnet サービスを取り上げましたが、それは無効モード (services.msc から確認) であり、sc queryコマンドにはなりません。

sc query state= all正常に機能し、すべてのサービス (アクティブ/非アクティブ) のリストを提供してくれました。これで、Windows サービスの表示名 (出力パイプ) からサービスの状態を取得する方法を見つけるために、私の問題が軽減されました。

試してみ sc query state= all | find /N "Telnet"ましたが、これは検索行番号とその内容のみを提供し、その情報は表示名の2〜3行前(パイプによって検索されて返される場所)であるため、サービスステータスは提供しません。

問題 :

ウィンドウで行番号位置から出力をパイプする方法はありますか? 私の場合のように、telnet サービスが行番号 182 で見つかった場合、行番号 180 から 187 までのコマンド出力を取得するには ??

アイデアがあれば、私の問題を解決するためのより良い方法を教えてください。

どうもありがとう !!

4

5 に答える 5

1

これは、非常に洗練されたソリューションではありませんが、バッチ ファイルを使用して行う 1 つの方法です。

@echo off
setlocal

set currentservice=""
set servicestate=""
sc query state= all > services.txt
for /f "delims=:; tokens=1,2" %%a in (services.txt) do call :findservice "%%a" "%%b"
del services.txt

echo %servicestate%

endlocal
goto :end

:findservice
if not %1 == "SERVICE_NAME" goto :findstate
set currentservice=%2
goto :end

:findstate
if not %1 == "        STATE              " goto :end
if not %currentservice% == " Telnet" goto :end
set servicestate=%2
goto :end

:end

まず、結果をsc query一時ファイル (services.txt) に書き出します。次に、for ループを使用して、そのファイルの各行を処理します。

で始まる行が見つかるとSERVICE_NAME、その名前の値がcurrentservice変数に保存されます。次に、 で始まる行を見つけたときにSTATEcurrentservice変数が に設定されている場合、状態の値をservicestate" Telnet"変数に保存します。

したがって、すべての最後に、 servicestate変数にある種の状態が含まれている必要があります (これは、サンプル コードに反映されています)。" 4 RUNNING "これはまたはのようなものになります" 1 STOPPED "。Telnet サービスが見つからない場合は、空白になります。

sc クエリの出力が処理される方法のため、コード内のスペースはすべて重要であることに注意してください。特に、一致させようとしているサービス名はスペースで始まる必要があることに注意してください。

これは改善される可能性がありますが、少なくとも最初の一歩です。

于 2013-06-24T15:18:40.127 に答える
1

別の方法を次に示します。少し遅くなるいくつかのショートカットを取りましたが、SCが期待されるすべてのWindowsバージョンで実行されるはずです。

@echo off
for /f "tokens=1,* delims=:" %%a in ('sc query state^= all ^| findstr "DISPLAY_NAME: STATE" ') do (
echo %%a|find "DISP">nul && set /p "=%%b : "<nul
echo %%a|find "STATE">nul && (set /p "=%%b"<nul&echo.)
)
pause

出力は次のとおりです。

Family Safety : 1 停止
Portable Device Enumerator Service : 4 実行中
Security Center : 4 実行中
Windows Search : 1 停止
Windows Store Service (WSService) : 1 停止
Windows Update : 1 停止
Windows Driver Foundation - User-mode Driver Framework : 1 停止
WWAN AutoConfig : 1 停止しました

于 2013-06-25T06:35:05.587 に答える
1

@dbenham が書いた repl.bat というツールは、http: //www.dostips.com/forum/viewtopic.php?f=3&t=3855 にあります。

以下の方法で使用すると、プロセスと状態のリストが表示されます。

sc query | findstr "SERVICE_NAME STATE" | repl "SERVICE_NAME..(.*)\r\n" "$1" m  | repl "(.*) *STATE.*:....(.*)." "$2 - $1"

これは、Win 8 Pro 32 ビットでの出力のサンプルです。

実行中 - wcncsvc実行中
- WdiServiceHost 実行中
- WinDefend 実行中
- WinHttpAutoProxySvc 実行
中 - winmgmt実行中
- WPDBusEnum実行中
- wscsvc

サービスと表示名を含むすべてのサービスの完全なリストを取得するには、次のようにします。

sc query state= all | findstr "DISPLAY_NAME: SERVICE_NAME STATE" | repl "SERVICE_NAME..(.*)\r\n" "$1" m  | repl "DISPLAY_NAME:.(.*)\r\n" " - $1" m | repl "(.*) *STATE.*: .  (.*)."  "$2 - $1"

次のようなリストを提供します。

実行中 - WPDBusEnum - ポータブル デバイス列挙子サービス
実行中 - wscsvc - セキュリティ センター
が停止 - WSearch - Windows 検索が
停止 - WSService - Windows ストア サービス (WSService) が
停止 - wuauserv - Windows Update
が停止 - wudfsvc - Windows Driver Foundation - ユーザー モード ドライバー フレームワークが
停止- WwanSvc - WWAN 自動構成

于 2013-06-25T00:25:32.617 に答える