Попробуйте так:
Код:

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 …».
Собственно, так у меня и было изначально, но затем я подумал — «А если служба вдруг будет по каким-то причинам к этому моменту остановлена? Надо сие уметь обрабатывать, и просто запускать службу!».