从Windows 7 Ping无法得到答复,但会将errorlevel设置为0


10

在Windows 7机器上,我ping关机机器的IP地址。

C:\>ping 192.168.1.222
Pinging 192.168.1.222 with 32 bytes of data:
Reply from 192.168.1.222: Destination host unreachable.
Reply from 192.168.1.222: Destination host unreachable. 
Reply from 192.168.1.222: Destination host unreachable.

Ping statistics for 192.168.1.222:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss)

即使没有答复,错误级别仍设置为0

我正在尝试做的是弄清楚远程计算机是否正在回复ping。我的测试之一是关闭机器并ping通它。由于某种原因,ping将errorlevel设置为0

Answers:


8

我也遇到了问题,并使用键“ -w 2000 ” 解决了该问题。当本地子网中的主机不可访问时,用键“ -w ”和毫秒数返回的Ping 返回1。AFAIK,在Windows的网络子系统返回“目标主机不可达”之后,毫秒数必须小于超时。

在我的PC(Windows 7)上:
C:> ping -w 3000 192.168.10.22

用32个字节的数据ping 192.168.10.22:
来自192.168.10.2的回复:无法访问目标主机。
192.168.10.2的回复:无法访问目标主机。
192.168.10.2的回复:无法访问目标主机。
192.168.10.2的回复:无法访问目标主机。

192.168.10.22的Ping统计信息:
数据包:已发送= 4,已接收= 4,丢失= 0(0%丢失),

C:>回声%errorlevel%
0

C:> ping -w 2999 192.168.10.22

用32个字节的数据ping 192.168.10.22:
请求超时。
请求超时。
请求超时。
请求超时。

192.168.10.22的Ping统计信息:
数据包:已发送= 4,已接收= 0,丢失= 4(丢失100%),

C:>回声%errorlevel%
1


谁能确认这对所有用例均有效?
user1853181 2015年

2
我测试了-w针对添加-n 1交换机的有效和无效IP将交换机设置为2999 。它似乎有效。
fyrye

是的...如果没有指定地址的主机,这将设置错误级别...谢谢
ZEE

7

这是因为目标位于您的本地子网中。如果目标在本地子网之外,则Request timed out.可以看到预期的结果。但是,即使您本地子网中不存在的目的地也会报告Reply from x.x.x.x: Destination host unreachable.。就像这个漩涡贴所解释的,这全都取决于它的第一跳是否超时-ping您的本地子网仅仅是一个跳。显然,这是设计使错误级别设置为接收到任何答复0时的计数,并计为答复。host unreachable


解决方法

解析ping输出findstr

资料来源:http : //forums.techguy.org/7318331-post3.html

以下将对其执行一次ping操作(ping -n 1)。的%1是传递给批处理文件中的第一个参数。attrib根据目标是否答复来设置变量。

echo Scanning %1
set attrib=responding
ping -n 1 %1|Findstr /I /C:"timed out" /C:"host unreachable" /C:"could not find host"
if %errorlevel%==0 set attrib=nonresponsive

单独的实用程序

有一个有趣的实用程序alive。我没有尝试过,它于2002年发布,因此它甚至可能无法在Windows 7中运行。但是,如果它可以运行,它将在目标主机不可访问时将错误级别设置为2。不过,我真的不推荐这样做。


+1 for alive,也正是因为这个原因,在多年前就使用了。
Bryan

如果响应为“ Ping请求找不到主机madeup04。请检查名称,然后重试”,则此操作不起作用,因为它正在查找“主机不可达”,因此您的结果是“ madeup04正在响应”,这是错误的。
James Jenkins

1
@JamesJenkins我确实假设,就像在问题中那样,ping尝试是针对IP地址的。即使这样,这也是微不足道的更改(添加另一个/C搜索字符串)。几乎不值得一票。照原样,我已经修改了答案,非常感谢您指出这一点。
鲍勃

唉......嗯,这是愚蠢的......花了半个多我一天想为什么我的系统是报告的一个子系统,以找出在线-虽然它显然不是...
马特·克拉克

2

这在Windows 7上对我有效:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f %%i in (PCS.TXT) do (
   SET bHOSTUP=0
   ping -n 2 %%i |find "TTL=" && SET bHOSTUP=1
   IF !bHOSTUP! equ 1 (
      CALL :HOSTUP %%i
   ) else (
      CALL :HOSTDOWN %%i 
   )
)

:HOSTUP
echo Host UP %1
GOTO EOF

:HOSTDOWN
echo Host DOWN %1
GOTO EOF

:EOF
exit /B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.