如果表达式基于Pings TTL值?

时间:2014-03-07 17:35:41

标签: batch-file

我一直在创建一些批处理工具来协助Ping少数几台机器。我一直在调用if表达式中的%errorlevel%以检查有效连接。但最近我注意到了这个问题。有时机器会回复,但实际上无法发回数据包。这将被视为无效连接,但%errorlevel%仍然产生0.

我的问题是,有没有办法从ping调用TTL值或时间值?而不是使用%errorlevel%?我想我在这里错过了一个API ....

1 个答案:

答案 0 :(得分:1)

在Windows中,如果任何发送的数据包丢失,ping命令会设置errorlevel。如果收到某些数据包而其他数据包丢失,则设置errorlevel。但是,在ipv4中,ping同一子网中的非活动计算机,您可以获得“无法访问”消息,并且不会丢失数据包。因此,在ipv4中,最好的选择是检查ping命令输出中是否存在“TTL =”文本。最好包括等号以避免TTL过期消息。

在ipv6中,ping命令的输出不包含“TTL =”信息。它还会在数据包丢失的情况下设置errorlevel,但是,对于同一子网中的地址,如果计算机不活动,则所有数据包都将丢失。

因此,ping检查的“最佳”策略是:如果地址是ipv6,请检查errorlevel。如果地址是ipv4,检查是否存在“TTL =”。 find命令是执行此操作的常用工具,因为如果找不到指示的文本,它会设置errorlevel变量。像

这样的东西
ping -4 xxx.xxx.xxx.xxx | find "TTL=" >nul 
if errorlevel 1 (
    echo not alive
) else (
    echo alive
)