在Windows命令行界面下进行带时间戳的Ping测试

119
在Windows命令提示符(cmd)中,我使用ping -t 10.21.11.81命令。
Reply from 10.21.11.81: bytes=32 time=3889ms TTL=238
Reply from 10.21.11.81: bytes=32 time=3738ms TTL=238
Reply from 10.21.11.81: bytes=32 time=3379ms TTL=238

有没有可能获得这样的输出?
10:13:29.421875 Reply from 10.21.11.81: bytes=32 time=3889ms TTL=238
10:13:29.468750 Reply from 10.21.11.81: bytes=32 time=3738ms TTL=238
10:13:29.468751 Reply from 10.21.11.81: bytes=32 time=3379ms TTL=238

请注意,我希望只使用CMD提供的命令来实现这一点。

可能是重复的问题:如何为每个ping结果添加时间戳? - kaz
1
更通用的版本:https://dev59.com/THVD5IYBdhLWcg3wTZ1m - Anton Tarasenko
18个回答

145

Windows PowerShell:

选项1

ping.exe -t COMPUTERNAME|Foreach{"{0} - {1}" -f (Get-Date),$_}

option 2

Test-Connection -Count 9999 -ComputerName COMPUTERNAME | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime

4
工作得非常出色,没有其他建议中的无限循环/最大CPU问题。 - Serinus
1
Test-Connection -Count 9999 -ComputerName google.com | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime | tee -file C:\Users\yourname\Desktop\pingtest.txt -append - Serinus
简单明了的解决方案。第一个选项对我起作用了。 - Sree Harsha
如果您想将Option 2直接粘贴到PowerShell提示符中,可以省略-ComputerName部分,它会提示您输入计算机名称列表(只需将第二个留空)。Test-Connection -Count 9999 | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime - mwfearnley
1
如果 ping 请求超时,那么选项 1 胜过选项 2,因为选项 2 输出 PowerShell 异常而不是“请求超时”。 - flandersen
2
通过使用 > C:\temp\ping.txt 扩展上述选项,可以将输出重定向到文件。如果您想要同时查看实时输出,请在另一个 PowerShell 中执行 Get-Content C:\temp\ping.txt -tail 10 -wait - flandersen

110
@echo off
    ping -t localhost|find /v ""|cmd /q /v:on /c "for /l %%a in (0) do (set "data="&set /p "data="&if defined data echo(!time! !data!)" 

注意:以下代码适用于批处理文件。如果从命令行使用,请将%%a替换为%a

启动ping,强制正确的行缓冲输出(find /v),并启动一个启用延迟扩展的cmd进程,该进程将执行无限循环读取管道数据并将其打印到控制台,前缀为当前时间。

2015-01-08 编辑: 在更快/更新的机器/操作系统版本中,之前的代码存在同步问题,导致set /pping命令仍在写入时读取一行,结果是行被截断。

@echo off
    ping -t localhost|cmd /q /v /c "(pause&pause)>nul & for /l %%a in () do (set /p "data=" && echo(!time! !data!)&ping -n 2 localhost>nul"

在子shell的开头包含了两个额外的pause命令(只能使用一个),但由于pause会消耗一个输入字符,所以会打破CRLF对并读取一个带有LF的行)等待输入数据,并且包括ping -n 2 localhost来等待内部循环中每次读取一秒钟。结果是更稳定的行为和更少的CPU使用率。

注意:内部的ping可以替换为pause,但是这样每个读取行的第一个字符将被pause消耗而不会被set /p检索到。


