2016-06-01 4 views
2

このコードが正常に機能しなくなりました。私はvbscriptで(変更あり)スクリプトを実行することができ、うまく動作します。しかし、私はこのバージョンでは0以外のpingエラーの戻り値を返すことはできません。Pingエラーの戻り値は常に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')*。 [Windows 7からのPingは返信がないが、errorlevelは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

langstromのWMIソリューションが機能するなら、私は自分自身でそれを好むと思います。答えの私の目的は、あなたのスクリプトに何がうまくいかなかったかを理解することです。

最初に、ping.exeは、ゲートウェイから「no route to host」または同様のものを示すエラー応答を受け取ることができます。しかし、応答を受け取った(間違っていてもいなくても)、終了ステータスは0です。コマンドの出力から有効な応答を確認して、成功/失敗を判断する方が良いでしょう。

しかし、より直接的な問題は、shellObj.run()がpingプロセスを非同期でフォークすることです。それはノンブロッキングです。

shellObj.exec()を使用すると、両方の問題が解決されます。ここでは、コンソールのJScriptを使用した例です:ブラウザ/ HTAのJScriptがWSHまたはSleepを理解していないので、

// 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()); 
} 

残念ながら、あなたはping実行が終了するまでブロックするためにsetIntervalと創造的な取得する必要があります。 (これはlangstromのWMIソリューションは、ブロックは、HTAの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'); 
関連する問題