从 Windows 7 执行 ping 操作没有得到回复,但将错误级别设置为 0

从 Windows 7 执行 ping 操作没有得到回复,但将错误级别设置为 0

从 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 将错误级别设置为0

答案1

我也遇到了这个问题,它解决了关键“-w 2000“. Ping 补充密钥”-w“并返回毫秒数1当本地子网中的主机无法访问时。据我所知,Windows 网络子系统返回“目标主机无法访问”之后的毫秒数必须小于超时时间。

在我的电脑(Windows 7)上:
C:>ping -w3000192.168.10.22

使用 32 字节数据对 192.168.10.22 执行 Ping 操作:
来自 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:> 回显 %错误级别%
0

C:>ping -w2999192.168.10.22

正在 Ping 192.168.10.22,数据为 32 字节:
请求超时。
请求超时。
请求超时。
请求超时。

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

C:> 回显 %错误级别%
1

答案2

这是因为目标位于您的本地子网中。如果目标位于您的本地子网之外,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

独立设施

有一个有趣的实用程序叫做。我还没有尝试过,它是 2002 年发布的,所以它甚至可能在 Windows 7 中都无法工作。但是,如果它确实有效,当目标主机无法访问时,它会将错误级别设置为 2。不过,我并不推荐这样做。

答案3

这在 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

相关内容