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