「net stop thingie」と「net start thingie」を使用してサービスを再起動するバッチスクリプトの最後に、サービスのステータスを知る必要があります。
一番好きな理想の世界では、状態を自分にメールで送信し、寒い冬の夜に読んで、正しく動作していることがわかっているサーバーの暖かさと快適さで安心します。
ご存知のように、私はWindows Server 2003プラットフォームを使用しており、バッチファイルが最良の選択であると思われました。私は他のものを使うことを気にせず、提案に非常に開かれていますが、知識のためだけに(ゾンビが脳を渇望するので、私は自分自身を膨らませてはいけないと思いました)、チェックすることができるコマンドがありますコマンドラインで、サービスのステータスに?
コマンドの出力をファイルにリダイレクトするだけですか?
私のズボンは一体どこにあるの? (ゴーシュ、これに挿入されたユーモアが誰をもin辱しないことを本当に願っています。それは水曜日の朝であり、ユーモアも必要です:P)
[編集:]私が使用した解決策は(もはや)--link redacted--からダウンロードできます。
これは、夜間に実行されるタスクセットとして使用され、午前中に電子メールをチェックすると、サービスが正常に再起動したかどうかがわかります。
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
必要な特定のサービスに対して上記を簡単にフィルタリングできます。
やってみました 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重にすることに注意してください。
サービスでnet start "service name"
を呼び出すことができます。開始されていない場合は開始してerrorlevel = 0を返し、既に開始されている場合はerrorlevel = 2を返します。
階層も見てください:
ネットスタート| FIND "サービス名"> nul IF errorlevel 1 ECHOサービスが実行されていません
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 ****を特定のサービス名に置き換えることができます。
私の意図は、サービスのオンとオフを切り替えるスクリプトを作成することでした(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セント、これが役立つことを願って
よく私はこれを言っている「ニック・カバディアス」を見ます:
「これによると http://www.computerhope.com/nethlp.htm NET START/LIST ...でなければなりません」
Windows XPこれを入力すると:
NET START /LIST
エラーが発生し、代わりに入力するだけです
NET START
/ LISTはWindows 2000専用です...このようなWebを完全に読んだ場合、/ LISTはWindows 2000セクションのみにあることがわかります。
お役に立てれば!!!
たぶん、これはサービスを開始して結果を確認する最良の方法かもしれません
もちろん、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
これが役立つことを願っています!!それは私が通常使用するものです。
その結果をバッチファイルから電子メールで送信できるかどうかはわかりません。問題の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が何を意味するのかわかりませんが、それらが停止/開始していることは間違いありません。
私が投稿した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
もちろん、実行中のサービスのみを一覧表示します。実行中のサービスを一覧表示できない方法はわかりません...
お役に立てれば!!!
これによると http://www.computerhope.com/nethlp.htm NET START/LISTになっているはずですが、XP = box。リストを提供するWMIがあると確信しています。