2

バッチファイルで、サービスが開始されているかどうかを確認しようとしています。開始されていない場合は待機します。

サービスが実行されているかどうかを確認するために、次のようにしています。

sc query "serviceName" | find /i "RUNNING"
if "%ERRORLEVEL%"=="0" (
    echo serviceName is running.
) else (
    echo serviceName is not running
)

問題は、エラーレベルが常に 0 に設定されていることです。おそらく、この既知のFind bugが原因です。サービスが開始されているかどうかを確認する別の方法はありますか?

4

5 に答える 5

10

Findstrコマンドの代わりに使用できますFind

sc query "Service name" | findstr /i "RUNNING" 1>nul 2>&1 && (
    echo serviceName is running.
) || (
    echo serviceName is not running
)

wmic次のコマンドを使用して行うこともできます。

wmic service where name="Service name" get State | Findstr /I "Running" 1>NUL 2>&1 && (
    echo serviceName is running.
) || (
    echo serviceName is not running
)

将来のために注意すべきもう 1 つの点は、数値を比較する場合、式を引用符""で囲んではならないということです。そのため、条件は次のようになります。

If %ERRORLEVEL% EQU 0 () ELSE ()
于 2013-10-21T10:43:28.847 に答える
8

Windows NT version 3.1 and Windows NT Advanced Server version 3.1を使用しておらず、サービス名に が含まれていない場合、コードは正常に機能しますrunning

おそらくループ内にあるため、これを使用する必要があります(または遅延展開):

sc query "serviceName" | find /i "RUNNING"
if not ERRORLEVEL 1 (
    echo serviceName is running.
) else (
    echo serviceName is not running
)
于 2013-10-21T11:19:14.000 に答える
4

私にとってはうまくいきます.ERRORLEVEL変数が上書きされたり、コードが括弧ブロックに含まれたりする可能性はありますか? 次のいずれかを試してください。

sc query "serviceName" | findstr /i "RUNNING"
if not errorlevel 1 (
    echo serviceName is running.
) else (
    echo serviceName is not running
)

また

sc query "serviceName" | findstr /i "RUNNING" && (
    echo serviceName is running.
    goto :skip_not_w
) 
echo serviceName is not running
:skip_not_w

引用されたバグはwindows nt(これはあなたのOSですか?)のためのものであり、すでに修正されている必要があります...あなたのOSが NT の場合、コマンドの出力を解析して、FOR /F含まれているRUNNINGか使用しているかを確認する必要がありますFINDSTR

于 2013-10-21T10:48:12.370 に答える