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

时间:2012-09-07 14:12:24

标签: windows cmd 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上的cmd.exe中的简单命令(无论使用何种Windows语言)获取以下行(仅一个ping测试的回复行)?

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

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

7 个答案:

答案 0 :(得分:18)

这可能更普遍。

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

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

答案 2 :(得分:3)

那么,

ping -n 1 <hostname/IP>

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

所以,像这样:

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

<强>更新

我知道以上工作在英语,Windows 7机器上。我认为它适用于其他本地化,但这可能是一个不正确的假设。

更新2

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

答案 3 :(得分: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中插入每行的addtional CR,这具有PS的双倍间距输出的效果。

答案 4 :(得分: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,"***")
}

您可以使用任何所需格式设置字符串格式。

答案 5 :(得分: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="

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

答案 6 :(得分:0)

由于某种原因,我无法使FIND管道在Powershell 5.1 Shell中工作。这样的感觉太过复杂了,我想如果我能grep回复行吗?然后,我发现了Powershell等效产品!我只是在与“ Reply”匹配的第一行上使用了选择字符串,这给了我所要的一行输出。因此,这对我来说非常简单易行。

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