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

问题描述 投票:0回答:4

如何检查批处理文件是否可以访问主机?问题是

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

有没有办法使用

ping
或任何其他内置 Windows 工具来完成此操作?如果可能的话,我宁愿不安装任何东西......

windows batch-file cmd network-programming ping
4个回答
8
投票

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

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
)
  • -4
    强制使用 IPv4(例如 ping
    localhost
    回复 IPv6,但没有
    TTL=
    输出)
  • | find /i "TTL="
    ,因为
    find
    命令会很好地提高
    errorlevel
  • >nul
    抑制不需要的输出

2
投票

做这样的事情:

PING 192.168.1.1 -n 1 | FIND /I "Reply from "

然后你可以检查错误级别

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

PING 192.168.1.1 -n 1 | FIND /I /V "unreachable" | FIND /I "Reply from "

1
投票

我认为tracert就是你所需要的。如果找不到主机,则将错误级别设置为1。并且应该使用与ping相同的端口。

-h 2
是为了减少等待时间,因为不需要完整的路由。

tracert -h 2 somehost.com >nul 2>nul && (
  echo reachable host
) || (
  echo unreachable host
)

编辑:要在括号中打印正确的错误级别,您需要延迟扩展。这是更高级的示例:

@echo off

setlocal enableDelayedExpansion

echo checking google.com
tracert -h 1 google.com >nul 2>nul && (
  echo reachable host
  echo !errorlevel!
  rem prevent execution of negative condition
  color 22
) || (
  echo unreachable host 
  echo !errorlevel!
)


echo checking asdasdjjakskwkdhasdasd
tracert -h 1 asdasdjjakskwkdhasdasd >nul 2>nul && (
  echo reachable host#
  echo !errorlevel!
   rem prevent execution of negative condition
   color
) || (
  echo unreachable host#
  echo !errorlevel!
)

0
投票

测试由

ERRORLEVEL
设置的
ping
是徒劳的,因为在某些情况下,即使它没有收到来自远程主机的任何有效回复,它也会将
ERRORLEVEL
设置为 0(成功)!!!

但是,下面描述的方法是可靠的、可移植的并且适用于:

  1. 翻译成所有其他语言,例如:“ms”、“TTL”、“回复”、“丢失”、“无法到达”、“已收到”等...,包括俄语和中文。
  2. Ping IPv4 地址。
  3. Ping IPv6 地址(无
    TTL
    字段)
  4. 发生错误“一般故障”的情况。
  5. Ping 一个地址,返回 “请求超时。”
  6. Ping 地址时返回 “目标主机无法访问。”
  7. Ping 可解析的字母数字主机。
  8. Ping 无法解析的字母数字主机,这会导致返回 “Ping 请求无法找到主机 UnresolvableHost...” 错误。
@echo off

for /F %%A in ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% GEQ 3 (
    echo SUCCESS.
) else (
    echo FAILURE.
)

如果将上面的代码保存到名为例如

pingtest.bat
,你可以这样使用它:

pingtest 192.168.1.1

此方法利用了字符串中存在的等号

bytes=
,这些等号不受翻译为其他语言的影响,并且不会出现在不成功的 ping/echo 结果中。

此外,将开关

-n 1
修改为例如
-n 6
允许您在变量
%res%
中获得反映连接质量的定性结果。

使用下面的代码,您可以标准化变量

%res%
中的结果,使其在失败时变为
0
...以及在成功时 - 成功 ping 的数量:

@echo off

for /F %%A in ('ping %1 -n 6 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% GEQ 3 (
    set /A "res=%res%-2"
) else (
    set "res=0"
)

echo The number of successful pings is %res%

要暂停程序直到成功 ping 通主机,只需像这样循环调用它:

@echo off

:loop
for /F %%A in ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') do (set "res=%%A")

if %res% LSS 3 goto :loop
© www.soinside.com 2019 - 2024. All rights reserved.