无法使此代码生效。我可以在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`
答案 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不理解WSH
或Sleep
,因此您必须在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');