目标主机不可访问不会导致错误级别1

时间:2019-03-18 08:49:48

标签: batch-file ping errorlevel

因此,在工作中,我们需要加载一些计算机,通常,当我通过以太网电缆将笔记本电脑连接到计算机时,我必须将IPv4地址设置为10.10.1.99,因为计算机通常具有{ {1}}作为IP地址,然后将软件加载到该计算机上。 现在有时候计算机的IP预设值有误,例如10.10.1.10110.41.246.70

因为我们没有一种简便快捷的方法来检查计算机的IP,所以我写了一些脚本,将笔记本电脑的IPv4更改为计算机通常具有的最常见IP,并让其ping这些IP: 代码看起来像这样,它检查了大约8个IP:

10.42.246.71

现在此代码通常可以正常工作,在99%的情况下,它是我们所知道的8个IP之一。 问题是有时我会收到“目标主机不可达”而不是“请求超时”,由于某种原因,这似乎不是一个错误,并且当我确实无法达到目标主机时,脚本认为它找到了正确的IP。 现在可以通过添加某种方式来解决此问题,例如:

cls
echo Searching.
netsh interface ip set address "Ethernet" static 10.10.1.99 255.255.255.0 >nul: 2>nul:
ping -w 4 -n 3 10.10.1.101
if !errorlevel!==0 (
    set activeip=10.10.1.101
    goto :ipfound
)

或者有没有办法告诉脚本目标主机不可达也是错误。

感谢所有可以提供任何帮助的人。

1 个答案:

答案 0 :(得分:0)

因为从技术上来说,Reply from xx.xx.xx.xx: Destination Host Unreachable仍然是一个答复。.:)

您可以使用findstr来操纵errorlevel

ping -w 4 -n 3 10.10.1.101 | findstr /i "TTL"
if "%errorlevel%"=="0" echo Success
if "%errorlevel%"=="0" echo Failed

请记住,此处的errorlevel是根据findstr的结果设置的(无论您的findstr字符串是否与您要求的字符串匹配)。

为了演示,这将返回errorlevel中的0,因为满足了搜索字符串:

ping -w 4 -n 3 10.10.1.101 | findstr /i "Destination Host Unreachable"
echo %errorlevel%

最后,要修改脚本以始终检查实际的reply from而不是destination host unreachable,然后移至下一个IP,直到找到活动IP,只需执行以下操作:

set "ips=10.10.1.101 10.10.1.102 10.10.1.103 10.10.1.104"
for %%i in (%ips%) do ( 
    ping -w 4 -n 3 %%i | findstr /i "TTL"

    if "!errorlevel!"=="0" (
        set "activeip=%%i"
        goto :ipfound
  )
)

您只需要在set IP的位置更改所需的IP列表即可。

此外,假设您正在使用EnableDelayedExpansion,我假设您已经在其中放置了它。