コマンドの実行結果を判断する方法について教えてください


-----------------------------------------------------
# sc query [サービス名]

SERVICE_NAME: [サービス名]
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
-----------------------------------------------------

実行結果のSTATE が1、2、3、4のどれなのかによって処理を分けたいのです。
もし、1~3なら 変数result に「NG」を、4なら「OK」を代入するようにして、echoで画面に表示する。
条件分岐の部分のみでもよいのでご回答をお願いします。

回答の条件
  • 1人2回まで
  • 登録:2010/07/02 17:36:24
  • 終了:2010/07/09 17:40:03

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912010/07/03 00:07:21

ポイント26pt

いろいろなやり方があると思いますが、バッチなら下記のような方法でどうでしょうか。

@Echo Off

Call :DoesRunningService "Schedule"
Call :DoesRunningService "WPCSvc"
Call :DoesRunningService "abcd"

Pause
Exit /B

REM --------------------------------------
REM サービスの状態を確認をするサブルーチン
REM --------------------------------------
:DoesRunningService
    SC Query %1 | FindStr -C:"4  RUNNING">NUL
    If ERRORLEVEL 1 ( Echo %1 NG ) Else (Echo %1 OK )
Exit /B

実行結果に "4 RUNNING" があるかどうかを判定基準にしています。

http://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html#ERRO...

その他の回答(2件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912010/07/03 00:07:21ここでベストアンサー

ポイント26pt

いろいろなやり方があると思いますが、バッチなら下記のような方法でどうでしょうか。

@Echo Off

Call :DoesRunningService "Schedule"
Call :DoesRunningService "WPCSvc"
Call :DoesRunningService "abcd"

Pause
Exit /B

REM --------------------------------------
REM サービスの状態を確認をするサブルーチン
REM --------------------------------------
:DoesRunningService
    SC Query %1 | FindStr -C:"4  RUNNING">NUL
    If ERRORLEVEL 1 ( Echo %1 NG ) Else (Echo %1 OK )
Exit /B

実行結果に "4 RUNNING" があるかどうかを判定基準にしています。

http://www.ne.jp/asahi/hishidama/home/tech/windows/bat.html#ERRO...

id:utagawh No.2

utagawh回答回数114ベストアンサー獲得回数32010/07/02 18:42:14

ポイント27pt

for /f "usebackq tokens=1,2,3*" %i in (`sc query state"=" all`) do (if /i "%i" == "state" (if "%k" == "4" (echo ok) else (echo ng )))

sc query の結果をforで処理してはどうでしょうか?

``内をsc query サービス名 として調べたいサービス分for文を並べたほうがいいと思います。

あと、batファイル中に書く場合は%iは%%iとする必要があります。

id:hissssa No.3

hissssa回答回数423ベストアンサー獲得回数1272010/07/02 18:05:44

ポイント27pt

バッチファイルでコマンドの出力結果から処理を分けるには、FORループを使った判定の仕掛けを作る必要があります。

単純な例としてはこんな感じでしょうか。

@echo off

setlocal enabledelayedexpansion

FOR /F "delims=" %%L IN ('sc query w32time') do (

SET CL=%%L

SET CL2=!CL: =!

IF "!CL2:~0,7!"=="STATE:1" SET result=NG

IF "!CL2:~0,7!"=="STATE:2" SET result=NG

IF "!CL2:~0,7!"=="STATE:3" SET result=NG

IF "!CL2:~0,7!"=="STATE:4" SET result=OK

)

echo result:%result%

この例はコマンドの出力結果を全行検査してますので、効率は良くないです。また文字列の先頭から7文字までを決め打ちで切り取って判定してますから、この例の場合は大丈夫でも判定する文字列によっては誤動作しますのでご注意ください。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません