2016-06-01 3 views
2

Не удается заставить этот код работать. Я могу запустить скрипт (с изменениями) в vbscript, и он работает нормально. Но я не могу получить эту версию, чтобы вернуть значение возврата ошибки ping, отличное от 0. Любая оценка приветствуется.Ping error return всегда равен 0

Это сканирование списка удаленных машин с флажками и возврат проверенных значений. Я хочу запустить ping, чтобы проверить, что удаленная машина там, прежде чем продолжить. Но с ошибкой возврат 0 для всех запросов бесполезен.

function statuschk3(){ 
var checkedValue = null; 
var inputElements = document.getElementsByName("comp"); 
for(var i=0; inputElements[i]; ++i){ 
    if(inputElements[i].checked) 
    {checkedValue = inputElements[i].value; 
var WshShell = new ActiveXObject("WScript.Shell"); 
var status = WshShell.run ("ping -n 1 -a" + checkedValue + ",0 ,true"); 
    if(status == 0) 
    { var fso = new ActiveXObject("Scripting.FileSystemObject"); 
     var s = fso.OpenTextFile("C:/script/testfile1.txt", 8, true); 
     s.WriteLine(checkedValue + " is turned off or off the domain"); 
     s.Close(); 
    } 
    else` 
+0

Подумайте проблемой является отсутствием время ожидания * ('-w') *. См. [Ping из окна 7 не получает ответа, но устанавливает уровень ошибок 0) (http://superuser.com/q/403905/95106) – Lankymart

+0

OP, если какой-либо из приведенных ниже ответов был полезен, подумайте о том, чтобы отметить его как принятый. [См. Это сообщение] (http://meta.stackexchange.com/q/5234/275822) для объяснения, почему это важно. Вы должны сделать это для [всех других вопросов, которые вы задали] (http://stackoverflow.com/users/6411585/lightswitch?tab=questions), пока вы на нем. – rojo

ответ

2

Вот функция, которую я использую для проверки возможности подключения. Я использую версию vbscript этого, но я переписал его в javascript.

function Reachable(strComputer) 
{ 
    var wmiQuery = "Select * From Win32_PingStatus Where Address = '" + strComputer + "'"; 
    var objWMIService = GetObject("winmgmts://./root/cimv2"); 
    var colItems = objWMIService.ExecQuery(wmiQuery); 
    var enumItems = new Enumerator(colItems) 
    for (; !enumItems.atEnd(); enumItems.moveNext()) 
    { 
     var objStatus = enumItems.item(); 
     if ((objStatus.StatusCode == null) || (objStatus.Statuscode != 0)) 
     { 
      return false //if computer is unreachable, return false 
     } 
     else 
     { 
      return true //'if computer is reachable, return true 
     } 
    } 
} 

Использование:

VBScript:
If Reachable(strComputer) Then MsgBox "Online" Else MsgBox "Offline"

JavaScript:
if (Reachable(strComputer)) { alert("Online") } else { alert("Offline") }

редактировать:

Если вы хотите, чтобы настроить время ожидания этого, вы может добавить в эту строку следующее:

var wmiQuery = "Select * From Win32_PingStatus Where Address = '" + strComputer + "' and Timeout=500"; 

Где 500 - 500 миллисекунд.

Подробнее о классе Win32_PingStatus, где указано, что время ожидания по умолчанию составляет 1000 миллисекунд.

другой редактировать обратиться исходный вопрос:

Похоже, у вас есть некоторые проблемы синтаксиса с использованием исходного кода:

var status = WshShell.run ("ping -n 1 -a" + checkedValue + ",0 ,true"); 

должен быть

var status = WshShell.run ("ping -n 1 -a " + checkedValue, 0,true); 

Обратите внимание на расположение после a и с кавычками после checkedValue

Кроме того, логика обратная. if(status==0) затем устройство ONLINE.

+0

спасибо за помощь, да, я заметил проблему с кавычками после отправки вопроса. Как только я изменил это предположение, он начал работать ... это всегда то, что смотрит в лицо, что сводит вас с ума. :) :) и логическая ошибка, которую я имел, потому что я все еще ее тестировал. Благодарю. – Lightswitch

+0

Если вы просто проверяете подключение, уверены ли вы, что вам нужен переключатель '-a'? – langstrom

0

Для чего стоит, если решение WMI langstrom работает, я думаю, что предпочитаю его самостоятельно. Моя цель в ответе - помочь вам разобраться, что пошло не так с вашим скриптом.

Во-первых, ping.exe может принимать ответы об ошибках от шлюза, говоря «нет маршрута к хосту» или аналогичного. Но получив ответы (ошибочные или нет), статус выхода равен 0. Лучше проверить вывод команды для действительных ответов, чтобы определить успех/сбой.

Но более непосредственная проблема заключается в том, что shellObj.run() асинхронно разворачивает процесс ping. Это неблокирование.

Использование shellObj.exec() решает обе проблемы.Вот пример использования консоли JScript:

// returns 0 for success, non-zero for fail 
function ping(host) { 

    var osh = WSH.CreateObject('Wscript.Shell'), 
     proc = osh.exec('ping -n 1 ' + host); 

    while (!proc.Status) WSH.Sleep(25); 
    return !/\btime\b/i.test(proc.StdOut.ReadAll()); 
} 

К сожалению, так как браузер/HTA JScript не понимает WSH или Sleep, вы должны получить творческую с setInterval блокировать до тех пор, ping исполняемым не будет закончена. (Вот почему решение WMI Лангстра был бы предпочтительнее, чтобы нерест исполняемого файла. Попытка взломать нелипкую команду в то, что блоки громоздки и неудобно с ОМТОМ JScript.)

// alerts true on success, false on fail 
function ping(host) { 

    var osh = new ActiveXObject('Wscript.Shell'), 
     proc = osh.exec('ping -n 1 ' + host), 
     waitForExit = setInterval(function() { 
      if (proc.Status) { 
       clearInterval(waitForExit); 
       alert(/\btime\b/i.test(proc.StdOut.ReadAll())); 
      } 
     }, 25); 
} 

ping('localhost'); 
Смежные вопросы