带时间戳的Ping


79

在Windows命令提示符下cmd,我使用ping -t to 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提供的命令来实现



Answers:


93
@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年1月8日 编辑:在更快/较新的机器/ OS的版本有在前面的代码的同步问题,使得set /p读出的线,同时ping命令还是书面方式它和结果是线切割。

@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"

pause子外壳程序的开头包含两个附加命令(只能使用一个,但由于pause消耗了输入字符,CRLF对被打断,并且读取了带有LF的行),以等待输入数据,并且ping -n 2 localhost包含a内循环中的每个读取都需要等待一秒钟。结果是行为更稳定,CPU使用率更低。

注意:内部ping可以用代替pause,但是每个读取的行的第一个字符由消耗,pause而没有由检索。set /p


6
@ Mr.SuicideSheep,这是一个批处理文件。如果要从命令行进行测试,请将所有双百分号(需要在批处理文件中转义)替换为单百分号。
MC ND 2014年

5
当我尝试使用它时,我最终在输出中出现换行符。它们通常出现在输出中的第52个字符之后。有什么想法吗?
瑞安

2
@AlexG,如果需要日期(原始问题未在所需输出中包含日期),请将echo命令更改为echo(!date! !time! !data!
MC ND

4
对ping无响应,所以我进行了Control + C,计算机变慢了,然后冻结了,然后出现了蓝屏
Dan

2
@丹,我想让BSOD运行此代码(丢弃硬件或驱动程序问题)的唯一方法是叉式炸弹。您是否已调用批处理文件ping.batping.cmd
MC ND

88

WindowsPowershell:

选项1

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

选项2

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

4
工作精美,没有其他建议的无限循环/最大CPU问题。
Serinus

测试连接-Count 9999 -ComputerName google.com | 格式表@ {Name ='TimeStamp'; Expression = {Get-Date}},Address,ProtocolAddress,ResponseTime | tee-文件C:\ Users \您的名字\ Desktop \ pingtest.txt -append
Serinus

简单明了的解决方案。首选对我
有用

如果要将选项2直接粘贴到PowerShell提示符中,则可以省略-ComputerName位,它将提示您输入ComputerNames列表(仅将第二个保留为空白)。 Test-Connection -Count 9999 | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime
mwfearnley

1
使用扩展上述选项> C:\temp\ping.txt会将输出重定向到文件。如果您还想查看实时输出,只需Get-Content C:\temp\ping.txt -tail 10 -wait在另一个PowerShell中执行即可。
弗兰德森

65

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

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

尽管它没有提供统计信息,但您通常会在最后点击^ C时获得。


4
这是迄今为止最好的
萨蒂什

2
完美地工作!
Shoaib Khan

4
如问题所问,这在Windows上不起作用。
Janos '18

3
在Windows的Linux子系统(WSL)(这是一项可选功能)下,此方法在Windows上运行良好。

1
我一直在尝试记录ping结果。date +%s显示整数时间戳更有用。
Himanshu Shekhar,

28

批处理脚本:

@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_ [hostname] .log,并写入与脚本相同的文件夹中。


一直说睡眠未被识别,但脚本运行良好。如何停止在cmd窗口中保持回显的结果,而仅继续进入日志文件?
allwynmasc

您应该将sleep.zip下载并解压缩到与执行批处理文件相同的文件夹。sleep命令强制脚本在每次ping之后等待1秒。如果没有它,“ ping”之间将不会暂停,您的日志文件将变得非常快。为了防止在cmd窗口中显示结果,您可以从脚本中删除“ echo”一词开头的最后一行
sabo-fx

@ sabo-fx有时“ sleep 1> NUL”不起作用(无法识别的命令),我使用了“ timeout 1> NUL”
Asprelis 2015年

@Asprelis:太好了。感谢小费。我没有意识到“超时”命令的存在。我同意使用操作系统随附的命令会更好。
sabo-fx

我测试了脚本。工作正常,但必须在set之后和/ p之前的3.行中添加一个空格。
mikia

10

这可能对某人有帮助:[需要在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

3
此解决方案与先前对此问题的回答中提供的解决方案相同。
Skomisa,

@skomisa:有点不同,因为它也保存到以后可以使用的文件中。
khalidmehmoodawan

5

在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

或作为pingt〜/ .bashrc的函数:

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

来源:https : //stackoverflow.com/a/26666549/1069083


1
在Mac上,-w是的无效选项ping
jorisw

3

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

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

注意:在命令行中使用的代码,并且您必须在os上预安装powershell。


谢谢...我可以将结果导出到文本文件吗?
塞勒姆·艾哈迈德

3

这可能适合更高版本的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:

这正是我要的!谢谢...工作完美。我得到了时间,然后逐行执行ping会得到预期的输出
Keith E. Truesdell,

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

1

使用

ping -D 8.8.8.8

从手册页

-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

不适用于Windows默认cmd或macOS。
朱利安

0

试试这个insted:

ping -c2 -s16 sdndn | awk'{print NR“ |” strftime(“%Y-%m-%d_%H:%M:%S”)“ |” $ 0}'VER QUE TE PARECE,OJALA Y TE SIRVA


1
佩尔多纳,coloqué“别名”,coloca ladirecciónIPen lugar de la cadena“ sntdn”,礼炮
JuanZR

0

另一种Powershell方法(我只想失败)

$ping = new-object System.Net.NetworkInformation.Ping
$target="192.168.0.1"
Write-Host "$(Get-Date -format 's') Start ping to $target"
while($true){
    $reply = $ping.send($target)
    if ($reply.status -eq "Success"){
        # ignore success    
        Start-Sleep -Seconds 1
    }
    else{
        Write-Host "$(Get-Date -format 's') Destination unreachable" $target

    }
}

0

我还需要它来监视网络问题,以解决数据库镜像超时问题。我使用以下命令代码:

ping -t Google.com|cmd /q /v /c "(pause&pause)>nul & for /l %a in () do (set /p "data=" && echo(!date! !time! !data!)&ping -n 2 Google.com>nul" >C:\pingtest.txt

您只需将Google.com修改为您的服务器名称。它非常适合我。并记得完成后停止此操作。pingtest.txt文件每分钟将增加4.5 KB(大约)。

感谢raymond.cc。https://www.raymond.cc/blog/timestamp-ping-with-hrping/


0

Windows中MC ND答案的增强。
我需要一个脚本在WinPE中运行,所以我做了以下工作:

@echo off
SET TARGET=192.168.1.1
IF "%~1" NEQ "" SET TARGET=%~1

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

可以将其硬编码为特定的IP地址(192.168.1.1在我的示例中),也可以采用传递的参数。就像MC ND的回答一样,大约每1秒重复一次ping。


0

简单😎:

@echo off

set hostName=www.stackoverflow.com
set logfile=C:\Users\Dell\Desktop\PING_LOG\NetworkLog\Log_%hostName%.text
echo Network Loging Running %hostName%...
echo Ping Log %hostName% >>%logfile%

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

0

不必ping -n 2 localhost在循环末尾添加其他字符,您只需在字符R之前添加,!data!因为唯一的可能性是Reply或Request。第一个字符从中使用pause>nul。因此,不用下面的表达式:

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

您可以使用以下表达式:

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

产生相同的输出,例如:

22:34:49.49 Reply from 172.217.4.46: bytes=4 time=14ms TTL=116
22:34:50.49 Reply from 172.217.4.46: bytes=4 time=14ms TTL=116
22:34:55.47 Request timed out.
22:34:56.49 Reply from 172.217.4.46: bytes=4 time=14ms TTL=116
22:34:57.49 Reply from 172.217.4.46: bytes=4 time=14ms TTL=116
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.