Тема: JScript: Асинхронный ping
Решил переложить код, на Jscript, столкнулся с трудностями.
/*
Массив адресов/имён опрашиваемых машин
В принципе, можно получать из сетевого окружения, с контроллера домена
или перебором доступных адресов подсети */
var arrComputers = ["192.168.1.43", "192.168.1.42"],
lngCount = arrComputers.length,
objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\Root\\CIMV2"),
objSWbemSink = WScript.CreateObject("WbemScripting.SWbemSink", "Sink_");
for (strComputer in arrComputers) {
/* В коллекции «objSWbemNamedValueSet» будем передавать адрес/имя хоста (замечание: в данном конкретном случае
сие, в принципе, необязательно, поскольку класс Win32_PingStatus и так содержит
свойство «.Address», но тут показана сама технология передачи данных в процедуру асинхронной обработки)*/
var objSWbemNamedValueSet = WScript.CreateObject("WbemScripting.SWbemNamedValueSet");
objSWbemNamedValueSet.Add ("HostName", strComputer);
// Все запросы будут обрабатываться в единственной процедуре обработки
objSWbemServicesEx.ExecQueryAsync (objSWbemSink, "SELECT * FROM Win32_PingStatus where Address = '" + strComputer + "'", null, null, null, objSWbemNamedValueSet);
}
// Ожидаем, пока не будут обработаны все асинхронные запросы
do {
WScript.Sleep (100);
}
while (lngCount = 0);
objSWbemSink.Cancel();
WScript.Quit();
/*=============================================================================
Процедура асинхронной обработки экземпляра объекта (замечание: в данном конкретном случае
будет возвращаться единственный объект, однако, в большинстве случаев запросы
возвращают множество объектов)*/
function Sink_OnObjectReady(objWbemObject, objWbemAsyncContext) {
strComputer = [];
strComputer = objWbemAsyncContext.Item("HostName");
if (!objWbemObject.StatusCode) {
if (!objWbemObject.StatusCode) {
WScript.Echo (strComputer + "\tOn" + "\tResponse time: " + objWbemObject.ResponseTime + " ms");
} else {
WScript.Echo (strComputer +"\tOff" + "\tStatus code: " + objWbemObject.StatusCode);
}
} else {
WScript.Echo (strComputer + "\tNot found");
}
}
/*=============================================================================
Процедура, вызываемая при завершении асинхронной обработки*/
function Sink_OnCompleted(iHResult, objWbemErrorObject, objWbemAsyncContext) {
objWbemAsyncContext.DeleteAll();
objWbemAsyncContext = "";
// Уменьшаем счётчик оставшегося числа асинхронных обработок
lngCount = lngCount--;
}Че то не фурычит. Помогите исправить пожалуйста.
И еще вопрос возник в процессе. Прототип ExecQueryAsync:
HRESULT ExecQueryAsync(
[in] const BSTR strQueryLanguage,
[in] const BSTR strQuery,
[in] long lFlags,
[in] IWbemContext *pCtx,
[in] IWbemObjectSink *pResponseHandler
);5 параметров, но в исходном примере почему то 6:
objSWbemServicesEx.ExecQueryAsync objSWbemSink, "SELECT * FROM Win32_PingStatus WHERE ADDRESS = '" & strComputer & "'", , , , objSWbemNamedValueSetЯ слепой, да?

