Grepping 批量 ping
Grepping a batch ping
寻找更好的方法来执行此操作,而不是我习惯的 "by-hand" 方法,因为这是一个我必须相当定期地经历的过程。
我要 ping 的 IP 范围从 10.0.1.15
到 10.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
(或其他)来获得更易于人类阅读的输出?有没有更好的方法,例如电源外壳?
当然可以。您可以使用 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%"
寻找更好的方法来执行此操作,而不是我习惯的 "by-hand" 方法,因为这是一个我必须相当定期地经历的过程。
我要 ping 的 IP 范围从 10.0.1.15
到 10.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
(或其他)来获得更易于人类阅读的输出?有没有更好的方法,例如电源外壳?
当然可以。您可以使用 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%"