URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

VBScriptでWindowsサービスの再起動

 体調崩して金曜日に休んでしまったのが週明けに響きそうで恐いです…。

 で、これも基本のおさらいですが、お仕事で使うのでサクッと作りました。
 この他にサービスでないプログラム起動とか、監視系のスクリプトも作らないといけないみたいです。

 VBSでサービスの状態確認とか起動・停止をするときは「Shell.IsServiceRunningメソッド」とか「Shell.ServiceStartメソッド」とかが使えますが、個人的にはWMIを使う方が色々と応用が利きそうなので好きです(その分ちょっと冗長になりますが)。

 とりあえず気にしたのは、サービス名を引数で与えられるようにして、状態確認・起動・停止はプロシージャにするくらい。
 カレントディレクトリとかを変えているのは個人的な好みで。

Option Explicit On Error Resume Next Dim objShell, objFS Dim strService, strState, balResult Dim intErrCode Set objShell = WScript.CreateObject("WScript.Shell") Set objFS = WScript.CreateObject("Scripting.FileSystemObject") objShell.CurrentDirectory = objFS.GetParentFolderName(WScript.ScriptFullName) & "\." '引数の判定 If WScript.Arguments.Unnamed.Count = 0 Then WScript.Quit(255) End If strService = WScript.Arguments.Unnamed(0) 'Mani Routine strState = ServiceState(strService) Select Case strState Case "Running" 'サービスが動作している場合は「再起動」 If StopService(strService) Then WScript.Sleep(1000) balResult = StartService(strService) End If Case "Stopped" 'サービスが停止している場合は「起動」 balResult = StartService(strService) Case "Empty" 'サービスが存在しない場合は終了 WScript.Quit(2) End Select If balResult = False Then WScript.Quit(1) End If WScript.Quit(0) 'Sub Routine 'サービスの状態 (Running/Stopped/Empty) Function ServiceState(ServiceName) Dim strSvc, colSvcs Set colSvcs = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='" & ServiceName & "'") If colSvcs.Count = 0 Then ServiceState = "Empty" Else For Each strSvc in colSvcs ServiceState = strSvc.State Exit For Next End If End Function 'サービスの開始 (True/False) Function StartService(ServiceName) Dim strSvc, colSvcs, RetVal Set colSvcs = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='" & ServiceName & "'") If colSvcs.Count = 0 Then StartService = False Else StartService = False For Each strSvc in colSvcs RetVal = strSvc.StartService() Select Case RetVal Case 0 'Service Started StartService = True Case 10 'Service Running StartService = True Case Else 'Other StartService = False End Select Exit For Next End If End Function 'サービスの停止 (True/False) Function StopService(ServiceName) Dim strSvc, colSvcs, RetVal Set colSvcs = GetObject("winmgmts:").ExecQuery("Select * from Win32_Service Where Name='" & ServiceName & "'") If colSvcs.Count = 0 Then StopService = False Else StopService = False For Each strSvc in colSvcs RetVal = strSvc.StopService() Select Case RetVal Case 0 'Service Stopped StopService = True Case 5 'Service Already Stopped StopService = True Case Else 'Other SoptService = False End Select Exit For Next End If End Function

 何の変哲もありませんが、後でお仕事で作るスクリプトに組み込みます。