Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Попробуйте так:
Код: Выделить весь код
Option Explicit

Dim strProcessName
Dim strServiceNamePrimary
Dim strServiceNameSecondary

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemEventSource

Dim objSWbemObjectEx_ServicePrimary
Dim objSWbemObjectEx_ServiceSecondary

Dim collSWbemObjectSet


strProcessName          = "base.exe"                           ' "notepad.exe"
strServiceNamePrimary   = "Pervasive.SQL 2000 (transactional)" ' "aspnet_state"
strServiceNameSecondary = "Pervasive.SQL 2000 (relational)"    ' "SwPrv"


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_Service WHERE Name = '" & strServiceNamePrimary & "'")

If collSWbemObjectSet.Count = 1 Then
	Set objSWbemObjectEx_ServicePrimary   = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNamePrimary   & "'")
	Set objSWbemObjectEx_ServiceSecondary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNameSecondary & "'")
	
	WScript.StdOut.Write "Скрипт ожидает выполнения условий для начала работы..."
	
	Do
		objSWbemObjectEx_ServicePrimary.Refresh_
		objSWbemObjectEx_ServiceSecondary.Refresh_
		
		Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT Name FROM Win32_Process WHERE Name = '" & strProcessName & "'")
		
		If objSWbemObjectEx_ServicePrimary.Started And _
			objSWbemObjectEx_ServiceSecondary.Started And _
			collSWbemObjectSet.Count > 0 Then
			
			WScript.StdOut.WriteLine " Условия выполнены"
			
			Exit Do
		Else
			WScript.Sleep 100
		End If
	Loop
	
	WScript.StdOut.WriteLine "Скрипт работает"
	
	Set objSWbemObjectEx_ServicePrimary   = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNamePrimary   & "'")
	Set objSWbemObjectEx_ServiceSecondary = objSWbemServicesEx.Get("Win32_Service.Name='" & strServiceNameSecondary & "'")
	
	Set objSWbemEventSource = objSWbemServicesEx.ExecNotificationQuery( _
		"SELECT * FROM __InstanceDeletionEvent " & _
		"WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND " & _
		"TargetInstance.Name = '" & strProcessName & "'")
	
	Do
		With objSWbemEventSource.NextEvent.TargetInstance
			WScript.StdOut.WriteLine "Процесс [" & .Name & "] (PID: " & CStr(.ProcessID) & ") был остановлен"
		End With
		
		With objSWbemObjectEx_ServicePrimary
			WScript.StdOut.WriteLine "Служба [" & .Name & "] (PID: " & CStr(.ProcessId) & ")"
			
			.Refresh_
			
			If .Started Then
				WScript.StdOut.Write "  Служба останавливается"
				
				If .StopService() = 0 Then
					Do
						WScript.Sleep 100
						WScript.StdOut.Write "."
						
						.Refresh_
					Loop While .Started
					
					WScript.StdOut.WriteLine
				Else
					WScript.StdOut.WriteLine "Невозможно остановить службу"
				End If
				
				WScript.StdOut.Write "  Служба запускается"
				
				If .StartService() = 0 Then
					Do
						WScript.Sleep 100
						WScript.StdOut.Write "."
						
						.Refresh_
					Loop Until .Started
					
					WScript.StdOut.WriteLine
				Else
					WScript.StdOut.WriteLine "Невозможно запустить службу"
				End If
			Else
				' Nothing to do
			End If
		End With
	Loop
Else
	WScript.StdOut.WriteLine "Служба [" & strServiceNamePrimary & "] не установлена"
End If

WScript.Quit 0
Я просто передвинул запуск службы внутрь условия «If .Started …». Собственно, так у меня и было изначально, но затем я подумал — «А если служба вдруг будет по каким-то причинам к этому моменту остановлена? Надо сие уметь обрабатывать, и просто запускать службу!».
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:06, 31-10-2011 | #20