web-dev-qa-db-ja.com

サービスステータスを取得するWindowsコマンド?

「net stop thingie」と「net start thingie」を使用してサービスを再起動するバッチスクリプトの最後に、サービスのステータスを知る必要があります。

一番好きな理想の世界では、状態を自分にメールで送信し、寒い冬の夜に読んで、正しく動作していることがわかっているサーバーの暖かさと快適さで安心します。

ご存知のように、私はWindows Server 2003プラットフォームを使用しており、バッチファイルが最良の選択であると思われました。私は他のものを使うことを気にせず、提案に非常に開かれていますが、知識のためだけに(ゾンビが脳を渇望するので、私は自分自身を膨らませてはいけないと思いました)、チェックすることができるコマンドがありますコマンドラインで、サービスのステータスに?

コマンドの出力をファイルにリダイレクトするだけですか?

私のズボンは一体どこにあるの? (ゴーシュ、これに挿入されたユーモアが誰をもin辱しないことを本当に願っています。それは水曜日の朝であり、ユーモアも必要です:P)

[編集:]私が使用した解決策は(もはや)--link redacted--からダウンロードできます。

これは、夜間に実行されるタスクセットとして使用され、午前中に電子メールをチェックすると、サービスが正常に再起動したかどうかがわかります。

21

Windowsスクリプトの使用:

Set ComputerObj = GetObject("WinNT://MYCOMPUTER")    
ComputerObj.Filter = Array("Service")    
For Each Service in ComputerObj    
    WScript.Echo "Service display name = " & Service.DisplayName    
    WScript.Echo "Service account name = " & Service.ServiceAccountName    
    WScript.Echo "Service executable   = " & Service.Path    
    WScript.Echo "Current status       = " & Service.Status    
Next

必要な特定のサービスに対して上記を簡単にフィルタリングできます。

5
MaSuGaNa

やってみました sc.exe

C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4  RUNNING

C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1  STOPPED

バッチファイル内では、各パーセント記号を2重にすることに注意してください。

26
Rômulo Ceccon

サービスでnet start "service name"を呼び出すことができます。開始されていない場合は開始してerrorlevel = 0を返し、既に開始されている場合はerrorlevel = 2を返します。

19
JRL

pstools -特に psservice および "query"を使用-例:

psservice query "serviceName"
12
Marc Gravell

階層も見てください:

ネットスタート| FIND "サービス名"> nul IF errorlevel 1 ECHOサービスが実行されていません

コピー元: http://ss64.com/nt/sc.html

10
Ros

PowerShellを使用できる場合...

Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}

あげます...

Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov

1つのサービスのみをチェックする必要がある場合は、**** Network ****を特定のサービス名に置き換えることができます。

9
aphoria

私の意図は、サービスのオンとオフを切り替えるスクリプトを作成することでした(1つのスクリプトで)

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

...

たくさん助けました!! TYVM z666

しかし、例えばサービスが無効になっている(またerrorlevel = 2?)「AlreadyRuning」になり、

if errorlevel 1 goto Error  ?!!

その場合の出力が必要でした...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

私の2セント、これが役立つことを願って

2
xy77

よく私はこれを言っている「ニック・カバディアス」を見ます:

「これによると http://www.computerhope.com/nethlp.htm NET START/LIST ...でなければなりません」

Windows XPこれを入力すると:

NET START /LIST

エラーが発生し、代わりに入力するだけです

NET START

/ LISTはWindows 2000専用です...このようなWebを完全に読んだ場合、/ LISTはWindows 2000セクションのみにあることがわかります。

お役に立てれば!!!

2
z666zz666z

たぶん、これはサービスを開始して結果を確認する最良の方法かもしれません

もちろん、File.BATのようなバッチ内からこの例のようなものを置きますが、「NameOfSercive」を必要なサービス名に置き換え、REM行を独自のコードに置き換えます。

@ECHO OFF

REM Put whatever your Batch may do before trying to start the service

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

REM Put Whatever you want in case Service was not running and start correctly

GOTO ContinueWithBatch

:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch

:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch

:ContinueWithBatch

REM Put whatever else your Batch may do

別のことは、それを変更せずに状態をチェックすることです。そのためには、もっと簡単な方法があり、実行するだけです:

