Тема: VBScript / WSHController : Попытка асинхронного запуска
Хотя бы попытка была полунеудачная, так и не получилось сделать задуманное асинхронно, но хотя бы поппытка была, может у кого получилось более удачно, или дальше продвинулся в этом вопросе, с удовольствием пообщаюсь, а напока выкладываю свой вариант:
Предположение было следующее, Win32_PingStatus прекрасно работает асинхронно (раньше уже выясняли), дык вот с его помощью хотелось задать начальную асинхронность процессу, и уже в его асинхронных ответах (возвращающихся понгах - событие асинхронное) запускать нужную мне процедуру (в надежде что процесс дальше будет продолжаться асинхронно - многопоточно) , но процесс выстраивается в шеренгу по одному (как в магазине занимают очередь) и вся многопоточность и асинхронность на этом заканчивается
SN="SomeScript.vbs"
arrComputers = Array("strComp02","strComp03","strComp04","strComp05","strComp06","strComp07","strComp08","strComp09","strComp10","strComp11","strComp13","strComp14","strComp15","strComp16","strComp17","strComp18","strComp19","strComp20","strComp21","strComp22","strComp23","strComp24","strComp26","strComp27","strComp29")
Set objService = GetObject("winmgmts:\\.\Root\CIMV2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_")
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("result.log", 8, True)
file.WriteLine String(28,"-") & " " & date & " " & time & String(28,"-")
bdone = False
strCount=0
For Each strComputer In arrComputers
Set objContext = CreateObject("WbemScripting.SWbemNamedValueSet")
objContext.Add "hostname", strComputer
objService.ExecQueryAsync objSink, "select * from Win32_PingStatus where address ='" & strComputer & "'", , , , objContext
Next
While Not bdone
If strCount=ubound(arrComputers)+1 Then
bdone=True
file.Close
End If
WScript.Sleep 100
Wend
Sub Sink_OnObjectReady(objWbemObject, objWbemAsyncContext)
strCount=strCount+1
Set strComputer = objWbemAsyncContext.Item("hostname")
res=""
Select Case objWbemObject.StatusCode
Case 0
res = "On"
Case Else
res = "Off"
End Select
If res="On" Then '1
Set oController = CreateObject("WSHController")
file.WriteLine strComputer & " - On"
On Error Resume Next
Set oProcess = oController.CreateScript(SN,strComputer)
oProcess.Execute
If Err.Number<>0 Then '2
file.WriteLine strComputer & " - Connection Error !!!"
Err.Clear
On Error Goto 0
Else '2 ' если нет ошибок при удалённом запуске
Do While oProcess.Status <> 2 ' ждём окончания удалённой работы скрипта
WScript.Sleep 100
Loop
Set oController = Nothing
file.WriteLine strComputer & " - Sucessfull !!!" & Now
End If '2
Else '1 ' не отвечает на пинг
file.WriteLine strComputer & " - Off"
End If '1
End Sub