Задать вопрос

Как добавить отметку времени в выводе команды ping?

Появилась задача отображать время при выводе результата команды ping. В интернете сразу же нашлось решение
ping -t 8.8.8.8 | cmd /q /v /c "(pause&pause)>nul & for /l %a in () do (set /p "data=" && echo(!date! !time! !data!)&ping -n 2 8.8.8.8>nul"

но как работает этот однострочник не могу разобраться.

1. Как работает эта часть кода (pause&pause)>nul
2. Как работает эта частьset /p "data=" && echo(!date! !time! !data!)
  • Вопрос задан
  • 2845 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
wisgest
@wisgest
Не ИТ-специалист
Вывод команды ping перенаправляется на вход сложной команды.

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

1. Как работает эта часть кода (pause&pause)>nul

Пропускаются две первые строки из входного потока принимающего процесса:
pause ожидает ввод от пользователя и, когда на её вход поступает строка, прекращает ждать, >nul подавляет (перенаправляет на пустое устройство) приглашение от pause нажать любую клавишу (в данном случае подавляется весь вывод составной команды, состоящей из двух pause).

Вместо этого можно было без >nul использовать, например, две команды set /p, даже и не указывая перед знаком равенства имя переменной, в которую вводится строка.

Добавлено: Как выяснилось при обсуждении вопроса, дело обстоит сложнее…

2. Как работает эта часть set /p "data=" && echo(!date! !time! !data!)

Очередная строка из входного потока вспомогательного процесса cmd, то есть из выходного потока ping, помещается (set /p) в переменную окружения data и в случае успеха (&&), за который считается то, что была введена непустая строка (иначе переменная окружения не изменяется), выполняется следующая команда echo, выводящая строку из разделённых пробелами псевдопеременных date, time и только что установленной переменной data.
Псевдопеременные date иtime содержат текущие дату и время, но только если не определены одноименные переменные окружения, поэтому для учёта всех возможных случаев их следовало бы в начале явным образом сбросить.

Имена переменных заключены в восклицательные знаки, а не знаки процента, для отложенного раскрытия изменяющихся переменных в команде повторения (цикле) , а не однократной подстановки их значений до выполнения цикла. Возможность использовать отложенное раскрытие в данном случае включается ключом /v команды cmd. (Возможно также для отложенного раскрытия использовать команду call…)

Открывающая скобка сразу после echo — это не открывающая скобка составной команды, а разделитель между командой echo и её аргументом, а закрывающая скобка относится к составной команде в цикле for /l %a in () do.

Зачем нужна команда ping -n 2 8.8.8.8>nul после бесконечного цикла, я не знаю и буду рад увидеть разъяснения этому.
Добавлено: Но без неё изменяется формат вывода:
7.10.2022 21:47:58,02 Ответ от 8.8.8.8:
7.10.2022 21:47:58,04 число байт=32 время=244мс TTL=104
7.10.2022 21:47:59,04 Ответ от 8.8.8.8:
7.10.2022 21:47:59,04 число байт=32 время=240мс TTL=104
7.10.2022 21:48:00,05 Ответ от 8.8.8.8:
7.10.2022 21:48:00,05 число байт=32 время=233мс TTL=104


Спасибо за интересный вопрос!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы