【问题标题】:Batch file - loop ping - output to file hosts that are up批处理文件 - 循环 ping - 输出到已启动的文件主机
【发布时间】:2011-06-29 13:44:16
【问题描述】:

我想制作一个 .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 批处理文件可以做到这一点吗?

【问题讨论】:

    标签: batch-file for-loop cmd ping


    【解决方案1】:
    @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

    将两种解决方案都更改为使用子例程调用,以避免%ip%for 循环内过早扩展。 (也可以通过启用延迟扩展来解决。)

    还到处引用%output%

    【讨论】:

    • 伟大的安德烈!非常感谢您的帮助。
    【解决方案2】:
    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-21
      • 2013-08-27
      相关资源
      最近更新 更多