批量检查可到达的机器

时间:2015-04-29 06:00:27

标签: batch-file ping errorlevel

我在这个论坛中使用了几个不成功的脚本。 脚本如下:

@echo off
for /f %%i in (computersTest.txt) do (
        ping -n 1 %%i | find "TTL" >nul 2>nul
    Echo %errorlevel%
)

无论主机是否可达,Errorlevel始终为0。如果我删除> nul以查看输出,我会得到以下内容

Reply from 10.6.4.20: bytes=32 time<1ms TTL=64
0
0
Reply from 10.6.5.58: bytes=32 time<1ms TTL=126
0

列表中的第二个主机无法访问但errolevel为0

如果我在命令提示符下执行

ping -n 1 XXXXXXXXX | find "TTL" >NUL 2>NUL

echo %errorlevel%

给出1

我不知道自己做错了什么

TIA Ramon的

1 个答案:

答案 0 :(得分:2)

首先解析批处理行或行块(括在括号中的行)然后执行。在解析阶段,对变量的所有读取操作都将从代码中删除,替换为变量中的值开始执行行/块之前。因此,如果在行/块内更改变量,则无法从同一行/块内检索此新值,因为没有读取操作来检索新值。

您可以使用延迟扩展并将%var%中的语法更改为!var!来解决它,以向解析器指示必须延迟读取操作直到命令执行

在你的情况下

@echo off
setlocal enabledelayedexpansion
for /f %%i in (computersTest.txt) do (
    ping -n 1 %%i | find "TTL=" >nul 2>nul
    Echo %%i - !errorlevel!
)

note :ipv4中对响应的正确测试是搜索TTL=,因为如果TTL过期错误,您可能会出现误报。

但是在检查errorlevel变量的情况下,还有更多选择(如果它们适用)。

对于任何等于或大于if errorlevel n

的错误级别,您可以使用其中评估条件为true的原生n
@echo off
for /f %%i in (computersTest.txt) do (
    ping -n 1 %%i | find "TTL=" >nul 2>nul
    if errorlevel 1 ( echo %%i offline ) else ( echo %%i online )
)

或者您可以使用条件执行。运算符&&||将允许包含执行的内容,具体取决于上一个命令的错误级别(未设置或设置)

@echo off
for /f %%i in (computersTest.txt) do (
    ( ping -n 1 %%i | find "TTL=" >nul 2>nul ) && echo %%i online || echo %%i offline
)