10
@Mr.SuicideSheep,这是一个批处理文件。如果你想从命令行测试它,请将所有双百分号(在批处理文件中需要转义的符号)替换为单个百分号。 - MC ND
5
当我尝试使用它时,输出会出现断行。这种情况通常发生在输出的第52个字符之后。你有什么想法原因是什么? - Ryan
2
@AlexG,如果你需要日期(原始问题没有在期望输出中包含它),请将echo命令更改为echo(!date! !time! !data! - MC ND
4
无法ping通,于是我按下了Ctrl+C,计算机变得缓慢,最后死机并出现了蓝屏。 - Dan
2
@Dan,我能够想到的唯一导致此代码蓝屏(排除硬件或驱动程序问题)的方式是fork bomb。你是否将批处理文件命名为“ping.bat”或“ping.cmd”? - MC ND
显示剩余19条评论

76

你可以在Bash(例如Linux或WSL)中执行此操作:

ping 10.0.0.1 | while read line; do echo `date` - $line; done

尽管它不会提供通常在您按下^C时获得的统计数据。


4
到目前为止,这是最好的。 - Satish
2
完美运行! - Shoaib Khan
7
这在Windows上不起作用,正如问题中所问。 - Janos
4
在 Windows 操作系统下,通过 Windows Subsystem for Linux (WSL) 这个可选功能,这个方法可以正常运行。 - Lee
2
“-D 在每行代码前打印时间戳(Unix时间+微秒,如gettimeofday)。您可以更新此功能,现在Ping已内置此功能。” - NessDan
显示剩余2条评论

32

批处理脚本:

@echo off

set /p host=host Address: 
set logfile=Log_%host%.log

echo Target Host = %host% >%logfile%
for /f "tokens=*" %%A in ('ping %host% -n 1 ') do (echo %%A>>%logfile% && GOTO Ping)
:Ping
for /f "tokens=* skip=2" %%A in ('ping %host% -n 1 ') do (
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A>>%logfile%
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A
    timeout 1 >NUL 
    GOTO Ping)

这个脚本会询问要ping哪个主机。 Ping的输出结果将会显示在屏幕上和日志文件中。 日志文件示例输出:

Target Host = www.nu.nl
Pinging nu-nl.gslb.sanomaservices.nl [62.69.166.210] with 32 bytes of data: 
24-Aug-2015 13:17:42 Reply from 62.69.166.210: bytes=32 time=1ms TTL=250
24-Aug-2015 13:17:43 Reply from 62.69.166.210: bytes=32 time=1ms TTL=250
24-Aug-2015 13:17:44 Reply from 62.69.166.210: bytes=32 time=1ms TTL=250

日志文件名为LOG_[主机名].log,并写入与脚本相同的文件夹中。


你应该将sleep.zip下载并解压到与批处理文件执行的同一文件夹中。 “sleep”命令强制脚本在每个ping之后等待1秒钟。 如果没有这个命令,'pings'之间就没有暂停,你的日志文件会增长得非常快。 为了防止在cmd窗口中显示结果,您可以从脚本中删除以单词“echo”开头的最后一行 - sabo-fx
有时候 'sleep 1 >NUL' 不起作用(不被识别的命令),我使用了 'timeout 1 >NUL'。 - Asprelis
@Asprelis:太棒了。感谢你的提示。我之前不知道存在“timeout”命令。我同意使用包含在操作系统中的命令更好。 - sabo-fx
我测试了脚本。工作正常,但是你必须在第三行的set和/p之间添加一个空格字符。 - mikia
1
到了2022年7月,它仍然在Windows 10上完美运行,没有任何修改。 - Jayakumari Arumugham
显示剩余6条评论

26
这可能会对某些人有帮助:[需在Windows PowerShell中运行]
ping.exe -t 10.227.23.241 |Foreach{"{0} - {1}" -f (Get-Date),$_} >> Ping_IP.txt

--检查当前目录或用户主路径中是否存在Ping_IP.txt文件。

上述命令将在类似以下的文件中输出结果;

9/14/2018 8:58:48 AM - Pinging 10.227.23.241 with 32 bytes of data:
9/14/2018 8:58:48 AM - Reply from 10.227.23.241: bytes=32 time=29ms TTL=117
9/14/2018 8:58:49 AM - Reply from 10.227.23.241: bytes=32 time=29ms TTL=117
9/14/2018 8:58:50 AM - Reply from 10.227.23.241: bytes=32 time=28ms TTL=117
9/14/2018 8:58:51 AM - Reply from 10.227.23.241: bytes=32 time=27ms TTL=117
9/14/2018 8:58:52 AM - Reply from 10.227.23.241: bytes=32 time=28ms TTL=117
9/14/2018 8:58:53 AM - Reply from 10.227.23.241: bytes=32 time=27ms TTL=117
9/14/2018 8:58:54 AM - Reply from 10.227.23.241: bytes=32 time=28ms TTL=117

祝好运!!!


5
这个解决方案与此问题的早期答案提供的解决方案相同。 - skomisa
1
@skomisa:这有点不同,因为它还保存到文件中以供以后使用。 - khalidmehmoodawan

7
这可能适用于较新版本的Windows:
结果:

这可能适用于较新版本的Windows:

for /l %i in (1,0,2) do @echo|cmd /v:on /c set /p=!time! & ping -n 1 10.21.11.81 | findstr "Reply timed" && timeout /t 2 > nul:

1
这正是我所寻找的!谢谢...完美地运作。 我逐行获取时间,然后输出我期望从ping命令中得到的结果。 - Keith E. Truesdell
你帮我节省了时间,谢谢兄弟。 - Peternak Kode Channel
这个时间是从服务器还是从客户端获取的? - Peternak Kode Channel

6

在Windows上

你可以使用其他答案中的任意一种方法。

在Unix/Linux上

while :;do ping -n -w1 -W1 -c1 10.21.11.81| grep -E "rtt|100%"| sed -e "s/^/`date` /g"; sleep 1; done

或者在你的 ~/.bashrc 中添加以下函数 pingt:

pingt() {
  while :;do ping -n -w1 -W1 -c1 $1| grep -E "rtt|100%"| sed -e "s/^/`date` /g"; sleep 1; done
}

来源:https://dev59.com/zmgv5IYBdhLWcg3wVPTU#26666549

当我们谈论IT技术时,有一个常用的词汇是“系统架构”,它指的是软件或计算机系统中各个组件之间的关系和交互方式。在一个良好设计的系统架构中,各个组件应该紧密协作,同时又能够独立运行和维护。

对于一个复杂的系统而言,系统架构的设计尤为重要。因为不同的组件可能由不同的团队开发,如果没有一个清晰的架构规划,就很容易出现各种问题,比如组件之间的冲突、数据共享的困难等等。

因此,在进行IT项目开发时,系统架构的设计是非常重要的一步。需要考虑到系统的可扩展性、可维护性、安全性、性能等方面,以确保系统能够稳定高效地运行。


1
在Mac上,-wping命令的无效选项。 - jorisw

5

我认为我的代码是每个人都需要的:


ping -w 5000 -t -l 4000 -4 localhost|cmd /q /v /c "(pause&pause)>nul &for /l %a in () do (for /f "delims=*" %a in ('powershell get-date -format "{ddd dd-MMM-yyyy HH:mm:ss}"') do (set datax=%a) && set /p "data=" && echo([!datax!] - !data!)&ping -n 2 localhost>nul"

显示:

[Fri 09-Feb-2018 11:55:03] - Pinging localhost [127.0.0.1] with 4000 bytes of data:
[Fri 09-Feb-2018 11:55:05] - Reply from 127.0.0.1: bytes=4000 time<1ms TTL=128
[Fri 09-Feb-2018 11:55:08] - Reply from 127.0.0.1: bytes=4000 time<1ms TTL=128
[Fri 09-Feb-2018 11:55:11] - Reply from 127.0.0.1: bytes=4000 time<1ms TTL=128
[Fri 09-Feb-2018 11:55:13] - Reply from 127.0.0.1: bytes=4000 time<1ms TTL=128
< p > < em > 注意 :该代码用于命令行内,您必须在操作系统上预先安装PowerShell。

2

请尝试以下步骤:

创建一个批处理文件,包含以下内容:

echo off

cd\

:start

echo %time% >> c:\somedirectory\pinghostname.txt

ping pinghostname >> c:\somedirectory\pinghostname.txt

goto start

你可以根据自己的需求添加选项到ping命令中。这样虽然不能将时间戳放在与ping相同的行中,但仍可获得所需信息。
更好的方法是使用fping,点击http://www.kwakkelflap.com/fping.html进行下载。

那个链接现在显示404错误。 - Hicsy

2

使用

ping -D 8.8.8.8

从 man 页面

-D     Print timestamp (unix time + microseconds as in gettimeofday) before each line

输出

[1593014142.306704] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=120 time=13.7 ms
[1593014143.307690] 64 bytes from 8.8.8.8: icmp_seq=3 ttl=120 time=13.8 ms
[1593014144.310229] 64 bytes from 8.8.8.8: icmp_seq=4 ttl=120 time=14.3 ms
[1593014145.311144] 64 bytes from 8.8.8.8: icmp_seq=5 ttl=120 time=14.2 ms
[1593014146.312641] 64 bytes from 8.8.8.8: icmp_seq=6 ttl=120 time=14.8 ms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接