| Works
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
何の変哲もありませんが、後でお仕事で作るスクリプトに組み込みます。