批处理文件 - 循环ping - 输出到已启动的文件主机

时间:2011-02-18 03:40:54

标签: batch-file for-loop cmd ping

我想创建一个.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 个答案:

答案 0 :(得分: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%"

基本上,您使用&&添加仅在前一个命令(&&之前的命令)成功完成时执行的命令(从技术上讲,返回{{1}的退出代码})。

对于相反的情况,有一种类似的方法。如果要对命令的不成功结果执行某些操作,请在其后面添加0,然后执行执行操作的命令。

修改

关于||的一个注释。有时您会从路由器收到主机无法访问的通知。在这种情况下,ping仍会以ping代码('成功')退出,因为它确实会收到回复,即使它来自路由器而不是来自实际主机。

如果您的主机可能出现这种情况,并且您不希望在输出文件中出现此类误报,则必须解析0的输出,以获取指示ping是否为确实成功了。到目前为止,您可以依赖显示聚合统计数据的行:它们仅在回复来自预期主机时出现。

所以,这是替代方法:

ping

编辑2

更改了两个解决方案以使用子例程调用,以避免在@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%" 循环内过早扩展%ip%。 (也可以通过启用延迟扩展来修复。)

在任何地方也引用了for

答案 1 :(得分:-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