【问题标题】:How to get only the reply line of a ping test on Windows如何在 Windows 上仅获取 ping 测试的回复行
【发布时间】:2012-09-07 14:12:24
【问题描述】:

通常,在 ping 服务器 IP 地址时,我们会返回:

Pinging <IP address> with 32 bytes of data:
Reply from <ip> : bytes=32 time=151 TTL=121
Reply from <ip> : bytes=32 time=151 TTL=121
Reply from <ip> : bytes=32 time=151 TTL=121
Reply from <ip> : bytes=32 time=151 TTL=121

Ping statistics for <IP address>:
packets: sent = 4, Received = 4, lost = 0 (0% loss),
Approximate round trip times in milli-secounds:
Minimum = 151ms, Maximum = 151 ms, Average = 151 ms

如何通过 Windows 上的 cmd.exe 中的简单命令(无论使用哪种 Windows 语言)仅获取以下行(仅一个 ping 测试的回复行)?

Reply from <IP address> : bytes=32 time=151 TTL=121

也许最简单的方法是只显示第二行?这应该怎么做?因为我不知道如何在 Windows 上做到这一点。

【问题讨论】:

    标签: windows cmd ping


    【解决方案1】:

    这可能更普遍。

    ping -n 1 <hostname/IP> | FIND "TTL="
    

    【讨论】:

      【解决方案2】:

      由于某种原因,我无法让 FIND 管道在 powershell 5.1 shell 中工作。感觉这太复杂了,我想如果我能grep回复行?然后我找到了等效的powershell!我只是在匹配“回复”的第一行上使用了选择字符串,这给了我正在寻找的单行输出。所以这对我来说非常简单和容易。

      ping -n 1 <hostname/IP> | select-string -pattern 'Reply'
      

      【讨论】:

        【解决方案3】:

        您可以使用 powershell 完成此操作...这是您可以添加到脚本中的代码

        $ping = new-object System.Net.NetworkInformation.Ping
        $reply = $ping.send('127.0.0.1')
        if ($reply.status -eq "Success"){
            [string]::Format("Reply from {0},time={1}",$reply.Address.ToString(),$reply.RoundtripTime)
            }else{
            $z = [system.net.dns]::gethostaddresses($hostname)[0].ipaddresstostring
            [string]::Format("FAIL,{0},{1}",$z,"***")
        }
        

        您可以将字符串格式化为您想要的任何格式。

        【讨论】:

        • 那么,如果我理解得很好,就没有像在 Linux 上那样的直接命令吗?
        • 不是我所知道的......我过去曾成功使用过这个脚本 sn-p。
        【解决方案4】:

        嗯,

        ping -n 1 <hostname/IP>
        

        将仅发送 1 个 ping 请求。并且您应该能够使用FIND 命令找到回复行。

        所以,是这样的:

        ping -n 1 <hostname/IP> | FIND "Reply"
        

        更新

        我知道以上内容适用于英语、Windows 7 机器。我会假设它适用于其他本地化,但这可能是一个错误的假设。

        更新 2

        This question 似乎提供了一些见解。您可能必须将 ping 的输出写入文件(使用 &gt; 输出重定向管道),然后使用答案中的命令仅获取第二行。

        【讨论】:

        • 它不适用于所有版本的windows(那些与英语不同的语言)
        • 有趣,终端命令因本地化而异?这让我觉得很奇怪。
        • @ mjgpy3:是的。语言是个问题。因为当操作系统的语言改变时,windows ping 工具的结果也会改变。谷歌一下,你会发现我是对的。
        • 可能只显示 grep 答案的第二行?但我不知道如何在 cmd.exe 上制作它。
        • @mjgspy:我实际上正在寻找一个直接命令,就像我们在 Linux 上可以轻松完成的那样。我不想仅为 ping 创建文件。
        【解决方案5】:

        您可以将 findstr 命令与 for 的跳过行选项结合使用:

        C:\>ping 127.0.0.1 | for /f "skip=3 tokens=*" %a in ('findstr Reply') do @echo %a
        

        输出是:

        Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
        

        如果写入批处理文件,请将%a 更改为%%a

        【讨论】:

          【解决方案6】:

          在批处理中非常简单,但从命令行...丑陋是主要的轻描淡写:

          (for /f "skip=1 delims=" %F in ('ping -n 1 localhost') do @if not defined _A @echo %F&set _A=0) &set "_A="
          

          但它可以解决问题,打印第二行(无论它会包含什么)并跳过其余部分。您可以更改它打印的行更改skip=

          如果您有可用的 powershell,您可以简单地执行以下操作:(是的,我知道这不是在 PS 中应该如何执行 ping 操作):powershell "ping -n 1 localhost | select -index 2"。您可能需要使用索引,因为在我的(XP)笔记本电脑上,ping 在每一行中插入了额外的 CR,这具有从 PS 输出双倍间距的效果。

          【讨论】:

            【解决方案7】:

            基于@wmz 的回答,

            (for /f "skip=3 tokens=*" %F in ('ping -n 1 <hostname/IP>') do @if not defined _A @echo %F&set _A=0) &set "_A="
            

            可以作为一个不依赖于语言的单行。
            当没有给出响应(超时)时,它也会给出结果,而 find 和 findstr 不会。

            【讨论】:

              猜你喜欢
              • 2020-07-14
              • 1970-01-01
              • 2020-03-23
              • 1970-01-01
              • 1970-01-01
              • 2016-04-07
              • 1970-01-01
              • 2015-09-27
              • 1970-01-01
              相关资源
              最近更新 更多