在 Windows 命令行上检查主机可达性

bur*_*tek 3 windows cmd network-programming ping batch-file

如果主机可访问,我如何检查批处理文件?问题是ping不仅在成功时返回 0,而且在Destination host unreachable错误时返回 0 :

C:\>ping 192.168.1.1 -n 1

Pinging 192.168.1.1 with 32 bytes of data:
Reply from 192.168.1.1: bytes=32 time=3ms TTL=64

Ping statistics for 192.168.1.1:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 3ms, Maximum = 3ms, Average = 3ms

C:\>echo %errorlevel%
0

C:\>ping 192.168.1.105 -n 1

Pinging 192.168.1.105 with 32 bytes of data:
Reply from 192.168.1.102: Destination host unreachable.

Ping statistics for 192.168.1.105:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),

C:\>echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)

有什么办法可以用ping或任何其他内置的 Windows 工具来做到这一点?如果可能的话,我宁愿不安装任何东西......

Jos*_*efZ 6

下一个代码片段应该可以工作:

set "_ip=localhost"
set "_ip=192.168.1.1"
ping %_ip% -n 1 -4 | find /i "TTL=">nul
if errorlevel 1 (
    echo ping %_ip% failure
) else ( 
    echo ping %_ip% success
)
Run Code Online (Sandbox Code Playgroud)
  • -4强制使用 IPv4(例如 pinglocalhost回复 IPv6 没有TTL=输出)
  • | find /i "TTL="find命令提高errorlevel以及
  • >nul 抑制不需要的输出


RGu*_*erg 2

做这样的事情:

PING 192.168.1.1 -n 1 | FIND /I "Reply from "
Run Code Online (Sandbox Code Playgroud)

然后你可以检查错误级别

编辑:为了适应“目标主机无法访问错误,您可以这样做:

PING 192.168.1.1 -n 1 | FIND /I /V "unreachable" | FIND /I "Reply from "
Run Code Online (Sandbox Code Playgroud)

  • 哈哈 - 有效。虽然我也更喜欢`TTL=`方法。(它更短并且与语言无关) (2认同)