Ping错误返回始终等于0

时间:2016-06-01 20:28:11

标签: jscript hta

无法使此代码生效。我可以在vbscript中运行脚本(带有更改)并且运行正常。但我不能让这个版本返回除0以外的ping错误返回值。任何帮助都表示赞赏。

这是使用复选框扫描远程计算机列表并返回选中的值。我想在继续之前运行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` 

2 个答案:

答案 0 :(得分: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)然后设备处于联机状态。

答案 1 :(得分:0)

对于它的价值,如果langstrom的WMI解决方案有效,我想我更喜欢它。我回答的目的是帮助你弄清楚你的剧本出了什么问题。

首先,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不理解WSHSleep,因此您必须在setInterval可执行文件完成之前阻止ping创建。 (这就是为什么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');