Hacer ping con marca de tiempo en la CLI de Windows

80

En el símbolo del sistema de Windows cmd, usoping -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

¿Hay alguna posibilidad de obtener un resultado como este?

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

Tenga en cuenta que quiero lograr esto solo con los comandos proporcionados por CMD

SuicidioOvejas
fuente
Una versión más genérica: stackoverflow.com/questions/21564/…
Anton Tarasenko

Respuestas:

95
@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!)" 

nota : código que se utilizará dentro de un archivo por lotes. Para usar desde la línea de comando, reemplace %%acon%a

Inicie el ping, fuerce una salida de búfer de línea correcta ( find /v) e inicie un cmdproceso con la expansión retardada habilitada que hará un bucle infinito leyendo los datos canalizados que se repetirán en la consola con el prefijo de la hora actual.

2015-01-08 editado : En las versiones más rápidas / nuevas de máquinas / sistemas operativos hay un problema de sincronización en el código anterior, lo que hace que la set /plectura sea una línea mientras el pingcomando aún la está escribiendo y el resultado son cortes de línea.

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

Se pauseincluyen dos comandos adicionales al comienzo de la subcapa (solo se puede usar uno, pero como pauseconsume un carácter de entrada, se rompe un par CRLF y se lee una línea con un LF) para esperar los datos de entrada, y ping -n 2 localhostse incluye un para espere un segundo por cada lectura en el bucle interno. El resultado es un comportamiento más estable y menos uso de CPU.

NOTA: El interior pingse puede reemplazar con a pause, pero luego el primer carácter de cada línea leída es consumido por el pausey no recuperado por elset /p

