批处理文件-循环ping-输出上线的主机到文件

4
我想要创建一个.bat文件,可以像下面一样实现for循环:
@echo off
FOR /L %%G IN (1, 1, 69) DO (
    ping -n 1 192.168.%%G.3 
    ping -n 1 192.168.%%G.4
)

那么,请查看输出并将仅成功回复ping的IP发送到txt文件中。使用CMD批处理文件是否可行?

2个回答

6
@ECHO OFF
SET output=%USERPROFILE%\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /L %%G IN (1, 1, 69) DO (
    CALL :ping 192.168.%%G.3
    CALL :ping 192.168.%%G.4
)
GOTO :EOF

:ping
ping -n 1 %1 >NUL && ECHO %1>>"%output%"

基本上,你可以使用 && 来添加一条命令,只有在前一个命令(&& 前面的那个命令)成功完成(技术上说,返回退出代码 0)时才会执行。

对于相反情况也有类似的方法。如果你想对一个命令的失败结果执行某些操作,可以在它后面加上 ||,然后是实现你的操作的命令。

编辑

关于 ping 的一点说明。有时你会收到路由器的通知,主机无法访问。在这种情况下,ping 仍然以 0 代码(“成功”)退出,因为它确实收到了回复,即使是来自路由器而不是实际的主机。

如果你的主机可能出现这种情况,并且不想在输出文件中出现这样的错误提示,你需要解析 ping 的输出,寻找一些关键字来指示是否确实成功地进行了 ping。到目前为止,你可以依靠显示聚合统计信息的行:只有当回复来自预期的主机时,它们才会出现。

因此,这是另一种方法:

@ECHO OFF
SET output=%USERPROFILE%\output.txt
IF EXIST "%output%" DEL "%output%"
FOR /L %%G IN (1, 1, 69) DO (
    CALL :ping 192.168.%%G.3
    CALL :ping 192.168.%%G.4
)
GOTO :EOF

:ping
ping -n 1 %1 | find "Approximate round trip" >NUL && ECHO %1>>"%output%"

编辑2

为避免在for循环内过早地扩展%ip%,更改了两个解决方案以使用子程序调用。(也可以通过启用延迟扩展来修复。)

还在所有地方引用了%output%


-1
@echo off
:A
FOR /L %%G IN (1, 1, 69) DO (
    ping -n 1 192.168.%%G.3 
    ping -n 1 192.168.%%G.4
)
:GoTo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接