Как насчет этого, чтобы автоматически получить шлюз, а затем пропинговать диапазон от 1 до 254? Видя, что у вас есть и шлюзы IPv4
и IPv6
, мы делаем это, используя wmic
:
@echo off
type nul >up.txt
type nul >down.txt
for /f "tokens=2,3 delims={,}" %%a in ('"wmic nicconfig where IPEnabled="True" get DefaultIPGateway /value | find "I" "') do (
for /f "tokens=1-3 delims=^." %%i in ("%%~a") do (
for /l %%l in (1,1,254) do (
ping -4 -w 1000 -n 1 %%i.%%j.%%k.%%l | findstr "bytes=32"
if errorlevel 1 (echo %%i.%%j.%%k.%%l DOWN >> DOWN.txt) else (echo %%i.%%j.%%k.%%l ACTIVE >> ACTIVE.txt)
)
)
)
Я использую findstr
в команде ping для поиска bytes=32
, так как это единственный индикатор, который действительно показывает, что он получил ответ. Причина этого в том, что если вы получаете Destination host unreachable
, он по-прежнему дает потерю пакета 0, а байты 32 существуют только в реальном ответе от хоста.
Совет !! В зависимости от качества вашей сети и расстояния между компьютерами в локальной сети и в зависимости от того, насколько заняты ваши маршрутизаторы и коммутаторы, я бы предложил вместо этого увеличить значение до -w 1500
. В настоящее время, если устройство работает и для ответа требуется более 1000 мс, оно будет отправлено в файл DOWN.txt. Причина в том, что ICMP
является протоколом диагностики и не получает приоритет. Устройство может быть на расстоянии одного шага, но если оно очень занято обработкой приоритетного трафика, оно отбросит ваши ICMP-пакеты или вызовет огромные задержки в ответе.