13

通常,在 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 上做到这一点。

4

7 回答 7

22

这可能会更普遍。

ping -n 1 <hostname/IP> | FIND "TTL="
于 2013-05-27T15:55:59.563 回答
4

您可以将 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

于 2012-10-16T16:55:13.520 回答
3

出色地,

ping -n 1 <hostname/IP>

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

所以,像这样:

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

更新

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

更新 2

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

于 2012-09-07T14:22:20.360 回答
2

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

(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 输出双倍间距的效果。

于 2012-09-08T09:50:10.007 回答
1

基于@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 不会。

于 2012-10-26T16:26:16.817 回答
1

您可以使用 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,"***")
}

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

于 2012-09-07T15:03:21.967 回答
1

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

ping -n 1 <hostname/IP> | select-string -pattern 'Reply'
于 2019-09-11T15:13:39.760 回答