Пинг с отметкой времени в Windows CLI


80

В командной строке 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.



Ответы:


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

примечание : код для использования внутри командного файла. Чтобы использовать из командной строки, замените %%aна%a

Запустите эхо-запрос, принудительно установите правильный строковый буферизованный вывод ( find /v) и запустите cmdпроцесс с включенным отложенным расширением, который будет выполнять бесконечный цикл чтения передаваемых по конвейеру данных, которые будут отображаться на консоль с префиксом текущего времени.

2015-01-08 отредактировано : В более быстрых / новых машинах / версиях ОС существует проблема синхронизации в предыдущем коде, что заставляет 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в подождите секунду для каждого чтения во внутреннем цикле. Результат - более стабильное поведение и меньшая загрузка ЦП.

ПРИМЕЧАНИЕ. Внутренний pingэлемент можно заменить на a pause, но тогда первый символ каждой прочитанной строки будет поглощен pauseи не полученset /p


7
@ Mr.SuicideSheep, это командный файл. Если вы хотите проверить это из командной строки, замените все двойные знаки процента (которые необходимо экранировать внутри пакетных файлов) одинарными знаками процента.
MC ND

5
Когда я пытаюсь использовать это, я получаю разрывы строк на выходе. Обычно они появляются после 52-го символа в выводе. Есть мысли, почему?
Райан

2
@AlexG, если вам нужна дата (исходный вопрос не включал ее в желаемый результат), измените echoкоманду наecho(!date! !time! !data!
MC ND

4
нет ответа на пинг, поэтому я нажал кнопку + C, и компьютер стал медленным, заморозил, затем синий экран
Дэн

2
@Dan, единственный способ заставить BSOD запустить этот код (отбросить проблемы с hw или драйверами) - это бомба вилки. Вы назвали свой батник ping.batили ping.cmd?
MC ND

92

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
Работает красиво, без каких-либо проблем с бесконечным циклом / максимальным количеством ЦП, как в других предложениях.
Серинус

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

Если вы хотите вставить вариант 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.
flandersen

68

Вы можете сделать это в Bash (например, Linux или WSL):

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

Хотя он не дает той статистики, которую вы обычно получаете, нажимая ^ C в конце.


4
Пока что это лучший
Satish

2
Работает отлично !!
Shoaib Khan

4
Это НЕ работает в Windows, как было задано в вопросе.
Янош

3
Это отлично работает в Windows в подсистеме Windows для Linux (WSL), которая является дополнительной функцией.
Ли

1
Я пытался зарегистрировать результаты пинга. date +%sболее полезен, поскольку показывает целочисленные временные метки.
Химаншу Шекхар

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 выводится на экран и в файл журнала. Пример вывода файла журнала:

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 и записывается в ту же папку, что и сценарий.


продолжает говорить, что сон не распознается, но сценарий работает нормально. Как мне остановить результат от повторения эха в окне cmd и просто продолжать переход только в файл журнала?
allwynmasc

Вы должны скачать и распаковать sleep.zip в ту же папку, откуда вы запускаете командный файл. Команда сна заставляет скрипт ждать 1 секунду после каждого эхо-запроса. Без него не будет паузы между «пингами», и ваш лог-файл будет расти очень быстро. Чтобы предотвратить отображение результатов в окне cmd, вы можете удалить последнюю строку из скрипта, которая начинается со слова «echo»
sabo-fx

@ sabo-fx иногда 'sleep 1> NUL' не работает (не распознанная команда), я использовал 'timeout 1> NUL'
Asprelis

@Asprelis: Это круто. Спасибо за чаевые. Я не знал о существовании команды "тайм-аут". Я согласен с тем, что гораздо приятнее использовать команды, включенные в ОС.
sabo-fx

Я проверил сценарий. Работает нормально, но вы должны добавить один пробел в 3. строку после set и до / p.
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

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

Или как функция 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

примечание : код, который будет использоваться внутри командной строки, и у вас должен быть предварительно установлен powershell в os.


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:

это именно то, что я ищу! спасибо ... работает отлично. я получаю время, а затем результат, который я ожидал бы от пинга построчно
Кейт Э. Трусделл,

2

Попробуй это:

Создайте командный файл со следующим:

echo off

cd\

:start

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

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

goto start

Вы можете добавить свои собственные параметры к команде 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

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 КБ в минуту (примерно).

Спасибо за raymond.cc. https://www.raymond.cc/blog/timestamp-ping-with-hrping/


0

Усовершенствованный ответ MC ND для Windows.
Мне нужен был сценарий для запуска в 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 секунду.


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!поскольку единственные возможности - это Ответ или Запрос. Первый символ потребляется из 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

0

Попробуйте вместо этого:

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

Проверь, подходит ли тебе


1
Perdona, coloqué "un alias de servidor" coloca la direcciónIP en lugar de la cadena "sntdn", saludos
JuanZR
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.