如何在Windows上只获得ping测试的回复行



通常,当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(无论使用何种Windows语言)上通过cmd.exe中的简单命令仅返回以下行(仅一次ping测试的回复行)?

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

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

这可能更通用。

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

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

好吧,

ping -n 1 <hostname/IP>

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

所以,像这样的东西:

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

更新

我知道上面的工作在一台英语的Windows7机器上。我认为它适用于其他本地化,但这可能是一个错误的假设。

更新2

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

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

您可以将字符串格式化为所需的任何格式。

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

(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中不应该这样做):powershell "ping -n 1 localhost | select -index 2"。你可能需要玩索引,就像在我的(XP)笔记本电脑上一样,ping在每行中插入额外的CR,这有一个从PS输出双倍间距的效果。

由于某些原因,我无法使FIND管道在powershell 5.1 shell中工作。感觉这一切都太复杂了,我想如果我能删掉回复行就好了吗?然后我找到了powershell的等价物!我只是在第一行使用了与"回复"匹配的选择字符串,这给了我想要的一行输出。所以这对我来说非常简单

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

基于@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="

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

最新更新