2016-06-01 15 views
2

Haben Probleme, diesen Code zu arbeiten. Ich kann das Skript (mit Änderungen) in VBScript ausführen und es läuft gut. Aber ich kann diese Version nicht erhalten, um einen Ping-Fehler-Rückgabewert anders als 0 zurückzugeben. Jede Hilfe wird geschätzt.Ping Fehler Rückgabe ist immer gleich 0

Dies ist eine Liste von Remote-Maschinen mit Kontrollkästchen überprüfen und die geprüften Werte zurückgeben. Ich möchte den Ping ausführen, um zu überprüfen, ob der Remote-Computer vorhanden ist, bevor Sie fortfahren. Aber mit einer Fehlerrückgabe von 0 für alle Abfragen ist es nutzlos.

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

Denken des Problem ist der Mangel an einem Wartezeit * ('-w') *. Siehe [Ping von Windows 7 bekomme keine Antwort, sondern setzt Errorlevel auf 0] (http://superuser.com/q/403905/95106) – Lankymart

+0

OP, falls eine der folgenden Antworten hilfreich war, bitte erwäge eins als akzeptiert zu markieren. [Siehe diesen Beitrag] (http://meta.stackexchange.com/q/5234/275822) für eine Erklärung, warum dies wichtig ist. Sie sollten dies tun für [alle anderen Fragen, die Sie gestellt haben] (http://stackoverflow.com/users/6411585/lightswitch?tab=questions), während Sie dabei sind. – rojo

Antwort

2

Hier ist eine Funktion, die ich zum Testen der Konnektivität verwenden. Ich benutze eine vbscript Version von diesem, aber ich schrieb es in Javascript um.

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 
     } 
    } 
} 

Verbrauch:

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

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

edit:

Wenn Sie das Timeout von dieser anpassen möchten, können Sie kann zu dieser Zeile Folgendes hinzufügen:

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

Wo 500 500 Millisekunden ist.

Hier ist mehr auf der Win32_PingStatus Klasse, wo es heißt, die Standard-Timeout ist 1000 Millisekunden.

eine andere bearbeiten Ihre ursprüngliche Frage zu beantworten:

Es ist wie Sie einige Syntax Probleme mit dem Original-Code haben aussieht:

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

Hinweis der Lage sein

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

Bedürfnisse der Raum nach a und die Anführungszeichen nach checkedValue

Auch die Logik ist rückwärts. if(status==0) dann ist das Gerät ONLINE.

+0

danke für die Hilfe, ja ich bemerkte das Problem mit den Anführungszeichen nach dem Absenden der Frage. Sobald ich diese Vermutung geändert habe, fing es an zu arbeiten ... es sind immer die Dinge, die dich ins Gesicht starren, die dich verrückt machen. :) :) und der logische Fehler, den ich hatte, weil ich es noch testete. Vielen Dank. – Lightswitch

+0

Wenn Sie nur die Konnektivität testen, sind Sie sicher, dass Sie den Schalter "-a" benötigen? – langstrom

0

Für was es wert ist, wenn Langstroms WMI-Lösung funktioniert, denke ich, dass ich es lieber über meine eigenen bevorzuge. Mein Zweck bei der Beantwortung ist, Ihnen zu helfen herauszufinden, was mit Ihrem Skript falsch gelaufen ist.

Erstens kann ping.exe Fehlerantworten vom Gateway erhalten, die sagen "keine Route zum Host" oder ähnliches. Aber nachdem die Antworten erhalten wurden (fehlerhaft oder nicht), ist der Exit-Status 0. Es ist besser, die Ausgabe des Befehls auf gültige Antworten zu überprüfen, um Erfolg/Fehlschlag zu bestimmen.

Aber das unmittelbare Problem ist, dass shellObj.run() den Ping-Prozess asking Forking ist. Es ist nicht blockierend.

Mit shellObj.exec() löst beide Probleme.Hier ist ein Beispiel unter Verwendung von Konsole 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()); 
} 

Leider, da Browser/HTA JScript nicht WSH oder Sleep nicht versteht, muss man mit setInterval kreativ zu blockieren, bis die ping ausführbaren beendet ist. (Aus diesem Grunde Langstrom WMI Lösung vorzuziehen wäre, eine ausführbare Datei zu Laichen. Den Versuch, einen nicht-blockierende Befehl in etwas zu hacken, die Blöcke mühsam und umständlich mit HTA JScript sind.)

// 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');