スクリプトからWindowsサービスを再起動するにはどうすればよいですか?


38

次のようなバッチスクリプトがあります。

sc stop myservice
sc start myservice

scはサービスが停止するまで待機しないため、エラーになります。スクリプトを使用してサービスを再起動するにはどうすればよいですか?


何についての
pQd 2009年

回答:


47

投稿者は、サービスを再起動する前にサービスが停止していることを確認したいと考えています。「sc query」の出力でループを使用すると、次のようなことができます。

:stop
sc stop myservice

rem cause a ~10 second sleep before checking the service state
ping 127.0.0.1 -n 10 -w 1000 > nul

sc query myservice | find /I "STATE" | find "STOPPED"
if errorlevel 1 goto :stop
goto :start

:start
net start | find /i "My Service">nul && goto :start
sc start myservice

8
時間遅延としてのpingの素晴らしい使用。
デヴィッド・ゆう

おかげで、バッチではスリープ状態にならないので、待つことができます:)
crb 2009年

4
+1、およびGOTOバッジ。まっすぐな顔でGOTOステートメントを使用している人に授与されます。
ジョセフカーン

バッチのみがdo / whileループをサポートしている場合...それは本当にC#では簡単です!
crb 09年

3
Windows Server 2008では、エラーレベルは見つかった場合は0、見つからない場合は1です。それで、私は論理を逆にしなければならなかった、そしてそれは働いた。
カークウォル

26

何かが欠けているかもしれませんが、私はこれを常に使用しています:

net stop "myservice"
net start "myservice"

以下:

net stop "myservice" && net start "myservice"


24

Powershellで非常にシンプル:

PS >Restart-Service MySrvcHere

さらに良いことに、表示名を使用します。

PS >Restart-Service -displayname "My Service Name Here"

Get-Help Restart-Service 多くのための


6

サービスを再起動するだけの場合は、次を使用できます。

Net stop myservice
Net start myservice

ただし、scのオプションにアクセスする場合は、start / waitコマンドを使用できます

start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"

この手法は、任意のコマンドに適用できるより一般的なソリューションです。


sc stop myservice停止コマンドを送信し、サービスが停止する前に戻ります。start / bを指定してscを呼び出しても役に立ちません。
ユルゲンスタインブロック

5

確認の停止を要求するサービス(たとえば、サーバーサービスとして)を静かに再起動するには、停止コマンドの最後に/ yを追加します。

net stop Server /y
net start Server

自動スクリプト実行に役立ちます。


3

失敗したサービスを再起動する場合は、スクリプトを実行する必要はありません。サービスMMCスナップインで、サービスを右クリックし、プロパティを選択して、回復タブをクリックします。ここでは、サービスが停止した場合に実行するアクションを設定できます。多くの柔軟性があります。サービスを停止する場合はスクリプトが必要になります。何かをしてからスクリプトを開始し、バッチファイルの前net stop "myserviceshortname"net start "myserviceshortname"

vbsciptでは、サービスとその依存関係を停止するためのもう少しのコードがあります。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For each objService in colServiceList
    objService.StopService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery _
        ("Select * from Win32_Service where Name='myservice'")
For each objService in colServiceList
    errReturn = objService.StopService()
Next

ここでは、サービスとそれが依存するものを開始します(これはおなじみのはずです)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name='Myservice'")
For each objService in colServiceList
    errReturn = objService.StartService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery("Associators of " _
   & "{Win32_Service.Name='myservice'} Where " _
        & "AssocClass=Win32_DependentService " & "Role=Dependent" )
For each objService in colServiceList
    objService.StartService()
Next

1

次のコマンドを使用できます。

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.