net start

そのため、パラメータなしでは、開始されたすべてのサービスのリストが表示されます...

したがって、単純なgrepまたはパイプ上のそれを見つけると収まるでしょう...

もちろん、File.BATのようなバッチ内からこの例のようなものを置きますが、「NameOfSercive」を必要なサービス名に置き換え、REM行を独自のコードに置き換えます。

@ECHO OFF

REM Put here any code to be run before check for Service

SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning

REM Put here any code to be run if Service Is Running

GOTO ContinueWithBatch

:ServiceIsNotRunning

REM Put here any code to be run if Service Is Not Running

GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=

REM Put here any code to be run after check for Service

これが役立つことを願っています!!それは私が通常使用するものです。

2
z666zz666z

その結果をバッチファイルから電子メールで送信できるかどうかはわかりません。問題のvbscriptを解決する別の提案をする場合。私はvbscriptにはあまり適していませんが、ローカルマシンで実行されているサービスを照会するためにそれを使用できます。以下のスクリプトは、スクリプトが実行されるマシンで実行されているすべてのサービスのステータスをメールで送信します。あなたは明らかにSMTPサーバーと電子メールアドレスを置き換えることになるでしょう。ドメインの一部であり、このスクリプトを特権ユーザーとして実行する場合(リモートマシンの管理者である必要があります)、localhostをfqdnに置き換えることにより、リモートマシンもクエリできます。

Dim objComputer, objMessage
Dim strEmail

' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next

' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "[email protected]"
objMessage.To = "[email protected]"
objMessage.Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"

'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpserverport") = 25

Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")

For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next

objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send

これがあなたを助けることを願っています!楽しい!

編集:ああ、もう1つ4のサービスステータスはサービスが実行されていることを意味し、1のサービスステータスはそうではないことを意味します。 2または3が何を意味するのかわかりませんが、それらが停止/開始していることは間違いありません。

1
Sam Stelfox

私が投稿したRos the codeは、実行されているサービスの数を知るためのものでもあります...

Oracle *のようなサービスの数を知りたい場合、NameOfSercive ...の代わりにOracleを配置し、変数%CountLines%で実行されているOracle *のようなサービスの数を取得します。 4次のようなことができます:

IF 4 ==%CountLines%GOTO FourServicesAreRunning

それははるかに強力です...そして、あなたのコードは、目的のサービスが実行されているかどうかを知らせません...同じ名前で始まる別のsreciveがある場合...想像してください:-ServiceOne -ServiceOnePersonal

ServiceOneを検索しても、ServiceOnePersonalのみを実行している場合、コードからServiceOneが実行されていることがわかります...

私のコードは簡単に変更できます。ファイルのすべての行を読み取り、行ごとに読み取るため、各サービスに必要なことを何でも行うことができます...これを参照してください:

@ECHO OFF
REM Put here any code to be run before check for Services

SET TemporalFile=TemporalFile.TXT
NET START > %TemporalFile%
SET CountLines=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
SETLOCAL EnableDelayedExpansion
SET CountLine=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO @(
 SET /A CountLine=1+CountLine

 REM Do whatever you want to each line here, remember first and last are special not service names

 IF 1==!CountLine! (

   REM Do whatever you want with special first line, not a service.

 ) ELSE IF %CountLines%==!CountLine! (

   REM Do whatever you want with special last line, not a service.

 ) ELSE (

   REM Do whatever you want with rest lines, for each service.
   REM    For example echo its position number and name:

   echo !CountLine! - %%X

   REM    Or filter by exact name (do not forget to not remove the three spaces at begining):
   IF "   NameOfService"=="%%X" (

     REM Do whatever you want with Service filtered.

   )
 )

 REM Do whatever more you want to all lines here, remember two first are special as last one

)

DEL -P %TemporalFile% 2>nul
SET TemporalFile=

REM Put here any code to be run after check for Services

もちろん、実行中のサービスのみを一覧表示します。実行中のサービスを一覧表示できない方法はわかりません...

お役に立てれば!!!

0
z666zz666z

これによると http://www.computerhope.com/nethlp.htm NET START/LISTになっているはずですが、XP = box。リストを提供するWMIがあると確信しています。

0
Nick Kavadias