サービスがWindowsバッチファイルから実行されているかどうかを照会できるようにしたいと思います。私が使用できることを知っています:
scクエリ「ServiceName」
しかし、これはいくつかのテキストをダンプします。私が本当に欲しいのは、環境変数errorlevel
を設定して、それに対処することができるようにすることです。
私がこれを行うことができる簡単な方法を知っていますか?
[〜#〜] update [〜#〜]
これまでの回答に感謝します。英語以外のオペレーティングシステムでは、テキストを解析するソリューションが機能しない可能性があることを心配しています。誰かがこれを回避する方法を知っていますか、または私はこれを正しくするために弾丸を噛んでコンソールプログラムを書く必要がありますか?.
sc query "ServiceName" | find "RUNNING"
Windowsのバッチプログラミングの古い学校に戻りましょう
net start | find "Service Name"
これはどこでも動作します...
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
/ 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
)
ここでボックスの外側を少し考えて、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 を参照してください
WMIC Service WHERE "Name = 'SericeName'" GET Started
または WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId
(サービスが開始されていない場合、ProcessIdはゼロになります)
前者が「TRUE」を返すか、後者がゼロ以外を返すかに基づいて、エラーレベルを設定できます。
scクエリ "servicename" | findstr STATE
例えば:
scクエリ "wuauserv" | findstr STATE
Windows Updateサービスの実行内容、実行中/一時停止などを報告するため.
これはWindows 10用でもあります。後でありがとう。
試して
sc query state= all
サービスのリストとそれらが実行されているかどうか。
@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
私はこれを見つけました:
sc query "ServiceName" | findstr RUNNING
おおよそ正しいことをするようです。しかし、英語以外のオペレーティングシステムで動作するほど一般化されていないことが心配です。
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
Powershellを使用している場合は、リストに追加するだけです。
sc.exe query "ServiceName" | findstr RUNNING
sc
はPowershell内のSet-Contentのエイリアスであるため、以下のコマンドは機能しません。
sc query "ServiceName" | findstr RUNNING
find
もPowershellでは動作しませんが、何らかの理由で私には不明です。
sc.exe query "ServiceName" | find RUNNING
find
/findstr
ベースのAnswersを使用する場合、正規表現の使用について誰も言及していないことに気付きました。同様の名前のサービスでは問題になる可能性があります。
CDPUserSvc
とCDPUserSvc_54530
の2つのサービスがあるとします
ここまでのfind
/findstr
ベースの回答のほとんどをここで使用すると、CDPUserSvc_54530
のみが実行されている場合、CDPUserSvc
クエリに対して誤検出が発生します。 。
findstr
の/r
および/c
スイッチは、そのユースケースの処理に役立ちます。また、行の終わりを示す特殊文字$
このクエリは、CDPUserSvc
サービスの実行のみを検証し、CDPUserSvc_54530
を無視します
sc query|findstr /r /c:"CDPUserSvc$"
Cygwin Bashと一緒に使用:
sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"
(必ずsc.exe
PATHに。)