web-dev-qa-db-ja.com

コマンドラインからサービスが実行されているかどうかをテストする方法

サービスがWindowsバッチファイルから実行されているかどうかを照会できるようにしたいと思います。私が使用できることを知っています:

scクエリ「ServiceName」

しかし、これはいくつかのテキストをダンプします。私が本当に欲しいのは、環境変数errorlevelを設定して、それに対処することができるようにすることです。

私がこれを行うことができる簡単な方法を知っていますか?

[〜#〜] update [〜#〜]
これまでの回答に感謝します。英語以外のオペレーティングシステムでは、テキストを解析するソリューションが機能しない可能性があることを心配しています。誰かがこれを回避する方法を知っていますか、または私はこれを正しくするために弾丸を噛んでコンソールプログラムを書く必要がありますか?.

48
Scott Langham
sc query "ServiceName" | find "RUNNING"
70
Igal Serban

Windowsのバッチプログラミングの古い学校に戻りましょう

net start | find "Service Name"

これはどこでも動作します...

16
Shahin

netコマンドとgrepを組み合わせることを気にしない場合は、次のスクリプトを使用できます。

@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end
8
joerg

/ locale オプションでwmicを使用できます

call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
    echo Running
) else (
    echo Not running
)
6
NicJ

ここでボックスの外側を少し考えて、powershellが最新のXP/2003マシンで、そして確かにVista/2008以降(.bat/.cmdの代わり)で答えになるかもしれないと提案します。背景にPerlを持っている人は誰でも、すぐに自宅にいるように感じるでしょう。


$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;

if ($serviceStatus -eq "Running") {
    echo "Service is Running";
}
else {
    #Could be Stopped, Stopping, Paused, or even Starting...
    echo "Service is $serviceStatus";
}

別の方法として、バッチにかなりの投資がある場合、PSスクリプトをワンライナーとして実行し、終了コードを返します。


@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}"

ECHO.%ERRORLEVEL%

ワンライナーとして実行すると、煩雑さを犠牲にしてデフォルトのPSコード署名ポリシーを回避できます。 PSコマンドを.ps1ファイルに入れてpowershell myCode.ps1のように実行するには、Powershellスクリプトへの署名が自動化された方法で実行する必要がある場合があります(環境によって異なります)。 http://www.hanselman.com/blog/SigningPowerShellScripts.aspx を参照してください

3
JGurtz

WMIC Service WHERE "Name = 'SericeName'" GET Started

または WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId(サービスが開始されていない場合、ProcessIdはゼロになります)

前者が「TRUE」を返すか、後者がゼロ以外を返すかに基づいて、エラーレベルを設定できます。

3
Mark Sowul
scクエリ "servicename" | findstr STATE

例えば:

scクエリ "wuauserv" | findstr STATE

Windows Updateサービスの実行内容、実行中/一時停止などを報告するため.
これはWindows 10用でもあります。後でありがとう。

2
Quack

試して

sc query state= all 

サービスのリストとそれらが実行されているかどうか。

2
Galwegian
@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro 
goto end

:end
1
Muhammad Imron

私はこれを見つけました:

  sc query "ServiceName" | findstr RUNNING  

おおよそ正しいことをするようです。しかし、英語以外のオペレーティングシステムで動作するほど一般化されていないことが心配です。

1
Scott Langham
SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end

:end
0
Luis Ramos

Powershellを使用している場合は、リストに追加するだけです。

sc.exe query "ServiceName" | findstr RUNNING

scはPowershell内のSet-Contentのエイリアスであるため、以下のコマンドは機能しません。

sc query "ServiceName" | findstr RUNNING

findもPowershellでは動作しませんが、何らかの理由で私には不明です。

sc.exe query "ServiceName" | find RUNNING
0
Chris Voon

find/findstrベースのAnswersを使用する場合、正規表現の使用について誰も言及していないことに気付きました。同様の名前のサービスでは問題になる可能性があります。

CDPUserSvcCDPUserSvc_54530の2つのサービスがあるとします

ここまでのfind/findstrベースの回答のほとんどをここで使用すると、CDPUserSvc_54530のみが実行されている場合、CDPUserSvcクエリに対して誤検出が発生します。 。

findstr/rおよび/cスイッチは、そのユースケースの処理に役立ちます。また、行の終わりを示す特殊文字$

このクエリは、CDPUserSvcサービスの実行のみを検証し、CDPUserSvc_54530を無視します

sc query|findstr /r /c:"CDPUserSvc$"

0

Cygwin Bashと一緒に使用:

sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"

(必ずsc.exe PATHに。)

0
not2qubit