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