web-dev-qa-db-ja.com

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

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

sc stop myservice
sc start myservice

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

38
Joshua

投稿者は、サービスを再起動する前に、サービスが停止していることを確認したいと考えています。 "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
47
crb

何か不足しているかもしれませんが、私はいつもこれを使用しています:

ネットストップ「myservice」
net start "myservice"

以下:

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

26
Skawt

Powershellで非常にシンプル:

PS >Restart-Service MySrvcHere

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

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

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

24
Factor Mystic

単にサービスを再起動するためのものである場合は、

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"

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

6
Peter Stuer

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

net stop Server /y
net start Server

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

5
Fedir RYKHTIK

失敗したサービスを再起動する場合は、スクリプトを実行する必要はありません。サービスで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
3
Jim B

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

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
1
Ganesh