MC ND
fuente
7
@ Mr.SuicideSheep, este es un archivo por lotes. Si desea probarlo desde la línea de comandos, reemplace todos los signos de porcentaje dobles (que deben escaparse dentro de los archivos por lotes) con signos de porcentaje único.
MC ND
5
Cuando trato de usar esto, termino obteniendo saltos de línea en la salida. Aparecen rutinariamente después del carácter 52 en la salida. ¿Alguna idea de por qué?
Ryan
2
@AlexG, si necesita la fecha (la pregunta original no la incluyó en la salida deseada), cambie el echocomando aecho(!date! !time! !data!
MC ND
4
no hubo respuesta en el ping, así que controlé + C y la computadora se volvió lenta, se congeló y luego la pantalla azul
Dan
2
@Dan, la única forma en que puedo pensar para obtener un BSOD que ejecute este código (descartando hw o problemas con el controlador) es una bomba de horquilla. ¿Ha llamado a su archivo por lotes ping.bato ping.cmd?
MC ND
91

WindowsPowershell:

Opción 1

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

opcion 2

Test-Connection -Count 9999 -ComputerName COMPUTERNAME | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime
Hames
fuente
4
Funcionó a la perfección sin ninguno de los problemas de CPU de bucle infinito / máximo de las otras sugerencias.
Serinus
1
Prueba-Conexión -Cuenta 9999 -ComputerName google.com | Format-Table @ {Name = 'TimeStamp'; Expression = {Get-Date}}, Address, ProtocolAddress, ResponseTime | tee -file C: \ Users \ yourname \ Desktop \ pingtest.txt -append
Serinus
solución simple y nítida. La primera opción funcionó para mí
Sree Harsha
Si desea pegar la Opción 2 directamente en un indicador de PowerShell, puede omitir el bit -ComputerName, y le pedirá una lista de ComputerNames (simplemente deje el segundo en blanco). Test-Connection -Count 9999 | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime
mwfearnley
1
Ampliar las opciones anteriores con > C:\temp\ping.txtredirige la salida a un archivo. Si también desea ver la salida en vivo, simplemente ejecute Get-Content C:\temp\ping.txt -tail 10 -waiten otro PowerShell.
flandersen
68

Puede hacer esto en Bash (por ejemplo, Linux o WSL):

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

Aunque no proporciona las estadísticas que normalmente obtiene cuando pulsa ^ C al final.

Sam Critchley
fuente
4
Esto es lo mejor hasta ahora
Sábado
2
Funciona perfectamente !!
Shoaib Khan
4
Esto NO funciona en Windows, como se hizo en la pregunta.
Janos
3
Esto funciona bien en Windows, en el Subsistema de Windows para Linux (WSL), que es una característica opcional.
Lee
1
Había estado intentando registrar los resultados del ping. date +%ses más útil ya que muestra marcas de tiempo enteras.
Himanshu Shekhar
28

Secuencia de comandos por lotes:

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

Este script preguntará por qué host hacer ping. La salida de ping se envía a la pantalla y al archivo de registro. Salida de archivo de registro de ejemplo:

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

El archivo de registro se denomina LOG_ [nombre de host] .log y se escribe en la misma carpeta que el script.

sabo-fx
fuente
sigue diciendo que no se reconoce el sueño, pero el guión funciona bien. ¿Cómo evito que el resultado siga repitiendo en la ventana de cmd y sigo yendo solo al archivo de registro?
allwynmasc
Debe descargar y extraer sleep.zip en la misma carpeta desde donde ejecuta el archivo por lotes. El comando sleep obliga al script a esperar 1 segundo después de cada ping. Sin él, no hay pausa entre 'pings' y su archivo de registro crecerá muy rápido. Para evitar que se muestren resultados en la ventana de cmd, puede eliminar la última línea del script que comienza con la palabra "echo"
sabo-fx
@ sabo-fx a veces 'sleep 1> NUL' no funciona (comando no reconocido), utilicé 'timeout 1> NUL'
Asprelis
@Asprelis: Eso es increíble. Gracias por la propina. No tenía conocimiento de la existencia del comando "timeout". Estoy de acuerdo en que es mucho más agradable usar los comandos que se incluyen con el sistema operativo.
sabo-fx
Probé el guión. Funciona bien, pero debe agregar un carácter de espacio en 3. línea después del conjunto y antes de / p.
mikia
10

Esto podría ayudar a alguien: [Debe ejecutarse en Windows PowerShell]

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

- Busque el archivo Ping_IP.txt en el directorio actual o en la ruta de inicio del usuario.

El comando anterior le brinda la salida en un archivo como el siguiente;

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
khalidmehmoodawan
fuente
3
Esta solución es idéntica a la proporcionada en una respuesta anterior a esta pregunta .
skomisa
@skomisa: es un poco diferente ya que también se guarda en un archivo que se puede usar más tarde.
khalidmehmoodawan
6

En Windows

Puede utilizar una de las otras respuestas.

En 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

O como función pingtpara su ~ / .bashrc:

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

fuente: https://stackoverflow.com/a/26666549/1069083

rubo77
fuente
1
En Mac, -wes una opción no válida para ping.
jorisw
3

Creo que mi código es lo que todos necesitan:

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"

para mostrar:

[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

nota : código que se utilizará dentro de una línea de comando, y debe tener PowerShell preinstalado en el sistema operativo.

Valor eldar
fuente
3

Esto podría ajustarse a la factura de las versiones posteriores de 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:
mlarss
fuente
¡esto es exactamente lo que estoy buscando! gracias ... funciona perfectamente. obtengo la hora y luego la salida que esperaría de un ping línea por línea
Keith E. Truesdell
2

Prueba esto:

Cree un archivo por lotes con lo siguiente:

echo off

cd\

:start

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

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

goto start

Puede agregar sus propias opciones al comando ping según sus requisitos. Esto no coloca la marca de tiempo en la misma línea que el ping, pero aún le brinda la información que necesita.

Una forma aún mejor es usar fping, vaya aquí http://www.kwakkelflap.com/fping.html para descargarlo.

jjrab
fuente
404 en ese enlace ahora
Hicsy
1

Utilizar

ping -D 8.8.8.8

Desde la página del manual

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

Salida

[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
Nerrve
fuente
0

Otro método de PowerShell (solo quería fallas)

$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

    }
}
Chris Richardson
fuente
0

También necesito esto para monitorear el problema de red para mi problema de tiempo de espera de duplicación de base de datos. Utilizo el código de comando de la siguiente manera:

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

Solo necesita modificar Google.com a su nombre de servidor. Funciona perfectamente para mí. y recuerde detener esto cuando termine. El archivo pingtest.txt aumentará en 4,5 KB por minuto (aproximadamente).

Gracias por raymond.cc. https://www.raymond.cc/blog/timestamp-ping-with-hrping/

DBALUKE HUANG
fuente
0

Una mejora de la respuesta de MC ND para Windows.
Necesitaba un script para ejecutar en WinPE, así que hice lo siguiente:

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

Esto se puede codificar en una dirección IP en particular ( 192.168.1.1en mi ejemplo) o tomar un parámetro pasado. Y como en la respuesta de MC ND, repite el ping aproximadamente cada 1 segundo.

Mike Schlueter
fuente
0

Simple 😎:

@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)
Thrainder
fuente
0

En lugar de tener el adicional ping -n 2 localhostal final del ciclo, puede simplemente agregar el carácter R antes, !data!ya que las únicas posibilidades son Responder o Solicitar. El primer carácter se consume del pause>nul. Entonces, en lugar de tener la siguiente expresión:

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"

Puedes usar esta expresión:

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"

Que produce la misma salida, por ejemplo:

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
Vorpal56
fuente
0

Prueba esto en su lugar:

ping -c2 -s16 sntdn | awk '{print NR " | " strftime("%Y-%m-%d_%H:%M:%S") " | " $0  }'

Comprueba si te conviene

JuanZR
fuente
1
Perdona, coloqué "un alias de servidor" coloca la direcciónIP en lugar de la cadena "sntdn", saludos
JuanZR