打击批量ping

时间:2015-01-05 20:05:39

标签: batch-file cmd grep ping findstr

寻找一种更好的方法来实现这一目标,而不是我习惯的“手工”方法,因为这是一个我必须定期进行的过程。

我有一系列要ping的IP,从10.0.1.1510.0.50.15。第三个八位字节指的是物理位置,最后一个八位字节指的是该位置的设备。我需要查看哪些位置没有将该设备连接到网络。

我目前的解决方案是:

FOR /L %i IN (1,1,50) DO ping -n 1 10.0.%i.15 >> C:\path\to\output\file.txt

这给我输出

Pinging 10.0.1.15 with 32 bytes of data:
Reply from 10.0.1.15: bytes=32 time=68ms TTL=255

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

Pinging 10.0.2.15 with 32 bytes of data:
Request timed out.

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

我更喜欢输出更像:

2
...

但老实说,任何人类可读的东西都很好 - 这不是在任何地方用管道输送。

在这种情况下,位置1具有设备,但位置2不存在。

目前,我这样做的最佳解决方案是手动查看该文件并跟踪。我可以用Python一起破解一些东西,但听起来比它的价值更麻烦。我知道grep有能力显示上下文,但我在Windows上除了基本的NT CLI工具之外无法访问任何内容。

是否有某种方法可以利用findstr(或等)来获得更易于人类阅读的输出?是否有一些更好的方法,例如的powershell?

1 个答案:

答案 0 :(得分:2)

不确定。如果您愿意,可以使用find(或findstr来测试是否存在“TTL” “TTL =”(编辑:请参阅MC ND的评论如下)并使用生成的ERRORLEVEL来确定成功与否。

@echo off
setlocal

for /L %%I in (1,1,50) do (
    ping -n 1 10.0.%%I.15 | find /i "TTL=" >NUL && (
        echo 10.0.%%I.15: Online
    ) || (
        echo 10.0.%%I.15: OFFLINE
    )
)

See this page了解有关条件执行的更多信息(&&||内容)。 find成功时将ERRORLEVEL设置为0,或者失败时设置为1。如果您希望将结果记录到txt文件而不是控制台,只需将整个内容包装在另一个括号内的代码块中,如下所示:

@echo off
setlocal

set "logfile=C:\path\to\output\file.txt"

>> "%logfile%" (
    for /L %%I in (1,1,50) do (
        ping -n 1 10.0.%%I.15 | find /i "TTL=" >NUL && (
            echo 10.0.%%I.15: Online
        ) || (
            echo 10.0.%%I.15: OFFLINE
        )
    )
)

type "%logfile%"