Мне нужно запустить ping с параметром -t и обработать каждую строку в сценарии bat. Мне нужно делать это в реальном времени.
Этот код объясняет мою проблему. Командный 'ping -t 8.8.8.8' ничего не выводит в цикл for, поэтому на консоль ничего не выводится. Если я использую ping -n 10 8.8.8.8, все строки печатаются одновременно при выходе ping.
Как я могу получить печатные строки в реальном цикле for?
@echo off
Setlocal EnableDelayedExpansion
FOR /f "TOKENS=*" %%i in ('ping -t 8.8.8.8') do (
set LINE=%%i
echo !LINE!
)
Как указано в комментариях; в FOR
команда не может обрабатывать текущий вывод; он обрабатывает набор данных после завершения процесса.
Вам нужно будет производить только один набор выходных данных за выполнение ping, чтобы иметь возможность фиксировать каждый результат. Вам также необходимо ограничить набор результатов только результатом проверки связи и игнорировать другие строки.
Команда find вернет только результаты, содержащие проверенный адрес (здесь необходимо использовать IP-адрес)
В SKIP
опция будет обходить первую строку, возвращаемую Ping
со ссылкой на IP-адрес.
В теле For
вы сохраните токены во временных переменных для обработки вне For
петля.
Goto :l_Break_Loop
будет для цикла принимать только одну строку вывода из Ping
и перейдите в раздел обработки данных.
Впоследствии Goto :l_Start_Loop
направит командный файл в начало цикла для другой строки данных проверки связи.
@echo off
Setlocal EnableDelayedExpansion
:l_Start_Loop
FOR /f "SKIP=1 TOKENS=*" %%i in ('ping -n 1 8.8.8.8 2^>&1 ^| Find /i "8.8.8.8"') do (
set LINE=%%i
echo !LINE!
Goto :l_Break_Loop
)
:l_Break_Loop
REM Start processing data retrieved from ping result
REM End processing data retrieved from ping result
Goto :l_Start_Loop
Вы можете использовать функции таймера, чтобы установить задержку между попытками проверки связи, а также с помощью некоторых манипуляций над %TIME%
переменную, вы даже можете заставить команду ping запускаться через равные промежутки времени, если задержка превышает время, необходимое для проверки связи и обработки результатов.
%TIME:~-8,2%
возвращает минуты
%TIME:~-5,2%
возвращает секунды
%TIME:~-2%
возвращает сотые доли секунды